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

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

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

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

有帮助吗?

解决方案

空字符不是空格,而您的字符串参考并非一无所有,所以我希望 String.IsNullOrWhitespace() 返回false

其他提示

不幸的是 null 字符七次不是一个空字符串,也不是一个空字符串。记住在.net中,字符串在某个级别A 指针 到一个角色数组。如果将此指针设置为NULL,则字符串为null。如果指针指向零长度数组,则字符串为空。在这种情况下,指针指向一个长度为七个无效字符(字节为zeros)。

空字符串

A->

空字符串

a->()

你的弦

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

您可以使用

char nullChar = char.ConvertFromUtf32(0);
string nullCharString = new String(nullChar);
bool hasNullChar = A.Contains(nullCharString);

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

字符代码零的字符就像其他任何人一样。如果您有一个具有七个此类字符的字符串,则长度为七个。 NUL字符不是白色空间字符,包含NUL字符的字符串与null的字符串引用(无)不同。

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

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

  • 一种 空值 字符串是尚未初始化或已设置为 Nothing.
  • 一个 空的 字符串是包含空字符串的字符串 String.Empty 或者 "".
  • 空格字符是空间,标签,纽文,马车返回和 更多. 。但不是无效的角色。
  • 您的字符串既不为空,也不是 Nothing. 。它包含7个字符,每个字符是空字符 - 因此不是空格。

您可以使用 string.replace 删除零字符?这样的东西

s = s.Replace(vbNullChar, "")

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

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top