我遇到了一个问题,其中隐形字符\0
非常像一个'白色空间',不被字符串视为空白.IsNullOrWhiteSpace方法。我想知道为什么这样在.NET中以这种方式实现,是否有任何替代string.IsNullOrWhiteSpace可以正确处理空终止字符?
提前谢谢。
答案 0 :(得分:18)
U+0000不是空白。 char.IsWhitespace('\0')
返回false,它没有列为空格...
IsNullOrWhitespace
的 null 部分引用字符串引用本身 - 而不是内容,如果这是您的想法。
请注意,.NET中的字符串在托管代码中不会在逻辑上“以空值终止”,但实际上在CLR级别它们是为了互操作。 (字符串知道它自己的长度,但是为了更容易使用 期望一个空终止符的本机代码,CLR确保在字符串的内容之后总是有一个U + 0000 。)如果你最终得到一个包含\0
的字符串,那你应该修改一下它开始生成的字符串。
答案 1 :(得分:4)
您可以用空格字符替换所有\0
个字符,然后检查空格。
string.IsNullOrWhiteSpace("\0".Replace('\0', ' ');
答案 2 :(得分:3)
出于有趣的历史原因(它们肯定很有趣,但我无法找到它们),null
有两个含义...... null
指针/引用(称为{{ C)中的1}}和NULL
(或NUL
)NULL
字符。
指示指定的字符串是空,空还是仅包含空格字符。
\0
表示" null
引用",空意味着空白空间含义
空白字符由Unicode标准定义。
null
方法解释在将IsNullOrWhiteSpace
方法作为空格字符传递给Char.IsWhiteSpace
方法时返回值为true的任何字符。
Char.IsWhiteSpace
页面中显示Char.IsWhiteSpace
考虑空格的字符列表。
答案 3 :(得分:2)
'\ 0'字符不被视为空格。有关被视为空格的字符列表,请参阅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));
}
答案 4 :(得分:0)
NULL字符串IS与空字符串或空格
不同答案 5 :(得分:0)
创建一个扩展方法,将null char作为一个检查添加。
public bool IsNullOrWhitespaceOrHasNullChar(this string text)
{
return string.IsNullOrWhiteSpace(text) || Regex.IsMatch(text, "\0");
}
请注意,null char存在于字符串中的任何位置,它将被发现并报告,因此带有“a \ 0”的字符串将返回true。如果这是一个问题,请创建一个检查完整字符串\0
的测试。