Вопрос

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

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

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

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

Это было полезно?

Решение

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

Другие советы

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

Нулевая струна

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);

IsnullUttyOrwhiteSpace Проверяет ли сама вариабельность NULL, а не если строка содержит нулевые символы. Нулевой символ не является пробелом. Так что этот чек также не удается.

Я предлагаю вам использовать обрезку () после теста. В 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

Персонаж с ноль символов ноль является символом, как и любой другой. Если у вас есть строка с семью такими персонажами, длина семь. Персонаж Nul - это не персонаж белого пространства, а строка, содержащая символы NUL, не совпадает с символом строки, которая является NULL (ничего).

Вы могли бы использовать Trim метод (или TrimEnd) Чтобы удалить символы NUL, указывая, что он должен обрезать символы Nul: str = str.Trim(Chr(0)), но я думаю, что вы предпочитаете задавать себе, почему в строке есть символы нула.

Вы читаете данные правильно из файла? Общая ошибка - использовать Read Метод для чтения из потока, но игнорирование его возвращаемого значения и, таким образом, заканчивая буфером, частично заполненным данными из потока. Как массив байтов заполнен нулями, когда вы создаете его, байты не устанавливаются Read Операция останется нулевым и становится персонажами Nul, когда вы декодируете данные в строку.

  • А. нулевой строка - это тот, который не был инициализирован или был установлен на Nothing.
  • Ан. пустой строка - это то, что содержит пустую строку String.Empty или "".
  • Увелованные персонажи - это пространство, вкладка, новая линия, возвращение каретки и еще больше. Отказ Но не нулевой характер.
  • Ваша строка не пустая, ни Nothing. Отказ Он содержит 7 символов, каждый является нулевым символом - так что это не пробел.

Вы могли бы использовать String.replace. Чтобы удалить нулевые символы? Что-то вроде этого

s = s.Replace(vbNullChar, "")

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

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top