線上訂房服務-台灣趴趴狗聯合訂房中心
發文 回覆 瀏覽次數:6756
推到 Plurk!
推到 Facebook!

如何將BIG5碼中文字轉為GB碼,再將該GB碼轉為其unicode ?

答題得分者是:mustapha.wang
ry_lee
高階會員


發表:367
回覆:251
積分:123
註冊:2002-03-19

發送簡訊給我
#1 引用回覆 回覆 發表時間:2003-06-23 22:10:05 IP:61.59.xxx.xxx 未訂閱
大家好: 我有從網路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
尊榮會員


發表:38
回覆:742
積分:876
註冊:2002-06-27

發送簡訊給我
#2 引用回覆 回覆 發表時間:2003-06-24 01:24:45 IP:61.64.xxx.xxx 未訂閱
引言: 大家好: 我有從網路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
高階會員


發表:367
回覆:251
積分:123
註冊:2002-03-19

發送簡訊給我
#3 引用回覆 回覆 發表時間:2003-06-25 21:21:27 IP:61.59.xxx.xxx 未訂閱
謝謝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
尊榮會員


發表:38
回覆:742
積分:876
註冊:2002-06-27

發送簡訊給我
#4 引用回覆 回覆 發表時間:2003-06-28 23:30:02 IP:61.64.xxx.xxx 未訂閱
引言: 謝謝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
資深會員


發表:88
回覆:407
積分:274
註冊:2002-03-13

發送簡訊給我
#5 引用回覆 回覆 發表時間:2003-12-15 14:22:06 IP:218.1.xxx.xxx 未訂閱
简体操作系统下, 对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
資深會員


發表:88
回覆:407
積分:274
註冊:2002-03-13

發送簡訊給我
#6 引用回覆 回覆 發表時間:2004-06-28 14:23:34 IP:218.80.xxx.xxx 未訂閱
在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;
久病成良医--多试 千人之诺诺,不如一士之谔谔--兼听
系統時間:2017-11-19 22:16:57
聯絡我們 | Delphi K.Top討論版
本站聲明
1. 本論壇為無營利行為之開放平台,所有文章都是由網友自行張貼,如牽涉到法律糾紛一切與本站無關。
2. 假如網友發表之內容涉及侵權,而損及您的利益,請立即通知版主刪除。
3. 請勿批評中華民國元首及政府或批評各政黨,是藍是綠本站無權干涉,但這裡不是政治性論壇!