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

Mar*_*ius 4 delphi unicode

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

我正在使用Delphi 2006

Rob*_*edy 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;
Run Code Online (Sandbox Code Playgroud)

但是这可能会多次重新分配字符串(每个空字符一次).为避免这种情况,您可以就地填充字符串:

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;
Run Code Online (Sandbox Code Playgroud)

这些函数适用于任何Delphi的字符串类型; 只需更改参数类型.


Ken*_*ite 6

这些不是额外的空值.他们是字符串的一部分.

您应该对多字节字符进行一些读取,其中包括WideStrings.字符大小超过一个字节,其中一些额外字节为NULL.

你可以从Nick Hodges 关于Unicode 的文章开始,这篇文章是在Delphi 2009首次发布时帮助人们从单字节字符转换为多字节字符时编写的.该系列有三篇文章,IIRC.