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 でコピーが失敗しているのまではわかったのですが、
どう回避してよいかがわかりません。
回避策がわかる方がおりましたら、教えて頂きたいです。
よろしくお願い致します。
function StringToHexListW(Source:String; StrList: TStrings): Integer;
ってStringやTStringsはWideStringサポートしてませんから。
WideString, WideString互換TStringsを使ってください
オススメはTTntStringListでs。
http://www.tntware.com/delphicontrols/unicode/
失礼、StrList: TStringsは返り値ですね。そのままでOKです。
だったら var StrList: TStringsがあったほうが分かりやすいです。
改行もダンプしてますが、こんな感じで
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;
ママんさんのソースをもとに以下のように変更することで解決しました。
どうもありがとうございました。
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;
ツイート | ![]() |