我有一个包含一些数据的WideString变量但是在为字符串分配了一些额外的空值时,这些空值在数据中的或多或少的随机位置添加。我现在需要从变量中删除这些空值。如果它是一个字符串我会检查每个Char以查看Char(x)= 0但是因为这是一个WideString我不认为这个工作?我怎样才能最好地解决这些问题呢?
我正在使用Delphi 2006
答案 0 :(得分:8)
您所看到的可能不是空字符。它们可能只是字符的高八位,代码点值小于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的字符串类型;只需更改参数类型。
答案 1 :(得分:5)
这些不是额外的空值。它们是字符串的一部分。
您应该对多字节字符进行一些阅读,其中包括WideStrings。字符大小超过一个字节,其中一些额外字节为NULL。
你可以从Nick Hodges'articles开始使用Unicode,这是在Delphi 2009首次发布时帮助人们从单字节字符转换为多字节字符时编写的。该系列文章有三篇文章,IIRC。