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

關於簡體文轉成繁體文的問題

尚未結案
hotswin
中階會員


發表:72
回覆:92
積分:52
註冊:2003-11-06

發送簡訊給我
#1 引用回覆 回覆 發表時間:2009-05-15 23:04:54 IP:220.134.xxx.xxx 訂閱
小弟在網路上找了如下的轉換代碼,但是轉出來卻是變成亂碼,請問是怎麼回事呢?
Delphi7下,使用TNT的控件,並附上源始碼供研究,謝謝


[code delphi]
請在此區域輸入程式碼
Function GB2Big5(GBStr: String): AnsiString;
{?行GB?BIG5??}
Var
Len: integer;
pGBCHTChar: PChar;
pGBCHSChar: PChar;
pUniCodeChar: PWideChar;
pBIG5Char: PChar;
Begin
pGBCHSChar := PChar(GBStr);
Len := MultiByteToWideChar(936, 0, pGBCHSChar, -1, Nil, 0);
GetMem(pGBCHTChar, Len * 2 1);
ZeroMemory(pGBCHTChar, Len * 2 1);
//GB CHS -> GB CHT
LCMapString($804, LCMAP_TRADITIONAL_CHINESE, pGBCHSChar, -1, pGBCHTChar, Len * 2);
GetMem(pUniCodeChar, Len * 2);
ZeroMemory(pUniCodeChar, Len * 2);
//GB CHT -> UniCode
MultiByteToWideChar(936, 0, pGBCHTChar, -1, pUniCodeChar, Len * 2);
Len := WideCharToMultiByte(950, 0, pUniCodeChar, -1, Nil, 0, Nil, Nil);
GetMem(pBIG5Char, Len);
ZeroMemory(pBIG5Char, Len);
//UniCode -> Big5
WideCharToMultiByte(950, 0, pUniCodeChar, -1, pBIG5Char, Len, Nil, Nil);
result := String(pBIG5Char);
FreeMem(pBIG5Char);
FreeMem(pGBCHTChar);
FreeMem(pUniCodeChar);
End;

Function GBCht2Chs(GBStr: String): AnsiString;
{?行GBK繁体??体}
Var
Len: integer;
pGBCHTChar: PChar;
pGBCHSChar: PChar;
Begin
pGBCHTChar := PChar(GBStr);
Len := MultiByteToWideChar(936, 0, pGBCHTChar, -1, Nil, 0);
GetMem(pGBCHSChar, Len * 2 1);
ZeroMemory(pGBCHSChar, Len * 2 1);
//GB CHS -> GB CHT
LCMapString($804, LCMAP_SIMPLIFIED_CHINESE, pGBCHTChar, -1, pGBCHSChar, Len * 2);
result := String(pGBCHSChar);
//FreeMem(pGBCHTChar);
FreeMem(pGBCHSChar);
End;

Function GBChs2Cht(GBStr: String): AnsiString;
{?行GBK?体?繁体}
Var
Len: integer;
pGBCHTChar: PChar;
pGBCHSChar: PChar;
Begin
pGBCHSChar := PChar(GBStr);
Len := MultiByteToWideChar(936, 0, pGBCHSChar, -1, Nil, 0);
GetMem(pGBCHTChar, Len * 2 1);
ZeroMemory(pGBCHTChar, Len * 2 1);
//GB CHS -> GB CHT
LCMapString($804, LCMAP_TRADITIONAL_CHINESE, pGBCHSChar, -1, pGBCHTChar, Len * 2);
result := String(pGBCHTChar);
FreeMem(pGBCHTChar);
//FreeMem(pGBCHSChar);
End;
[/code]
------
xinjier禮品贈品
附加檔案:4a0d84962a867_test.rar
編輯記錄
hotswin 重新編輯於 2009-05-15 23:05:39, 註解 無‧
max5020
資深會員


發表:30
回覆:277
積分:321
註冊:2003-06-04

發送簡訊給我
#2 引用回覆 回覆 發表時間:2009-05-16 20:20:10 IP:122.146.xxx.xxx 訂閱
http://delphi.ktop.com.tw/board.php?cid=161&fid=110&tid=4239
hotswin
中階會員


發表:72
回覆:92
積分:52
註冊:2003-11-06

發送簡訊給我
#3 引用回覆 回覆 發表時間:2009-05-16 21:21:26 IP:220.134.xxx.xxx 訂閱


下載Demo來測試簡体轉繁體仍然是亂碼,請問是怎麼回事呢?



===================引 用 max5020 文 章===================
http://delphi.ktop.com.tw/board.php?cid=161&fid=110&tid=4239
------
xinjier禮品贈品
sryang
尊榮會員


