VB.NET - 空字符串

时间:2010-06-29 12:02:32

标签: vb.net string null nothing

我从CSV文件中读取了一个字符串值。 CSV文件包含7个NULL个字节,我已经通过在十六进制编辑器中打开它来确认这一点,并确保其中有7个0x0个字节。这根绳子让我痛苦。

在vb.net中,当我检查此字符串的strlen时,它返回值7,如果我执行String.IsNullOrWhitespace,则返回false

我不明白为什么会这样?我已将字符串拆分为字节数组,每个字节为0x0,这是空/无。 string = Nothing比较也失败了。

我希望能够用我自己的字符串替换此字符串,但我不能动态地执行此操作。有什么建议为什么这个字符串返回长度为7,即使每个字节都是0x0

6 个答案:

答案 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)

  • null 字符串是尚未初始化或已设置为Nothing的字符串。
  • 字符串是包含空字符串String.Empty""的字符串。
  • 空白字符包括空格,制表符,换行符,回车符和lots more。但不是空字符。
  • 您的字符串既不是空的也不是Nothing。它包含7个字符,每个字符都是空字符 - 因此它不是空格。

您可以使用String.Replace删除零字符吗?像这样的东西

s = s.Replace(vbNullChar, "")

答案 5 :(得分:0)

我打赌你遇到了编码问题。尝试将文件读作UTF-16