如何从字符串中删除空字符(零字符)

3

我一直在尝试从我的字符串中移除所有的零字符。

我的字符串由这些十六进制字节组成:

00 44 00 65 00 6C 00 70 00 68 00 69

对于每个字母,它前面都有一个零字节(空字节)。。我猜想我必须使用某种 Unicode 编码或宽编码才能获得没有这些零的文本。

但我还是无法找到方法,所以我认为最好的方式是使用 Replace,但即使这样也失败了。

Dim packet() As String = {&H0, &H44, &H0, &H65, &H0, &H6C, &H0, &H70, &H0, &H68, &H0, &H69}
Dim str As String = Encoding.ASCII.GetString(packet, 0, 12)
str = str.Replace("\0", "")  'Compiles and fails
str = str.Replace(\0, "")  'No compile
str = str.Replace('\0', "")  'No compile

它失败的原因是VB不在字符串中使用/识别转义字符。这显然是为了避免像“C:\MyTemp\SomeFile.Ext”这样的事情。 - Ňɏssa Pøngjǣrdenlarp
3个回答

8

1
或者简单地写成 str = str.Replace(Char.MinValue, "") - Bjørn-Roger Kringsjå
3
这个答案是错误的。它只是暂时解决了问题,却没有解决根本原因——错误的“编码”被用来将字节转换成“字符串”。修正编码,就不再需要使用这种替代方法了。 - Remy Lebeau

5
实际问题并不在于空字节,而是你在第一次解码字节为字符串时的方式。你使用了错误的编码方式,应该使用 Encoding.BigEndianUnicode 而非 Encoding.ASCII,这样就无需手动替换空字节,因为它们会被解码过程自动处理。
Dim packet() As Byte = {&H0, &H44, &H0, &H65, &H0, &H6C, &H0, &H70, &H0, &H68, &H0, &H69}
Dim str As String = Encoding.BigEndianUnicode.GetString(packet)

完美的,我知道它是Unicode,但我不知道为什么它不起作用。就是这个。 - SSpoke
在微软的.NET基类库(以及许多微软的工作中),“Unicode”不仅指字符集,而且(深奥地)指Unicode字符集的UTF-16编码。Remy指出,UTF-16有一个字节顺序需要考虑。(相比之下,还有其他Unicode编码方式。UTF-8非常流行,事实上,它是.NET文件流的默认编码方式。) - Tom Blodget
2
特别是,微软在所有地方都使用UTF-16 小端(即Encoding.Unicode使用的方式)。但是一些协议/平台使用大端,因此也提供了Encoding.BigEndianUnicode - Remy Lebeau

4

问题已解决

 str = str.Replace(vbNullChar, "")

仍在寻找一种使用内置函数而不依赖于 Replace 函数来完成此操作的方法


2
如果“Replace”不是“内置”的,那它是什么? - Matt Wilko
替换是内置于Visual Basic.NET版本的,您只需键入一个.点,它就会显示您可以使用的可能命令列表。是的,在Visual Basic 6中,您只需使用 Replace(str,“Hi”,“Bye”)也是内置的。糟糕,哈哈,我读错了自己的答案。在我看来,仅使用诸如Replace之类的函数就像是一个快速修复,而不是一个稳定的修复。这就像在需要使用正则表达式时依赖Replace,或者在需要构建完整的HTML解析器时使用正则表达式。 - SSpoke

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接