2015-06-25 3 views
4

У меня возникла проблема, когда невидимый символ \0, который довольно похож на «пустое пространство», которое не рассматривается как пробел в методе string.IsNullOrWhiteSpace. Интересно, почему это реализовано в .NET таким образом и есть ли альтернатива string.IsNullOrWhiteSpace, которая может корректно обрабатывать символ с нулевым символом? Спасибо заранее.Почему string.IsNullOrWhiteSpace (" 0") является ложным

+2

Null не является пробелом. Что ты пытаешься сделать? – SLaks

+0

'\ 0' не является пробелом –

+0

Вы что-то дешифруете? Часто я вижу '\ 0' с плохо дополненными расшифрованными строками ... – xanatos

ответ

17

U+0000 не является пробелом, в основном. char.IsWhitespace('\0') возвращает ложь, его нет в списке, как пробел ...

нуль часть IsNullOrWhitespace относится к строке ссылаться на себя - не содержание, если это то, что вы думали.

Обратите внимание, что строки в .NET не логически «с нулевым завершением» в управляемом коде, хотя на практике на уровне CLR они предназначены для взаимодействия. (Строка знает свою собственную длину, но для упрощения работы с собственным кодом, который делает, ожидайте нулевой терминатор, CLR гарантирует, что всегда будет U + 0000 после содержимого строки.) Если вы закончите с строкой, содержащей \0, вы должны, вероятно, исправить все, что было создано для начала.

+0

* Обратите внимание, что строки в .NET не являются «завершающими нулями» * Это предложение немного ложно ... Столько, сколько завершение NUL в C присутствует, но невидимо ('strlen' не учитывает его,' printf («% s», str) 'не печатает его, ...), в C# это одно и то же (' string' - NUL завершено, чтобы упростить взаимодействие, но эта вещь невидима) – xanatos

+0

@xanatos: True , починю. –

+0

/0 является пробелом для пользователя, поскольку он не может быть представлен как любой видимый символ, но он заменяет это место. Поэтому я думал, что string.IsNullOrWhiteSpace также должен считать это пробелом. Из вашего описания я понимаю, что '/ 0' обычно не должно появляться в .NET-строках и, вероятно, из-за этого .NET-программисты не включили его в список пробельных символов. Спасибо за ваше объяснение. – Shoar

4

Вы можете заменить все символы \0 символом пробела, а затем проверить пробелы.

string.IsNullOrWhiteSpace("\0".Replace('\0', ' '); 
+1

Ну, если вы пойдете так, использование 'IndexOf' будет проще и быстрее. – Luaan

+0

@ Luaan Как бы это решить? – Cyral

+0

Хм, вам нужно знать, если * все * символы являются пробелами или '\ 0' ... в этом случае' .All (c => char.IsWhiteSpace (c) || ​​c == '\ 0 «)'. Еще быстрее, чем замена, и вы избегаете много итераций (и копирования) для типичных строк. – Luaan

0

строка NULL не совпадает с пустой строкой или пробелом

0

Создать метод расширения, который добавляет символ NULL него в качестве проверки.

public bool IsNullOrWhitespaceOrHasNullChar(this string text) 
{ 
    return string.IsNullOrWhiteSpace(text) || Regex.IsMatch(text, "\0"); 
} 

Примечание это нулевой символ существует в любом месте строки, он будет найден и сообщил, как таковой, так что строка с «а \ 0» будет возвращена истина. Если это вызывает беспокойство, создайте тест, который проверяет полную строку \0.

+0

Использование Regex, вероятно, является чрезмерным для такой простой задачи, особенно [с точки зрения производительности] (http://theburningmonk.com/2012/05/performance-test-string-contains-vs-string-indexof-vs-regex-ismatch/). – Shoar

2

Для забавных исторических причин (они, конечно, весело, но я не смог найти их), null имеет два значения ... The null указатель/ссылку (так называемый NULL в C), и NUL (или NULL) \0 знак.

String.IsNullOrWhiteSpace делает:

Указывает, является ли заданная строка пустой, пустой, или состоит только из пробельных символов.

с null означает «null ссылку», пустой смысл пустой и белого пространство смысл

Пробельных символы определяются в стандарте Unicode. Метод IsNullOrWhiteSpace интерпретирует любой символ, возвращающий значение true, когда он передается методу Char.IsWhiteSpace в качестве символа пробела.

Список символов, которые Char.IsWhiteSpace рассматривает пробел, находится на странице Char.IsWhiteSpace.

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)); 
} 
Смежные вопросы