WideStringを16進数で表示するには?

解決


鮒虫  2006-06-29 21:12:48  No: 22330

Delphi7+WinXP Proで開発しています。

文字列を受け取りそれを16進数でダンプする関数を作っています。
Shift-JIS形式とUNICODE形式で分けて以下のような関数を作りました。

//以下Shift-JIS版
function StringToHexList(Source:String; StrList:TStrings): Integer;
var ws:WideString; len,i:Integer; ss,hex:String;
begin
  StrList.Clear;
  ws:=Source;
  len:=Length(ws);
  SetLength(ss,2);
  for i:=1 to len do begin
    ss:=Copy(ws,i,1);
    hex:=IntToHex(Ord(ss[1]),2);
    hex:=hex+IntToHex(Ord(ss[2]),2);
    StrList.Add(hex);
  end;
  Result:=StrList.Count;
end;

//以下UNICODE版
function StringToHexListW(Source:String; StrList: TStrings): Integer;
var ws:WideString; len,i:Integer;
    S:array[0..10] of char; hex:String;
begin
  StrList.Clear;
  ws:=Source;
  len:=Length(ws);
  for i:=1 to len do begin
    StrLCopy(S,PChar(@ws[i]),2); //←ここでおかしくなる
    hex:=IntToHex(Ord(S[1]),2);
    hex:=hex+IntToHex(Ord(S[0]),2);
    StrList.Add(hex);
  end;
  Result:=StrList.Count;
end;

ほとんどの文字では正常に動くのですが、UNICODE版で「退(U+9000)」と
外字の先頭(U+E000)ではおかしな結果となります。
関数内の StrLCopy でコピーが失敗しているのまではわかったのですが、
どう回避してよいかがわかりません。

回避策がわかる方がおりましたら、教えて頂きたいです。
よろしくお願い致します。


ママん  2006-06-29 21:24:37  No: 22331

function StringToHexListW(Source:String; StrList: TStrings): Integer;
ってStringやTStringsはWideStringサポートしてませんから。
WideString, WideString互換TStringsを使ってください
オススメはTTntStringListでs。
http://www.tntware.com/delphicontrols/unicode/


ママん  2006-06-29 21:26:37  No: 22332

失礼、StrList: TStringsは返り値ですね。そのままでOKです。
だったら var StrList: TStringsがあったほうが分かりやすいです。


ママん  2006-06-29 21:37:24  No: 22333

改行もダンプしてますが、こんな感じで

function WideStringToHexStr(Source:WideString): string;
var
  ws:WideString;
  len,i:Integer;
  hex:string;
begin
  Result:='';
  len:=Length(Source);
  for i:=1 to len do
  begin
    hex:=IntToHex(Ord(Source[i]),4);
    Result:=Result + hex + ' ';
  end;
end;


鮒虫  2006-06-29 22:35:28  No: 22334

ママんさんのソースをもとに以下のように変更することで解決しました。
どうもありがとうございました。

function StringToHexListW(Source:WideString; var StrList: TStrings): Integer;
var len,i:Integer; hex:String;
begin
  StrList.Clear;
  len:=Length(Source);
  for i:=1 to len do begin
    hex:=IntToHex(Ord(Source[i]),4);
    StrList.Add(hex);
  end;
  Result:=StrList.Count;
end;


※返信する前に利用規約をご確認ください。

※Google reCAPTCHA認証からCloudflare Turnstile認証へ変更しました。






  このエントリーをはてなブックマークに追加