全國最多中醫師線上諮詢網站-台灣中醫網
發文 回覆 瀏覽次數:1986
推到 Plurk!
推到 Facebook!

Hex 轉成中文字的怪問題

答題得分者是:mephise
vlvltemp
一般會員


發表:6
回覆:6
積分:2
註冊:2010-03-28

發送簡訊給我
#1 引用回覆 回覆 發表時間:2011-08-13 23:48:22 IP:114.39.xxx.xxx 訂閱
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

發送簡訊給我
#2 引用回覆 回覆 發表時間:2011-08-14 00:10:17 IP:122.126.xxx.xxx 訂閱
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

發送簡訊給我
#3 引用回覆 回覆 發表時間:2011-08-14 08:48:43 IP:220.137.xxx.xxx 訂閱
要顯示 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

發送簡訊給我
#4 引用回覆 回覆 發表時間:2011-08-14 14:56:21 IP:114.40.xxx.xxx 訂閱
非常的感謝 Victor4022 及 mephise 兩位大大快速的回文,
經我於 Delphi 2010 中測試,
2 位大大的方法都是正確的.
但由於只能選 1 位得分者,
我選擇 mephise
原因:
解法比較簡單易懂.
對 Victor4022 大大真的很抱歉,
我知您也位高手,
再次跟您說聲抱歉.
2 位大大謝謝您們.
系統時間:2024-04-25 4:44:56
聯絡我們 | Delphi K.Top討論版
本站聲明
1. 本論壇為無營利行為之開放平台,所有文章都是由網友自行張貼,如牽涉到法律糾紛一切與本站無關。
2. 假如網友發表之內容涉及侵權,而損及您的利益,請立即通知版主刪除。
3. 請勿批評中華民國元首及政府或批評各政黨,是藍是綠本站無權干涉,但這裡不是政治性論壇!