我有一个WideString变量,其中包含一些数据,但是当字符串被分配时,一些额外的null被添加到数据的更多或更少随机的位置。现在我需要从变量中去掉这些null。如果它是一个字符串,我会检查每个Char,看看Char(x)= 0,但由于这是一个WideString,我不认为这样会起作用?如何最好地去除这些字符?
我正在使用Delphi 2006
我有一个WideString变量,其中包含一些数据,但是当字符串被分配时,一些额外的null被添加到数据的更多或更少随机的位置。现在我需要从变量中去掉这些null。如果它是一个字符串,我会检查每个Char,看看Char(x)= 0,但由于这是一个WideString,我不认为这样会起作用?如何最好地去除这些字符?
我正在使用Delphi 2006
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。字符的大小超过一个字节,其中一些额外的字节是NULLs。
你可以从Nick Hodges的Unicode文章开始阅读,这些文章是在Delphi 2009首次发布时编写的,旨在帮助人们从单字节字符过渡到多字节字符。我记得这个系列有三篇文章。