我有一个包含一些数据的WideString变量,但是当字符串被赋予一些额外的空值时,这些空值或多或少地添加到数据中的随机位置。现在我需要将这些空值从变量中剥离出来。如果它是一个字符串,我会检查每个字符,看看是否Char(x) =0,但由于这是一个WideString,我认为这不可行?我怎样才能最好地去掉这些东西呢?
我使用的是Delphi 2006
发布于 2010-09-10 21:44:10
您看到的可能不是空字符。它们可能只是一个码位值小于256的字符的高8位。
如果你的字符串中确实有不应该出现的空字符,你应该做的第一件事是弄清楚它们是如何到达那里的。如果它们在不应该存在的地方,那么你的程序中可能存在错误。
如果生成字符串的代码没有bug,并且仍然有不需要的空字符,那么可以相当容易地删除它们。从字符串中删除内容的常用方法是使用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的任何字符串类型;只需更改参数类型即可。
发布于 2010-09-10 20:49:21
这些不是额外的空值。他们是这根弦的一部分。
您应该对多字节字符进行一些读取,包括WideStrings。字符的大小超过一个字节,其中一些额外的字节是NULL。
您可以从Nick Hodges的articles on Unicode开始,它是在Delphi2009首次发布时编写的,目的是帮助人们从单字节字符过渡到多字节字符。本系列有三篇文章,IIRC。
https://stackoverflow.com/questions/3684677
复制相似问题