0

私はメモリからいくつかのデータを読み取っています、そしてメモリのこの領域はUnicodeです。したがって、1つのansi文字列を作成するには、次のようなものが必要です。

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

ここで、Buffはバイトの配列であり、Targetは文字列です。0..9の間、バフを取得してターゲットに追加し続けたいのですが、NULLメモリ文字(00)が見つかると、停止します。最初の文字または数字以外の文字までTargetにデータを追加し続けるにはどうすればよいですか?#0は効果がありません。

4

2 に答える 2

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; 
于 2012-05-16T17:34:08.800 に答える
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()

于 2012-05-16T16:37:45.980 に答える