發表:39
回覆:762
積分:920
註冊:2002-06-27

發送簡訊給我
#4 引用回覆 回覆 發表時間:2009-05-25 02:08:59 IP:124.10.xxx.xxx 訂閱
Font.CharSet
要顯示繁體,應設定為 CHINESEBIG5_CHARSET
要顯示簡體,應設定為 GB2312_CHARSET
------
歡迎參訪 "腦殘賤貓的備忘錄" http://maolaoda.blogspot.com/
歸木淡
中階會員


發表:1
回覆:49
積分:75
註冊:2005-09-07

發送簡訊給我
#5 引用回覆 回覆 發表時間:2009-08-04 07:01:52 IP:130.132.xxx.xxx 訂閱
你把AnsiString直接交給WideString了,當然會錯
[code delphi]
TntMemo2.Text :=Gb2Big5(TntMemo1.Text);

Function GB2Big5(GBStr: String): AnsiString;
Var
Len: integer;
pGBCHTChar: PChar;
pGBCHSChar: PChar;
pUniCodeChar: PWideChar;
pBIG5Char: PChar;
Begin
pGBCHSChar := PChar(GBStr);
Len := MultiByteToWideChar(936, 0, pGBCHSChar, -1, Nil, 0);
GetMem(pGBCHTChar, Len * 2 1);
ZeroMemory(pGBCHTChar, Len * 2 1);
//GB CHS -> GB CHT
LCMapString($804, LCMAP_TRADITIONAL_CHINESE, pGBCHSChar, -1, pGBCHTChar, Len * 2);
GetMem(pUniCodeChar, Len * 2);
ZeroMemory(pUniCodeChar, Len * 2);
//GB CHT -> UniCode
MultiByteToWideChar(936, 0, pGBCHTChar, -1, pUniCodeChar, Len * 2);
Len := WideCharToMultiByte(950, 0, pUniCodeChar, -1, Nil, 0, Nil, Nil);
GetMem(pBIG5Char, Len);
ZeroMemory(pBIG5Char, Len);
//UniCode -> Big5
WideCharToMultiByte(950, 0, pUniCodeChar, -1, pBIG5Char, Len, Nil, Nil);
result := String(pBIG5Char);
FreeMem(pBIG5Char);
FreeMem(pGBCHTChar);
FreeMem(pUniCodeChar);
End;
[/code]在你的程序中,總共有五步轉換
1)TntMemo1.Text --> GBStr (WideString --> String, 系統內碼)
2)GBStr --> pGBCHSChar (String, GB --> WideString)
3)pGBCHSChar --> pGBCHTChar (WideString --> WideString 變繁)
4)pGBCHTChar --> pBIG5Char --> result (WideString --> String, Big5 --> String, Big5)
5)Result --> TntMemo2.Text (String, 系統內碼 --> WideString)

其中第一步要求系統內碼是GB,否則第二次便轉不了
而第五步要求系統內碼是BIG5,因為第四步的結果是BIG5
系統內碼只有一個,所以你的程序出錯是必然的

因為tntWare本身用的便是Unicode,所以真正要做的只有第三步,其他的轉換多餘且會引入錯誤。
[code delphi]
function TraditionalizeWideString(const Str:WideString):WideString;
begin
SetLength(Result,Length(Str));
LCMapStringW($404, LCMAP_TRADITIONAL_CHINESE,
PWideChar(Str), Length(Str), PWideChar(Result), Length(Result));
end;

TntMemo2.Text :=TraditionalizeWideString(TntMemo1.Text);
[/code]
熾冰
一般會員


發表:29
回覆:21
積分:10
註冊:2004-01-12

發送簡訊給我
#6 引用回覆 回覆 發表時間:2011-11-17 14:36:59 IP:220.130.xxx.xxx 訂閱
因為你輸入進去的不是GB 簡體碼
而是Unocide碼

因為簡體碼會Show亂碼

我試過這個程式它是正常的

能把GB碼 訧妎褪撮
轉成BIG碼 資識科技

編輯記錄
熾冰 重新編輯於 2011-11-16 23:38:36, 註解 無‧
系統時間:2024-11-21 16:54:22
聯絡我們 | Delphi K.Top討論版
本站聲明
1. 本論壇為無營利行為之開放平台,所有文章都是由網友自行張貼,如牽涉到法律糾紛一切與本站無關。
2. 假如網友發表之內容涉及侵權,而損及您的利益,請立即通知版主刪除。
3. 請勿批評中華民國元首及政府或批評各政黨,是藍是綠本站無權干涉,但這裡不是政治性論壇!