CharInSet接受Unicode NULL字符

时间:2012-05-16 16:20:29

标签: delphi delphi-2010

我正在从内存中读取一些数据,这个内存区域是Unicode格式。所以要制作一个ansi字符串我需要这样的东西:

  while CharInSet(Chr(Ord(Buff[aux])), ['0'..'9', #0]) do
    begin
      Target:= Target + Chr(Ord(Buff[aux]));
      inc(aux);
    end;

其中Buff是Bytes数组,Target是字符串。我只是想继续得到Buff并在它是0..9时添加Target,但是当它找到NULL内存char(00)时,它就会停止。如何在Target中添加数据,直到第一个字母或非数字字符? #0无效。

2 个答案:

答案 0 :(得分:3)

如果您的数据是Unicode,那么我假设编码是UTF-16。在这种情况下,您无法逐字节处理它。字符单元宽2个字节。首先将数据放入Delphi字符串,然后解析它:

var
  str: string;
....
SetString(str, PChar(Buff), Length(Buff) div SizeOf(Char));

这样做,你的循环看起来像这样:

for i := 1 to Length(str) do
  if not CharInSet(str[i], ['0'..'9']) then
  begin
    SetLength(str, i-1);
    break;
  end;

我相信你的混乱是由逐字节处理引起的。对于UTF-16编码文本,ASCII字符被编码为一对字节,其中最重要的是零。我怀疑这解释了您通过CharInSet电话尝试实现的目标。

如果您想要迎合其他数字字符,那么您可以使用Character单位并使用TCharacter.IsDigit()进行测试。

答案 1 :(得分:3)

我甚至不打扰CharInSet(),因为你处理字节而不是字符:

var
  b: Byte;

while aux < Length(Buff) do
begin
  b := Buff[aux];
  if ((b >= Ord('0')) and (b <= Ord('9'))) or (b = 0) then
  begin
    Target := Target + Char(Buff[aux]); 
    Inc(aux); 
  end else
    Break;
end;