我正在从内存中读取一些数据,这个内存区域是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无效。
答案 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;