怎么转换GB->GBK,BIG5->GBK,以及GBK繁体->GBK简体(200分)

  • 主题发起人 主题发起人 DreamTiger
  • 开始时间 开始时间
D

DreamTiger

Unregistered / Unconfirmed
GUEST, unregistred user!
GB和BIG5码互相转换是没有问题,但怎么跟GBK转换呢?
 
这个问题真怪,GBK是扩充的字符列表又不是汉字编码,何谈转换?
恕我愚钝,还请行家指教。
 
gbk繁体到简体总应该是可以吧。
 
还是不明白。
GBK本身就包含了所有的简体字和繁体字。
简体在每区按拼音排序,繁体在每区按部首排序。它们之间没有对应的关系。
也没有GBK繁体,GBK简体这种说法吧。
比如 飄(EF68) 和 飘(C6AE) 同在GBK中,只是区位不一样。
 
要是有一个简繁字对照查找表就好了,好象没人作,太麻烦了。
用程序也无法生成。
 
o*o:我就想知道GBK中繁体字跟简体字怎么对应着转换,呵呵。
 
Win2k不是不用考虑语言问题吗?
 
Tiger兄,我没有任何好办法,除非找到一个现成的LIB。
 
不好意思,说了那么多废话也没能实质上帮助你,我退出了。
此时场下一片嘘声。:-)
 
http://www.ccw.com.cn/99/tips/display.asp?dir=/99/tips/2k04/042102_13.asp
不知对你有无帮助……
 
用码对码查找法:
首先识别当前字的编码格式,再从对码表中找出对应GBK。
你可以参考:cvcode。
谁愿意花时间做码对码表?......(我举双脚表示不干,太..太....太累了)。
 
俺又回来了。下面是WIN2000的一个工具介绍。可以分析一下它的繁简对照表
藏在哪里,拿过来用。
“中文转码器”是一个非常好用工具,它可以将不同格式的中文编码信息相互转换,
通过这个工具我们可以将国标码转换为Big 5码、Unicode,或者是倒过来,而且程序
提供了简体中文和繁体中文字符的相互转换功能,是一个非常好用的工具。实际上这
项功能我们在Word2000中就接触过,这次只是将它移到了Win2000这个操作系统中。
不过这个工具的功能有些单薄,程序并不能很好地转换简体中文和Big 5中文的不同词
汇,如“软件”和“软体”等之间的相互转换。
  “中文转码器”的使用方法是非常简单的:首先从系统开始菜单中的“附件”组
中启动它,在“来源”标签项中设置需要转换的文件,或者单击“从剪贴板”按钮粘
贴来自剪贴板的信息,在“代码页”项中设置当前文本的编码形式。切换到“目标”
标签项,在其中设置输出文件的相关信息,该界面中的样式与“来源”标签项完全一
致,参考使用即可。此外,在“选项”标签项中提供了有关转换简、繁体字符、
半角/全角字符的相关设置,根据转换的内容选择即可。最后单击界面中的“立即转换”
按钮以完成转换。如果需要了解转换结果,可单击界面中的“察看”按钮,程序会给出
一个独立的窗口,并显示转换结果内容的。
 
可以这样生成繁简对照表:
1. 编程自动生成含全部中文字符的文本文件(繁体)
S := '';
for i := $81 to $FEdo
for j := $40 to $FEdo
S := S + Chr(i) + Chr(j);
把 S 存盘。
2. 利用现成繁简转换的工具生成对应文本(简体)
3. 编程得到自己的繁简对照表。
 
还是别发高论了,
哪位有现成的?:-)(别打)
 
