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

在Delphi 2006中删除WideString中的空字符,delphi,unicode,Delphi,Unicode,我有一个WideString变量,其中包含一些数据,但是当字符串被分配了一些额外的空值时,在数据中或多或少的随机位置添加了这些空值。我现在需要从变量中去掉这些空值。如果它是一个字符串,我会检查每个字符,看看字符(x)=0,但由于这是一个宽字符串,我认为这不起作用?我怎样才能最好地去掉这些 我使用的是Delphi 2006,这些不是额外的空值。他们是绳子的一部分 您应该读取多字节字符,其中包括宽字符串。字符的大小超过一个字节,其中一些额外字节为空 您可以从Nick Hodges关于Unicode的

我有一个WideString变量,其中包含一些数据,但是当字符串被分配了一些额外的空值时,在数据中或多或少的随机位置添加了这些空值。我现在需要从变量中去掉这些空值。如果它是一个字符串,我会检查每个字符,看看字符(x)=0,但由于这是一个宽字符串,我认为这不起作用?我怎样才能最好地去掉这些


我使用的是Delphi 2006,这些不是额外的空值。他们是绳子的一部分

您应该读取多字节字符,其中包括宽字符串。字符的大小超过一个字节,其中一些额外字节为空


您可以从Nick Hodges关于Unicode的著作开始,该著作是在Delphi 2009首次发布时编写的,旨在帮助人们从单字节字符过渡到多字节字符。本系列共有三篇文章,IIRC。

您看到的可能不是空字符。它们可能只是字符的上八位,代码点值小于256

如果您的字符串中确实存在不应该存在的空字符,那么您应该做的第一件事是找出它们是如何到达的。如果你的程序在不应该出现的时候出现了错误,那么你的程序可能会出现错误

如果生成字符串的代码没有bug,并且仍然有不需要的空字符,那么可以相当容易地删除它们。从字符串中删除内容的常用方法是使用标准函数。您可以使用
#
语法通过其数值指定任何字符,编译器通常可以确定它是需要表示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(变量s:WideString);
变量
i:整数;
开始
i:=1;
而我呢
如果s[i]=#0,那么
删除(s,i,1)
其他的
公司(一);
结束;
但这可能会多次重新分配字符串(每个空字符一次)。为了避免这种情况,您可以将字符串打包到位:

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;
procedure-RemoveNullCharacters(变量s:WideString);
变量
i、 j:整数;
开始
j:=0;
对于i:=1到长度do
如果s[i]#0,则开始
公司(j);
s[j]:=s[i];
结束;
如果j<长度,则
设定长度(s,j);
结束;

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

术语说明:NULL(所有的CAPS,两个L)是C和C++宏指定的指针,它不指向任何地方,即空指针。NUL是索引零处ASCII字符的符号,也称为空字符。如果您正在谈论指针,请仅在所有大写字母中填写NULL;否则,只需像普通英语单词一样大写:“添加了一些额外的空字符”,“以空结尾的字符串”,“合同无效。”谢谢Rob。问题根据widestring进行了更新,您可以使用widechar,使用方式与ansi版本完全相同。这也解决了其他人提出的关于零前导字节和零widechar之间差异的其他问题。他们是对的,从一个widestring中删除所有的零字节会很有趣,但没有用处。数据来自一个遗留系统,所以我没有任何方法来解决根本问题。。。