Почему струна?IsNullOrWhiteSpace ("") - ложь
Я столкнулся с проблемой, где невидимый символ , который довольно похож на "пробел", не рассматривается как пробел строкой.Метод IsNullOrWhiteSpace. Интересно, почему это реализовано в .NET таким образом и есть ли альтернатива string.IsNullOrWhiteSpace, который может правильно обрабатывать символ null-terminate?
Заранее спасибо.
6 ответов:
U+0000 в принципе не является пробелом.
char.IsWhitespace('\0')возвращает false, он не указан как пробел...Частьnull
IsNullOrWhitespaceссылается на саму ссылку на строку, а не на ее содержимое, если вы об этом подумали.Обратите внимание, что строки в .NET не являются логически "завершенными нулем" в управляемом коде, хотя на практике на уровне CLR они являются таковыми для целей взаимодействия. (Строка знает свою длину, но для того, чтобы было проще работать с машинным кодом который делает ожидаемым нулевым Терминатором, CLR гарантирует, что всегда есть U+0000 после содержимого строки.) Если вы в конечном итоге получаете строку, содержащую
\0, вы, вероятно, должны исправить то, что произвело его для начала.
Можно заменить все символы
\0пробелом, а затем проверить наличие пробела.string.IsNullOrWhiteSpace("\0".Replace('\0', ' ');
По забавным историческим причинам (они, конечно, забавны, но я не смог их найти),
nullимеет два значения...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)); }
Создайте метод расширения, который добавляет нулевой символ it в качестве проверки.
public bool IsNullOrWhitespaceOrHasNullChar(this string text) { return string.IsNullOrWhiteSpace(text) || Regex.IsMatch(text, "\0"); }Обратите внимание, что нулевой символ существует в любом месте строки, он будет найден и сообщен как таковой, поэтому строка с "a\0" вернет true. Если это вызывает беспокойство, создайте тест, который проверяет наличие полной строки
\0.
Comments