我从CSV文件中读取了一个字符串值。 CSV文件包含7个NULL
个字节,我已经通过在十六进制编辑器中打开它来确认这一点,并确保其中有7个0x0
个字节。这根绳子让我痛苦。
在vb.net中,当我检查此字符串的strlen
时,它返回值7,如果我执行String.IsNullOrWhitespace
,则返回false
。
我不明白为什么会这样?我已将字符串拆分为字节数组,每个字节为0x0
,这是空/无。 string = Nothing
比较也失败了。
我希望能够用我自己的字符串替换此字符串,但我不能动态地执行此操作。有什么建议为什么这个字符串返回长度为7,即使每个字节都是0x0
?
答案 0 :(得分:4)
不幸的是,null
字符七次不是空字符串或空字符串。请记住,在.NET中,字符串与字符数组的某个级别为pointer。如果此指针设置为null,则字符串为null。如果指针指向零长度数组,则字符串为空。在这种情况下,指针指向长度为7的空字符数组(该字节全为零)。
空字符串
A - >
空字符串
A - > ()
你的字符串
A - > ((0)(0)(0)(0)(0)(0)(0))
您可以使用
测试此空字符char nullChar = char.ConvertFromUtf32(0);
string nullCharString = new String(nullChar);
bool hasNullChar = A.Contains(nullCharString);
答案 1 :(得分:3)
Null字符不是空格,并且您的字符串引用不是Nothing,所以我希望String.IsNullOrWhitespace()
返回false
答案 2 :(得分:1)
IsNullEmptyOrWhitespace检查变量本身是否为null,而不是字符串是否包含NULL字符。 NULL字符不是空格。所以这项检查也失败了。
我建议你在测试后使用Trim()。在C#中,这将看起来像:
bool MyNullCheck(string s) {
if (s == null) return false;
s = s.Trim(new string(char.ConvertFromUtf32(0), 1));
return string.IsNullEmptyOrWhiteSpace(s);
}
尝试转换为VB(未选中)
Function MyNullCheck(s as String) as Boolean
If s Is Nothing Then
Return False
End If
s = s.Trim(New String(vbNullChar, 1))
Return String.IsNullEmptyOrWhiteSpace(s)
End Function
答案 3 :(得分:1)
字符代码为零的字符就像任何其他字符一样。如果你有一个包含七个这样的字符的字符串,则长度为7。 NUL字符不是空格字符,包含NUL字符的字符串与null(Nothing)的字符串引用不同。
您可以使用Trim
方法(或TrimEnd
)删除NUL字符,方法是指定它应修剪NUL字符:str = str.Trim(Chr(0))
,但我认为您应该自问为什么字符串中有NUL字符开头。
您是否正确地从文件中读取数据?一个常见错误是使用Read
方法从流中读取,但忽略它的返回值,从而最终得到一个缓冲区,只是部分填充了流中的数据。由于字节数组在创建时填充了零,因此Read
操作未设置的字节将保持为零,并在将数据解码为字符串时成为NUL字符。
答案 4 :(得分:0)
Nothing
的字符串。 String.Empty
或""
的字符串。 Nothing
。它包含7个字符,每个字符都是空字符 - 因此它不是空格。您可以使用String.Replace删除零字符吗?像这样的东西
s = s.Replace(vbNullChar, "")
答案 5 :(得分:0)
我打赌你遇到了编码问题。尝试将文件读作UTF-16