VB.NET - строка нулей - PullRequest
3 голосов
/ 29 июня 2010

У меня есть строковое значение, считанное из файла CSV. Файл CSV содержит 7 NULL байтов, я подтвердил это, открыв его в шестнадцатеричном редакторе и убедившись, что там есть 7 0x0 байтов. Эта строка причиняет мне боль.

В vb.net, когда я проверяю strlen этой строки, он возвращает значение 7, а если я делаю String.IsNullOrWhitespace, он возвращает false.

Я не могу понять, почему это так? Я разбил строку на байтовый массив, и каждый байт равен 0x0, что является нулем / ничем. string = Nothing Сравнение также не удается.

Я хочу иметь возможность заменить эту строку собственной строкой, но я не могу сделать это динамически. Любые предположения, почему эта строка возвращает длину 7, хотя каждый байт 0x0?

Ответы [ 6 ]

4 голосов
/ 29 июня 2010

К сожалению, символ null семь раз не является пустой строкой или пустой строкой.Помните, что в .NET строка на некотором уровне является указателем на массив символов.Строка имеет значение null, если для этого указателя установлено значение null.Строка пуста, если указатель указывает на массив нулевой длины.В этом случае указатель указывает на массив длиной в семь нулевых символов (все байты равны нулю).

Null String

A ->

Пустая строка

A -> ()

Ваша строка

A -> ((0) (0) (0)(0) (0) (0) (0))

Вы можете проверить этот нулевой символ, используя

char nullChar = char.ConvertFromUtf32(0);
string nullCharString = new String(nullChar);
bool hasNullChar = A.Contains(nullCharString);
3 голосов
/ 29 июня 2010

Нулевой символ не является пробелом, а ваша строковая ссылка не является Ничем, поэтому я ожидаю, что String.IsNullOrWhitespace() вернет false

1 голос
/ 29 июня 2010

Символ с нулевым кодом является символом, как и любой другой.Если у вас есть строка с семью такими символами, длина составляет семь.Символ NUL не является пробелом, и строка, содержащая символы NUL, не совпадает со строкой ссылки, которая является нулевой (Nothing).

Вы можете использовать метод Trim (или * 1004).*) чтобы удалить символы NUL, указав, что он должен обрезать символы NUL: str = str.Trim(Chr(0)), но я думаю, что вам лучше спросить себя, почему в строке есть символы NUL, с которых нужно начинать.данные правильно из файла?Распространенной ошибкой является использование метода Read для чтения из потока, но игнорирование его возвращаемого значения и, как следствие, получение буфера, только частично заполненного данными из потока.Поскольку байтовый массив заполняется нулями при его создании, байты, не установленные операцией Read, останутся равными нулю и станут NUL-символами при декодировании данных в строку.

1 голос
/ 29 июня 2010

IsNullEmptyOrWhitespace проверяет, является ли сама переменная нулевой, а не содержит ли строка символы NULL. Символ NULL не является пробелом. Так что эта проверка также не проходит.

Я предлагаю вам использовать Trim () после теста. В C # это будет выглядеть так:

bool MyNullCheck(string s) {
    if (s == null) return false;
    s = s.Trim(new string(char.ConvertFromUtf32(0), 1));
    return string.IsNullEmptyOrWhiteSpace(s);
}

Попробуйте конвертировать в VB (не проверено)

Function MyNullCheck(s as String) as Boolean
  If s Is Nothing Then
     Return False
  End If
  s = s.Trim(New String(vbNullChar, 1))
  Return String.IsNullEmptyOrWhiteSpace(s)
End Function
0 голосов
/ 29 июня 2010

Бьюсь об заклад, вы столкнулись с проблемой кодировки. Попробуйте прочитать файл как UTF-16

0 голосов
/ 29 июня 2010
  • A null строка - это строка, которая не была инициализирована или была установлена ​​на Nothing.
  • Строка empty - это строка, содержащая пустую строку String.Empty или "".
  • Пробелами являются пробел, табуляция, перевод строки, возврат каретки и много других . Но не нулевой символ.
  • Ваша строка не является ни пустой, ни Nothing. Он содержит 7 символов, каждый из которых является нулевым символом, поэтому это не пробел.

Вы можете использовать String.Replace для удаления нулевых символов? Как то так

s = s.Replace(vbNullChar, "")
...