【问题标题】:VB.NET - string of nullsVB.NET - 空字符串
【发布时间】:2011-03-09 14:21:44
【问题描述】:

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

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

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

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

【问题讨论】:

  • 您的代码示例会有所帮助。

标签: vb.net string null nothing


【解决方案1】:

不幸的是,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);

【讨论】:

    【解决方案2】:

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

    【讨论】:

    • 那么如果是这种情况,我该如何检查一串 NULL 字符?
    • 您需要将它们转换为“其他”,例如使用yourstring = yourstring.Replace( Chr(0), " "c ) 转换为空格或遍历字符串并检查自己
    【解决方案3】:

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

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

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

    【讨论】:

    • 字符串来自另一个我无法控制的程序输出。我正在正确阅读它,因为我已经使用十六进制编辑器验证了文件的内容。
    • @WizardsSleeve:好的,如果您确定可以安全地忽略 NUL 字符,那么您可以从字符串中删除它们。如果字符串只包含 NUL 字符,那么之后你会得到一个空字符串。
    【解决方案4】:

    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
    

    【讨论】:

      【解决方案5】:
      • null 字符串是尚未初始化或已设置为Nothing 的字符串。
      • empty 字符串是包含空字符串String.Empty"" 的字符串。
      • 空白字符是空格、制表符、换行符、回车和lots more。但不是空字符。
      • 您的字符串既不是空的,也不是Nothing。它包含 7 个字符,每个字符都是空字符 - 所以它不是空格。

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

      s = s.Replace(vbNullChar, "")
      

      【讨论】:

        【解决方案6】:

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

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2013-02-20
          • 1970-01-01
          相关资源
          最近更新 更多