从Delphi 2006中的WideString中删除空字符

时间:2010-09-10 12:42:27

标签: delphi unicode

我有一个包含一些数据的WideString变量但是在为字符串分配了一些额外的空值时,这些空值在数据中的或多或少的随机位置添加。我现在需要从变量中删除这些空值。如果它是一个字符串我会检查每个Char以查看Char(x)= 0但是因为这是一个WideString我不认为这个工作?我怎样才能最好地解决这些问题呢?

我正在使用Delphi 2006

2 个答案:

答案 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。