Hex 轉成中文字的怪問題 |
答題得分者是:mephise
|
vlvltemp
一般會員 發表:6 回覆:6 積分:2 註冊:2010-03-28 發送簡訊給我 |
Delphi 2010 程式碼:
procedure TForm1.Button1Click(Sender: TObject); Const hh:array[1..8] of byte=($61,$62,$43,$44,$B4,$FA,$B8,$D5); begin label1.Caption:=char(hh[1]) char(hh[2]) char(hh[3]) char(hh[4]); label2.Caption:=char(hh[5]) char(hh[6]) char(hh[7]) char(hh[8]); end; 其中 $61,$62,$43,$44 是 abCD 的 Hex,執行結果是 abCD 沒錯. 其中 $B4,$FA,$B8,$D5 是 "測試" 的 Hex,執行結果是亂碼,而不是中文字"測試" ?? 想問,如何將 $B4,$FA,$B8,$D5 於 Label 上顯示出中文 ?? 非常的感謝. |
Victor4022
中階會員 發表:0 回覆:76 積分:90 註冊:2011-02-20 發送簡訊給我 |
1. 因為您使用的是 Delphi 2010, Label.Caption 為1個字元為 2 bytes, 硬把"測試" 這2個字 4 bytes 的內容拆開成 "char(hh[5])+char(hh[6])+char(hh[7])+char(hh[8])" 4個字元 8 bytes , 內容當然是亂碼...
2. 您的"測試" -> $B4,$FA,$B8,$D5 是 Big5 的編碼. 3. 依照您的程式, 如果硬要把該 byte arry 轉成WideString 指定給 Delphi 2010 Label.Caption, 可以試試: [code delphi] procedure TForm1.FormCreate(Sender: TObject); Const hh:array[1..8] of byte=($61,$62,$43,$44,$B4,$FA,$B8,$D5); var W : WideString; S : AnsiString; U8 : Utf8String; begin SetLength(S, 4); CopyMemory(@S[1], @hh[5], 4); U8 := AnsiToUtf8(S); W := Utf8Decode(U8); end; [/code] ===================引 用 vlvltemp 文 章=================== Delphi 2010 程式碼: procedure TForm1.Button1Click(Sender: TObject); Const hh:array[1..8] of byte=($61,$62,$43,$44,$B4,$FA,$B8,$D5); begin label1.Caption:=char(hh[1]) char(hh[2]) char(hh[3]) char(hh[4]); label2.Caption:=char(hh[5]) char(hh[6]) char(hh[7]) char(hh[8]); end; 其中 $61,$62,$43,$44 是 abCD 的 Hex,執行結果是 abCD 沒錯. 其中 $B4,$FA,$B8,$D5 是 "測試" 的 Hex,執行結果是亂碼,而不是中文字"測試" ?? 想問,如何將 $B4,$FA,$B8,$D5 於 Label 上顯示出中文 ?? 非常的感謝. |
mephise
高階會員 發表:4 回覆:149 積分:205 註冊:2004-02-09 發送簡訊給我 |
要顯示 Big5 很簡單, 只要記得它是用 AsnisChar 來顯示就好
程式改成這樣就行 label2.Caption:=Ansichar(hh[5]) Ansichar(hh[6]) Ansichar(hh[7]) Ansichar(hh[8]); 你這段程式碼在 D1-D7 都是對的, 會顯示"測試", 因為 D1-D7 的 Char = AnsiChar 但是到了2009以後就有問題了, 因為 Char = WideChar 再多說一點, 比如說: var str: String; str := '這是測試'; Length(str) = ? 在 D7 中, 答案是8, 在2010中, 答案是4 這就是 Default Char Set 的不同. D7 預設是 Big5, 2010 是 UTF-16LE ===================引 用 vlvltemp 文 章=================== Delphi 2010 程式碼: procedure TForm1.Button1Click(Sender: TObject); Const hh:array[1..8] of byte=($61,$62,$43,$44,$B4,$FA,$B8,$D5); begin label1.Caption:=char(hh[1]) char(hh[2]) char(hh[3]) char(hh[4]); label2.Caption:=char(hh[5]) char(hh[6]) char(hh[7]) char(hh[8]); end; 其中 $61,$62,$43,$44 是 abCD 的 Hex,執行結果是 abCD 沒錯. 其中 $B4,$FA,$B8,$D5 是 "測試" 的 Hex,執行結果是亂碼,而不是中文字"測試" ?? 想問,如何將 $B4,$FA,$B8,$D5 於 Label 上顯示出中文 ?? 非常的感謝.
------
Mephise Chen 前興德工程師
編輯記錄
mephise 重新編輯於 2011-08-13 18:50:03, 註解 無‧
|
vlvltemp
一般會員 發表:6 回覆:6 積分:2 註冊:2010-03-28 發送簡訊給我 |
本站聲明 |
1. 本論壇為無營利行為之開放平台,所有文章都是由網友自行張貼,如牽涉到法律糾紛一切與本站無關。 2. 假如網友發表之內容涉及侵權,而損及您的利益,請立即通知版主刪除。 3. 請勿批評中華民國元首及政府或批評各政黨,是藍是綠本站無權干涉,但這裡不是政治性論壇! |