Удалите нулевые символы из WideString в Delphi 2006
У меня есть переменная WideString, содержащая некоторые данные, но когда строке было присвоено несколько дополнительных нулей, которые были добавлены в более или менее случайных местах данных. Теперь мне нужно удалить эти нули из переменной. Если бы это была строка, я бы проверил каждый Char, чтобы увидеть, если Char(x) = 0, но так как это WideString, я не думаю, что это работает? Как я могу лучше всего раздеть это?
Я использую Delphi 2006
2 ответа
То, что вы видите, вероятно, не нулевые символы. Вероятно, это всего лишь старшие восемь битов символа со значением кодовой точки меньше 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; просто измените тип параметра.
Это не лишние нули. Они часть строки.
Вы должны прочитать некоторые многобайтовые символы, включая WideStrings. Символы имеют размер более одного байта, и некоторые из этих дополнительных байтов имеют значение NULL.
Вы можете начать здесь со статей Ника Ходжеса по Unicode, написанных, когда Delphi 2009 был впервые выпущен, чтобы помочь людям перейти от однобайтовых символов к многобайтовым. В серии есть три статьи, IIRC.