Удалите нулевые символы из WideString в Delphi 2006 - PullRequest
4 голосов
/ 10 сентября 2010

У меня есть переменная WideString, содержащая некоторые данные, но когда строке было присвоено несколько дополнительных нулей, которые были добавлены в более или менее случайных местах данных.Теперь мне нужно удалить эти нули из переменной.Если бы это была строка, я бы проверил каждый Char, чтобы увидеть, если Char (x) = 0, но так как это WideString, я не думаю, что это работает?Как я могу лучше всего удалить их?

Я использую Delphi 2006

Ответы [ 2 ]

8 голосов
/ 10 сентября 2010

То, что вы видите, вероятно, не нулевые символы.Вероятно, это всего лишь старшие восемь битов символа со значением кодовой точки меньше 256.

Если у вас действительно есть нулевые символы в вашей строке, которых не должно быть, первое, что нужноВы должны выяснить, как они туда добираются.Вероятно, в вашей программе есть ошибка, если они есть, когда их не должно быть.

Если код, который генерирует строку, не содержит ошибок и у вас все еще есть нежелательные нулевые символы, то вы можете удалить их справедливобез труда.Обычный способ удаления содержимого из строки - стандартная функция Delete.Вы можете указать любой символ по его числовому значению с синтаксисом #, и компилятор обычно может выяснить, должен ли он представлять AnsiChar или WideChar.

procedure RemoveNullCharacters(var s: WideString);
var
  i: Integer;
begin
  i := 1;
  while i < Length(s) do
    if s[i] = #0 then
      Delete(s, i, 1)
    else
      Inc(i);
end;

Но это может перераспределитьСтрока много раз (один раз для каждого нулевого символа).Чтобы избежать этого, вы можете упаковать строку на месте:

procedure RemoveNullCharacters(var s: WideString);
var
  i, j: Integer;
begin
  j := 0;
  for i := 1 to Length(s) do
    if s[i] <> #0 then begin
      Inc(j);
      s[j] := s[i];
    end;
  if j < Length(s) then
    SetLength(s, j);
end;

Эти функции будут работать для любых типов строк Delphi;просто измените тип параметра.

5 голосов
/ 10 сентября 2010

Это не лишние нули.Они являются частью строки.

Вы должны прочитать некоторые многобайтовые символы, включая WideStrings.Символы имеют размер более одного байта, и некоторые из этих дополнительных байтов равны NULL.

Вы можете начать здесь с статей Ника Юджеса по Unicode, написанных, когда Delphi 2009 был впервые выпущен дляпомочь людям перейти от однобайтовых символов к многобайтовым.В серии три статьи IIRC.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...