關於簡體文轉成繁體文的問題 |
尚未結案
|
hotswin
中階會員 發表:72 回覆:92 積分:52 註冊:2003-11-06 發送簡訊給我 |
小弟在網路上找了如下的轉換代碼,但是轉出來卻是變成亂碼,請問是怎麼回事呢?
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禮品贈品 編輯記錄
hotswin 重新編輯於 2009-05-15 23:05:39, 註解 無‧
|
max5020
資深會員 發表:30 回覆:277 積分:321 註冊:2003-06-04 發送簡訊給我 |
|
hotswin
中階會員 發表:72 回覆:92 積分:52 註冊:2003-11-06 發送簡訊給我 |
|
sryang
尊榮會員 發表:39 回覆:762 積分:920 註冊:2002-06-27 發送簡訊給我 |
|
歸木淡
中階會員 發表:1 回覆:49 積分:75 註冊:2005-09-07 發送簡訊給我 |
你把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 發送簡訊給我 |
本站聲明 |
1. 本論壇為無營利行為之開放平台,所有文章都是由網友自行張貼,如牽涉到法律糾紛一切與本站無關。 2. 假如網友發表之內容涉及侵權,而損及您的利益,請立即通知版主刪除。 3. 請勿批評中華民國元首及政府或批評各政黨,是藍是綠本站無權干涉,但這裡不是政治性論壇! |