У меня возникла проблема, когда невидимый символ \0
, который довольно похож на «пустое пространство», которое не рассматривается как пробел в методе string.IsNullOrWhiteSpace. Интересно, почему это реализовано в .NET таким образом и есть ли альтернатива string.IsNullOrWhiteSpace, которая может корректно обрабатывать символ с нулевым символом? Спасибо заранее.Почему string.IsNullOrWhiteSpace (" 0") является ложным
ответ
U+0000 не является пробелом, в основном. char.IsWhitespace('\0')
возвращает ложь, его нет в списке, как пробел ...
нуль часть IsNullOrWhitespace
относится к строке ссылаться на себя - не содержание, если это то, что вы думали.
Обратите внимание, что строки в .NET не логически «с нулевым завершением» в управляемом коде, хотя на практике на уровне CLR они предназначены для взаимодействия. (Строка знает свою собственную длину, но для упрощения работы с собственным кодом, который делает, ожидайте нулевой терминатор, CLR гарантирует, что всегда будет U + 0000 после содержимого строки.) Если вы закончите с строкой, содержащей \0
, вы должны, вероятно, исправить все, что было создано для начала.
* Обратите внимание, что строки в .NET не являются «завершающими нулями» * Это предложение немного ложно ... Столько, сколько завершение NUL в C присутствует, но невидимо ('strlen' не учитывает его,' printf («% s», str) 'не печатает его, ...), в C# это одно и то же (' string' - NUL завершено, чтобы упростить взаимодействие, но эта вещь невидима) – xanatos
@xanatos: True , починю. –
/0 является пробелом для пользователя, поскольку он не может быть представлен как любой видимый символ, но он заменяет это место. Поэтому я думал, что string.IsNullOrWhiteSpace также должен считать это пробелом. Из вашего описания я понимаю, что '/ 0' обычно не должно появляться в .NET-строках и, вероятно, из-за этого .NET-программисты не включили его в список пробельных символов. Спасибо за ваше объяснение. – Shoar
Вы можете заменить все символы \0
символом пробела, а затем проверить пробелы.
string.IsNullOrWhiteSpace("\0".Replace('\0', ' ');
Ну, если вы пойдете так, использование 'IndexOf' будет проще и быстрее. – Luaan
@ Luaan Как бы это решить? – Cyral
Хм, вам нужно знать, если * все * символы являются пробелами или '\ 0' ... в этом случае' .All (c => char.IsWhiteSpace (c) || c == '\ 0 «)'. Еще быстрее, чем замена, и вы избегаете много итераций (и копирования) для типичных строк. – Luaan
строка NULL не совпадает с пустой строкой или пробелом
Создать метод расширения, который добавляет символ NULL него в качестве проверки.
public bool IsNullOrWhitespaceOrHasNullChar(this string text)
{
return string.IsNullOrWhiteSpace(text) || Regex.IsMatch(text, "\0");
}
Примечание это нулевой символ существует в любом месте строки, он будет найден и сообщил, как таковой, так что строка с «а \ 0» будет возвращена истина. Если это вызывает беспокойство, создайте тест, который проверяет полную строку \0
.
Использование Regex, вероятно, является чрезмерным для такой простой задачи, особенно [с точки зрения производительности] (http://theburningmonk.com/2012/05/performance-test-string-contains-vs-string-indexof-vs-regex-ismatch/). – Shoar
Для забавных исторических причин (они, конечно, весело, но я не смог найти их), null
имеет два значения ... The null
указатель/ссылку (так называемый NULL
в C), и NUL
(или NULL
) \0
знак.
String.IsNullOrWhiteSpace
делает:
Указывает, является ли заданная строка пустой, пустой, или состоит только из пробельных символов.
с null
означает «null
ссылку», пустой смысл пустой и белого пространство смысл
Пробельных символы определяются в стандарте Unicode. Метод
IsNullOrWhiteSpace
интерпретирует любой символ, возвращающий значение true, когда он передается методуChar.IsWhiteSpace
в качестве символа пробела.
Список символов, которые Char.IsWhiteSpace
рассматривает пробел, находится на странице Char.IsWhiteSpace
.
'\ 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));
}
- 1. Почему "" == "0" является ложным в javascript?
- 2. Почему {} == {} является ложным, но {} + {} == {} + {} истинно
- 3. Почему isFinite (NaN) является ложным?
- 4. Почему if (Request.IsAjaxRequest) является ложным
- 5. Почему isLockTaskPermitted флаг является ложным
- 6. Почему LINQ не переводит string.IsNullOrWhiteSpace()?
- 7. .NET string.IsNullOrWhiteSpace реализации
- 8. почему parameter.getType() isInstance возвращение (HttpServletRequest.class) является ложным, но использовать "==" истинно
- 9. String.IsNullOrWhiteSpace в LINQ выражения
- 10. string.IsNullOrEmpty (myString.Trim()) против string.IsNullOrWhiteSpace (MyString)
- 11. ((171.36/1.19) == 144) является ложным?
- 12. Проверьте, не является ли условие ложным
- 13. Почему пустой объект javascript не является ни истинным, ни ложным?
- 14. Почему предупреждение lint о предупреждении fullBackupContent, когда allowBackup является ложным?
- 15. Почему этот прологовый запрос является истинным и ложным?
- 16. Почему этот инвариант становится ложным?
- 17. Проверьте булевым является истинной или ложным
- 18. ModelState.IsValid является ложным после подтверждения Jquery Validation
- 19. если выполняется, несмотря на условие, является ложным
- 20. np.isnan() == False, но np.isnan() не является ложным
- 21. NSResponder принимает события, когда acceptFirstResponder является ложным?
- 22. ModelState.IsValid является ложным при модификации модели перед проверкой действительности
- 23. Variable = true, хотя if-statement является ложным
- 24. Выберите столбцы, где isnull() является ложным
- 25. Файл.Exists (файл) является ложным, но существует файл
- 26. Измените источник изображения, когда IsEnabled является ложным
- 27. Почему не hasNext() становится ложным?
- 28. ModelState.IsValid является ложным, когда переплетены в DROPDOWNLIST
- 29. Является ли ложным считается nil в rspec?
- 30. JavaScript - Файл является экземпляром файла, но `instanceof File` является ложным
Null не является пробелом. Что ты пытаешься сделать? – SLaks
'\ 0' не является пробелом –
Вы что-то дешифруете? Часто я вижу '\ 0' с плохо дополненными расшифрованными строками ... – xanatos