如何將BIG5碼中文字轉為GB碼,再將該GB碼轉為其unicode ? |
答題得分者是:mustapha.wang
|
ry_lee
高階會員 發表:368 回覆:251 積分:123 註冊:2002-03-19 發送簡訊給我 |
大家好: 我有從網路download可供delphi呼叫以將BIG5碼中文字轉為GB碼,但如何再將該GB碼轉為其unicode ?
1.請問win api之MultiByteToWideChar函數可否將GB碼轉為unicode ?還是僅能將BIG5碼中文字轉為unicode ?還是均不可轉換?
2.如果MultiByteToWideChar函數不可將GB碼轉為unicode,那麼那裡可download可供delphi呼叫之函數可將GB碼轉為unicode?
3.或是那裡有可直接將BIG5碼中文字轉為GB碼之unicode ?
4.那裡有可將GB碼之unicode轉為GB碼?
|
sryang
尊榮會員 發表:39 回覆:762 積分:920 註冊:2002-06-27 發送簡訊給我 |
引言: 大家好: 我有從網路download可供delphi呼叫以將BIG5碼中文字轉為GB碼,但如何再將該GB碼轉為其unicode ? 1.請問win api之MultiByteToWideChar函數可否將GB碼轉為unicode ?還是僅能將BIG5碼中文字轉為unicode ?還是均不可轉換? 2.如果MultiByteToWideChar函數不可將GB碼轉為unicode,那麼那裡可download可供delphi呼叫之函數可將GB碼轉為unicode? 3.或是那裡有可直接將BIG5碼中文字轉為GB碼之unicode ? 4.那裡有可將GB碼之unicode轉為GB碼?1, 2. 可以,把 MultiByteToWideChar 的第一個參數傳入 936,就可以把 GB 碼轉成Unicode 3. 如果只考慮轉碼,不考慮繁簡寫法不同的話,可以用下列程式 function Big5ToGB(sBig5: string): string; var ws: array[0..32767] of WideChar; s: array[0..65535] of char; begin ZeroMemory(@ws, Length(ws) * SizeOf(WideChar)); ZeroMemory(@s, Length(s) * SizeOf(char)); MultiByteToWideChar(950, MB_COMPOSITE, PChar(sBig5), -1, @ws, Length(ws)); WideCharToMultiByte(936, WC_COMPOSITECHECK, @ws, -1, @s, Length(s), '?', PBOOL(false)); result := s; end;若要達到轉換後轉繁簡寫法不同的話,以上程式不適用 4. WideCharToMultiByte,第一個參數傳入 936 有關 code page 請看 Windows SDK Help 中 IsValidCodePage 的說明 加油喔,喵~
------
歡迎參訪 "腦殘賤貓的備忘錄" http://maolaoda.blogspot.com/ |
ry_lee
高階會員 發表:368 回覆:251 積分:123 註冊:2002-03-19 發送簡訊給我 |
謝謝sryang : 我有試著呼叫你寫的function Big5ToGB(sBig5: string),以把BIG5碼轉為GB碼,結果是部份文字轉成功部份文字轉失敗(空白)Why ? (PS:都是很常見之自) ,但呼叫以前下載(CVCODE.zip)之Function Big5ToGB 全部文字轉成功,Why ?
引言: 1, 2. 可以,把 MultiByteToWideChar 的第一個參數傳入 936,就可以把 GB 碼轉成Unicode 3. 如果只考慮轉碼,不考慮繁簡寫法不同的話,可以用下列程式function Big5ToGB(sBig5: string): string; var ws: array[0..32767] of WideChar; s: array[0..65535] of char; begin ZeroMemory(@ws, Length(ws) * SizeOf(WideChar)); ZeroMemory(@s, Length(s) * SizeOf(char)); MultiByteToWideChar(950, MB_COMPOSITE, PChar(sBig5), -1, @ws, Length(ws)); WideCharToMultiByte(936, WC_COMPOSITECHECK, @ws, -1, @s, Length(s), '?', PBOOL(false)); result := s; end;若要達到轉換後轉繁簡寫法不同的話,以上程式不適用 4. WideCharToMultiByte,第一個參數傳入 936 有關 code page 請看 Windows SDK Help 中 IsValidCodePage 的說明 加油喔,喵~ |
sryang
尊榮會員 發表:39 回覆:762 積分:920 註冊:2002-06-27 發送簡訊給我 |
引言: 謝謝sryang : 我有試著呼叫你寫的function Big5ToGB(sBig5: string),以把BIG5碼轉為GB碼,結果是部份文字轉成功部份文字轉失敗(空白)Why ? (PS:都是很常見之自) ,但呼叫以前下載(CVCODE.zip)之Function Big5ToGB 全部文字轉成功,Why ?此方法只適用於 BIG5 碼和 GBK 碼中都有這個字而且寫法一樣的情形 此時,BIG5 轉成 Unicode 再轉成 GBK 時,在 GBK 中有對應的字,才能轉換成功 如果繁簡寫法不同,繁簡寫法的 Unicode 就不同,不適用這種轉換方法 同理,若 GBK 中沒有和 BIG5 對應寫法相同的字時,也不適用這種轉換方法,會轉出空白 而 CVCODE 中用的方法是查表法,只要對照表無誤,就可以順利轉換 加油喔,喵~
------
歡迎參訪 "腦殘賤貓的備忘錄" http://maolaoda.blogspot.com/ |
mustapha.wang
資深會員 發表:89 回覆:409 積分:274 註冊:2002-03-13 發送簡訊給我 |
简体操作系统下,
对GB2312,把 MultiByteToWideChar 的第一個參數傳入 936,得到的不是UNICODE,而是GBK的简体
同样,对Big5,传入950,得到的也是GBK的繁体,不是UNICODE,
只有把结果再用UTF8Encode函数,转一下,才得到UNICODE(UTF8),
你把结果放到一个htm文件,在IE里试试就知道了,套用不同的编码,看到不一样的乱码 在简体系统,转成GBK的繁体,CharSet用Default就能显示“繁体”了,但由于这个“繁体”是BGK的“繁体”,拿到繁体操作系统(Big5)下,一样会是乱码< > 如果用 >< > < src="http://delphi.ktop.com.tw/loadfile.php?TOPICID=10543105&CC=235795">
久病成良医--多试
千人之诺诺,不如一士之谔谔--兼听
------
江上何人初见月,江月何年初照人 |
mustapha.wang
資深會員 發表:89 回覆:409 積分:274 註冊:2002-03-13 發送簡訊給我 |
在GBK里的繁简型,还需要用LCMapString这个API来转化:
function UnicodeEncode(Str:string;CodePage:integer):WideString; var Len:integer; begin Len:=Length(Str)+1; SetLength(Result,Len); Len:=MultiByteToWideChar(CodePage,0,PChar(Str),-1,PWideChar(Result),Len); SetLength(Result,Len-1); //end is #0 end; function UnicodeDecode(Str:WideString;CodePage:integer):string; var Len:integer; begin Len:=Length(Str)*2+1; //one for #0 SetLength(Result,Len); Len:=WideCharToMultiByte(CodePage,0,PWideChar(Str),-1,PChar(Result),Len,nil,nil); SetLength(Result,Len-1); end; function Gb2Big5(Str:string):string; begin SetLength(Result,Length(Str)); LCMapString(GetUserDefaultLCID,LCMAP_TRADITIONAL_CHINESE, PChar(Str),Length(Str), PChar(Result),Length(Result)); Result:=UnicodeDecode(UnicodeEncode(Result,936),950); end; function Big52Gb(Str:string):string; begin Str:=UnicodeDecode(UnicodeEncode(Str,950),936); SetLength(Result,Length(Str)); LCMapString(GetUserDefaultLCID,LCMAP_SIMPLIFIED_CHINESE, PChar(Str),Length(Str), PChar(Result),Length(Result)); end;久病成良医--多试 千人之诺诺,不如一士之谔谔--兼听
------
江上何人初见月,江月何年初照人 |
本站聲明 |
1. 本論壇為無營利行為之開放平台,所有文章都是由網友自行張貼,如牽涉到法律糾紛一切與本站無關。 2. 假如網友發表之內容涉及侵權,而損及您的利益,請立即通知版主刪除。 3. 請勿批評中華民國元首及政府或批評各政黨,是藍是綠本站無權干涉,但這裡不是政治性論壇! |