4

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

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

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

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

4

6 回答 6

4

不幸的是,这个null字符七次不是空字符串,也不是空字符串。请记住,在 .NET 中,字符串在某种程度上是指向字符数组的指针。如果此指针设置为 null,则字符串为 null。如果指针指向零长度数组,则字符串为空。在这种情况下,指针指向长度为 7 的空字符数组(字节全为零)。

空字符串

一个->

空字符串

A -> ()

你的字符串

A -> ((0)(0)(0)(0)(0)(0)(0))

您可以使用以下方法测试此空字符

char nullChar = char.ConvertFromUtf32(0);
string nullCharString = new String(nullChar);
bool hasNullChar = A.Contains(nullCharString);
于 2010-06-29T12:15:44.020 回答
3

Null 字符不是空格,并且您的字符串引用不是 Nothing,所以我希望String.IsNullOrWhitespace()返回 false

于 2010-06-29T12:08:48.940 回答
2

字符代码为零的字符与其他字符一样。如果您有一个包含七个此类字符的字符串,则长度为七个。NUL 字符不是空白字符,包含 NUL 字符的字符串与为空(Nothing)的字符串引用不同。

您可以使用该Trim方法(或TrimEnd)通过指定它应该修剪 NUL 字符来删除 NUL 字符:str = str.Trim(Chr(0))但我认为您应该问自己为什么字符串中有 NUL 字符开头。

您是否从文件中正确读取数据?一个常见的错误是使用该Read方法从流中读取,但忽略了它的返回值,从而导致缓冲区仅部分填充了流中的数据。由于创建字节数组时会填充零,因此未由Read操作设置的字节将保持为零并在将数据解码为字符串时变为 NUL 字符。

于 2010-06-29T12:15:58.920 回答
1

IsNullEmptyOrWhitespace 检查变量本身是否为空,而不是字符串是否包含空字符。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
于 2010-06-29T12:15:16.367 回答
0

我敢打赌,您遇到了编码问题。尝试以 UTF-16 格式读取文件

于 2010-06-29T12:18:51.373 回答
0
  • 字符串是尚未初始化或已设置为的字符串Nothing
  • 字符串是包含空字符串String.Empty或的字符串""
  • 空白字符是空格、制表符、换行符、回车符等等。但不是空字符。
  • 您的字符串既不是空的,也不是Nothing. 它包含 7 个字符,每个字符都是空字符 - 所以它不是空格。

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

s = s.Replace(vbNullChar, "")
于 2010-06-29T12:16:04.273 回答