我遇到了一个问题,即不可见字符\0
,它非常像一个“空格”,但却不被字符串方法 IsNullOrWhiteSpace
视为空格。我想知道为什么.NET以这种方式实现,并且是否有替代的方法可以正确处理空终止字符?谢谢。
U+0000不是空格,基本上。 char.IsWhitespace('\ 0')
返回false,它没有被列为空格…
IsNullOrWhitespace
中的null部分指的是字符串引用本身 - 而不是内容,如果这是您所考虑的。
请注意,在托管代码中,.NET中的字符串在逻辑上并不是“以null结尾”的,尽管在CLR级别上实际上是为了互操作的目的。 (字符串知道自己的长度,但为了使其更容易与期望空终止符的本地代码一起使用,CLR确保字符串内容后始终有一个U + 0000。)如果你最终得到包含\0
的字符串,你应该修复产生它的任何问题。
strlen
不计算它,printf("%s", str)
不打印它...),但在C#中也是一样的(string
以NUL结尾以便于交互操作,但这个东西是看不见的)。 - xanatos您可以将所有的 \0
字符替换为空格字符,然后检查空白字符。
string.IsNullOrWhiteSpace("\0".Replace('\0', ' ');
IndexOf
会更简单和更快。 - Luaan\0
...在这种情况下,使用.All(c => char.IsWhiteSpace(c) || c == '\0')
。仍然比替换快,并且避免了对于典型字符串的大量迭代(和复制)。 - LuaanIsNullOrWhiteSpace
的内部实现只是一个简单的C#循环。也许这只是LINQ的开销?那么,您可以自己使用for循环。我之所以使用LINQ是为了可读性。 - Luaannull
有两个含义... null
指针/引用(在 C 中称为 NULL
),以及 NUL
(或 NULL
)\0
字符。
String.IsNullOrWhiteSpace
方法的作用如下:
指示指定的字符串是否为 null、空或仅由空白字符组成。
其中,null
表示 "null
引用",empty 表示为空,white-space 表示
空格字符由 Unicode 标准定义。当传递给
Char.IsWhiteSpace
方法时返回 true 的任何字符都被IsNullOrWhiteSpace
方法解释为空格字符。
Char.IsWhiteSpace
方法认为是空格的字符列表可在 Char.IsWhiteSpace
页面中找到。Char.IsWhitespace()
获取被视为空格的字符列表。Enumerable.All()
。可以像这样做:bool IsMyKindOfWhiteSpace(string input)
{
char[] more = new char[] { <here goes your list of additional white space chars> };
return input.All(x => Char.IsWhiteSpace(x) || more.Contains(x));
}
public bool IsNullOrWhitespaceOrHasNullChar(this string text)
{
return string.IsNullOrWhiteSpace(text) || Regex.IsMatch(text, "\0");
}
\0
的测试。NULL字符串与空字符串或空格不同
\0
与错误填充的解密字符串... - xanatos