// GB2312/BIG5 convert unit for Delphi 3
// ver 1.01
// By Tom Lee 1997/9/5
// E-Mail Address : Tomm.bbs@csie.nctu.edu.tw
// It is Freeware !
unit CVCode;
interface
function GBtoBIG5(value: string): string;
function BIG5toGB(value: string): string;
implementation
var
BIG5Order: array[0..14757] of Word;
GBOrder : array[0..8177] of Word;
function GBOffset(value: string): integer;
begin
if length(value) >= 2 then
Result := (Ord(value[1]) - 161) * 94 + (Ord(value[2]) - 161)
else
Result := -1;
end;

function BIG5Offset(value: string): integer;
begin
Result := -1;
if length(value) >= 2 then
begin
if (Ord(value[2]) >= 64) and (Ord(value[2]) <= 126) then
Result := (Ord(value[1]) - 161) * 157 + (Ord(value[2]) - 64);
if (Ord(value[2]) >= 161) and (Ord(value[2]) <= 254) then
Result := (Ord(value[1]) - 161) * 157 + 63 + (Ord(value[2]) - 161);
end
end;

function WordToString(value: Word): string;
begin
Result := Chr(Hi(value)) + Chr(Lo(Value));
end;

function isBIG5(value: string): Boolean;
begin
if (length(value)>=2) then
begin
if (value[1] < #161) then
Result := false
else
if ((value[2] >= #64) and (value[2] <= #126)) or ((value[2] >= #161) and (value[2] <= #254)) then
Result := true
else
Result := false
end
else
Result := false
end;

function isGB(value: string): Boolean;
begin
if (length(value)>=2) then
begin
if (value[1] <= #161) and (value[1] >= #247) then
Result := false
else
if (value[2] <= #161) and (value[2] >= #254) then
Result := false
else
Result := true
end
else
Result := true;
end;

function GBtoBIG5(value: string): string;
var
leng, idx : integer;
tmpStr : string[2];
Offset : integer;
output : string;
begin
output := '';
leng := length(value);
idx := 1;
while idx <= lengdo
begin
tmpStr := value[idx]+ value[idx + 1];
if isGB(tmpStr) then
begin
offset:=GBOffset(tmpStr);
if (offset >= 0) and (offset <= 8177) then
begin
output := output + WordToString(GBOrder[offset]);
inc(idx);
end
else
output := output + value[idx] ;
end
else
output := output + value[idx] ;
inc(idx, 1);
end;
Result := output;
end;

function BIG5toGB(value: string): string;
var
leng, idx : integer;
tmpStr : string[2];
output : string;
offset : integer;
begin
output := '';
leng := length(value);
idx := 1;
while idx <= lengdo
begin
tmpStr := value[idx]+ value[idx + 1];
if isBIG5(tmpStr) then
begin
offset:=BIG5Offset(tmpStr);
if (offset >= 0) and (offset <= 14757) then
begin
output := output + WordToString(BIG5Order[offset]);
inc(idx);
end
else
output := output + value[idx];
end
else
output := output + value[idx];
inc(idx);
end;
Result := output;
end;

initialization
BIG5Order[0] := $2020;
BIG5Order[1] := $A3AC;
BIG5Order[2] := $A1A2;
BIG5Order[3] := $A1A3;
BIG5Order[4] := $2020;
BIG5Order[5] := $A1A4;
..
..
..
..
BIG5Order[14753] := $2020;
BIG5Order[14754] := $2020;
BIG5Order[14755] := $2020;
BIG5Order[14756] := $2020;
BIG5Order[14757] := $2020;

GBOrder[0] := $2020;
GBOrder[1] := $A142;
GBOrder[2] := $A143;
GBOrder[3] := $A145;
GBOrder[4] := $A1C2;
GBOrder[5] := $A3BE;
..
..
..
GBOrder[8175] := $ECB8;
GBOrder[8176] := $C24D;
GBOrder[8177] := $2020;
GBOrder[8177] := $2020;

end.
 

Similar threads

回复
0
查看
1K
不得闲
回复
0
查看
873
不得闲
I
回复
0
查看
551
import
I
I
回复
0
查看
955
import
I
后退
顶部