内码转换:C++内码的转换技术



、基本概念

GB2312码

全称是GB2312-80信息交换用汉字编码集基本集1980年发布是中文信息处理国家标准在大陆及海外使用简体中文地区(如新加坡等)是强制使用中文编码P-Windows3.2和苹果OS就是以B2312为基本汉字编码 Windows 95/98则以GBK为基本汉字编码、但兼容支持GB2312GB码共收录6763个简体汉字、682个符号其中汉字部分:级字3755以拼音排序 2级字3008以偏旁排序该标准制定和应用为规范标准、推动中文信息化进程起了很大作用1990年又制定了繁体字编码标准GB12345-90信息交换用汉字编码集第辅助集在于规范标准必须使用繁体字各种场合以及古籍整理等该标准共收录6866个汉字(比GB2312多103个字其它厂商字库大多不包括这些字)纯繁体字大概有2200余个(2312集和12345集不是相交个是简体个是繁体)

穞abBIG5编

是目前台湾、香港地区普遍使用种繁体汉字编码标准包括440个符号级汉字5401个、 2级汉字7652个共计13060个汉字Big-5 是个双字节编码方案其第字节值在 16 进制 A0~FE 的间第 2字节在 40~7E 和 A1~FE 的间因此其第字节最高位是 1第 2字节最高位则可能是 1也可能是 0

穞abGBK编码(Chinese Internal Code Specication)

GBK编码(俗称大集)是中国大陆制订、等同于UCS中文编码扩展国家标准GBK工作小组于1995年10月同年12月完成GBK规范标准该编码标准兼容GB2312共收录汉字21003个、符号883个并提供1894个造字码位简、繁体字融于Windows95/98简体中文版字库表层编码就采用是GBK通过GBK和UCS的间对应码表和底层字库联系其第字节值在 16 进制 81~FE 的间第 2字节在 40~FE除去xx7F线

穞abUnicode编码(Universal Multiple Octet Coded Character Set)

国际标准组织于1984年4月成立ISO/IEC JTC1/SC2/WG2工作组针对各国文字、符号进行统性编码1991年美国跨国公司成立Unicode Consortium并于1991年10月和WG2达成协议采用同编码字集目前Unicode是采用16位编码体系集内容和ISO10646BMP(Basic Multilingual Plane)相同Unicode于1992年6月通过DIS(Draf International Standard)目前版本V2.0于1996公布内容包含符号6811个汉字20902个韩文拼音11172个造字区6400个保留20249个共计65534个

2、些注解

在此解释下我们常见些汉字内码转换工具:

1、最常见是GB2Big5和Big52GB转换工具这里GB指是GB2312集

2、 GBK简体兼容GB2312集及其编码不规范标准理解为GB就是GBK简体

3、繁体不等同于Big5在GBK集中也有繁体GB12345集也有繁体但这 3者汉字编码方式区别

Windows95/98/NT/2000(简体中)中使用都是GBK集;繁体版使用是Big5在简体版中无法正常显示Big5繁体版无法显示GB

4、在IE中进入Big5码网站WebSite(如:台湾网站WebSite)如果安装有Big5集支持IE会将Big5网页转换成GBK繁体显示没有则是乱码IE以GBK繁体显示时在网页中输入汉字应当是GBK繁体以Big5码显示时(乱码)要输入Big5码(输入乱码?先输入GBK简体----GB码再使用小工具将其转换成Big5拷贝粘贴即可)

5、常见小工具中可将Big5转换成GBK繁体不多可将GBK简体繁体相互转换也不多其原因是他们是将GB2312集和Big5集建立了对应关系

3、内码转换原理及思路方法

内码转换:就是在区别集的间建立种对应关系

以GBK2Big5(简繁体都可)

如:让字在GBK中编码是C8C3如果我们将GBK码表中变成Big5码格式则C8C3位上应该是攍och 让攠字Big5码攠琵攠(琵字不是GBK中而是攠让攠字Big5码汉字在GBK环境中显示结果)这样我们读出要转换文字在GBK(已经转换成Big5格式)码表中找到它位置取出该位置上将原替换即可

读写不是问题关键是如何在码表文件中对该汉字进行定位和如何将纯GBK码表转换成Big5格式表示GBK码表

问题、对汉字进行定位

GBK 代码表(按代码顺序排列) 81-87 88-8F 90-97 98-9F A0-A7 A8-AF B0-B7 B8-BF

C0-C7 C8-CF D0-D7 D8-DF E0-E7 E8-EF F0-F7 F8-FE

81 0 1 2 3 4 5 6 7 8 9 A B C D E F

4 丂 丄 丅 丆 丏 丒 丗 丟 丠 両 丣 並 丩 丮 丯 丱

5 丳 丵 丷 丼 乀 乁 乂 乄 乆 乊 乑 乕 乗\ 乚 乛 乢

6 乣 乤 乥 乧 乨 乪 乫 乬 乭 乮 乯 乲 乴 乵 乶 乷

7 乸 乹 乺 乻 乼 乽 乿 亀 亁 亂 亃 亄 亅 亇 亊  

8 亐 亖 亗 亙 亜 亝 亞 亣 亪 亯 亰 亱 亴 亶 亷 亸

9 亹 亼 亽 亾 仈 仌 仏 仐 仒 仚 仛 仜 仠 仢 仦 仧

A 仩 仭 仮 仯 仱 仴 仸 仹 仺 仼 仾 伀 伂 伃 伄 伅

B 伆 伇 伈 伋 伌 伒 伓 伔 伕 伖 伜 伝 伡 伣 伨 伩

C 伬 伭 伮 伱 伳 伵 伷 伹 伻 伾 伿 佀 佁 佂 佄 佅

D 佇 佈 佉 佊 佋 佌 佒 佔 佖 佡 佢 佦 佨 佪 佫 佭

E 佮 佱 佲 併 佷 佸 佹 佺 佽 侀 侁 侂 侅 來 侇 侊

F 侌 侎 侐 侒 侓 侕 侖 侘 侙 侚 侜 侞 侟 価 侢  

以上是按代码顺序排列GBK码表共126个区每区190个汉字汉字位置计算如下:

posit = (ch1 - 129) * 190 + (ch2 - 64) - (ch2/128);(第n 个汉字)

posit = posit * 2; (第n个字节)

个问题就算搞定

问题 2、将GBK码表用Big5来表示

我们可以利用现有工具如东方快车3000将GBK码表转换成Big5格式但实际中有问题GBK较Big5汉字要多那么在GBK中有而Big5中没有在转换中可能被删除那上面后码表定位就不能用了而且实际上几乎无法定位不过我在网上找到了个以Big5表示GBK码表文本(可能是官方)个不缺



这个问题也搞定了

同样我们可以进行

Big52GBKT(繁体)Big52GBKS(简体)GBKS2GBKTGBKT2GBKSGBK2BIG5转化这里给出Big5码表格式和定位算法:

BIG-5 代码表 A0-A7 A8-AF B0-B7 B8-BF C0-C7 C8-CF

D0-D7 D8-DF E0-E7 E8-EF F0-F7 F8-FE

(已被转化成GBK)B0 0 1 2 3 4 5 6 7 8 9 A B C D E F

4 虔 蚊 蚪 蚓 蚤 蚩 蚌 蚣 蚜 衰 衷 袁 袂 衽 衹 記

5 訐 討 訌 訕 訊 託 訓 訖 訏 訑 豈 豺 豹 財 貢 起

6 躬 軒 軔 軏 辱 送 逆 迷 退 迺 迴 逃 追 逅 迸 邕

7 郡 郝 郢 酒 配 酌 釘 針 釗 釜 釙 閃 院 陣 陡  

A   陛 陝 除 陘 陞 隻 飢 馬 骨 高 鬥 鬲 鬼 乾 偺

B 偽 停 假 偃 偌 做 偉 健 偶 偎 偕 偵 側 偷 偏 倏

C 偯 偭 兜 冕 凰 剪 副 勒 務 勘 動 匐 匏 匙 匿 區

D 匾 參 曼 商 啪 啦 啄 啞 啡 啃 啊 唱 啖 問 啕 唯

E 啤 唸 售 啜 唬 啣 唳 啁 啗 圈 國 圉 域 堅 堊 堆

F 埠 埤 基 堂 堵 執 培 夠 奢 娶 婁 婉 婦 婪 婀  




定位思路方法:



((ch2 >= 64)&&(ch2 <= 126))

{

posit = (ch1 - 160) * 157 + (ch2 - 64);

posit = posit * 2 - 1;

}

((ch2 >= 161)&&(ch2 <= 254))

{

posit = (ch1 - 160) * 157 + 62 + (ch2 - 160);

posit = posit * 2 - 1;

}




在这里给出GBK2Big5CBuilder:



fGBK2Big5 = fopen(\"pureGBK2Big5byOrder.txt\", \"rb\");

unsigned long i,posit;//把gb码转换为gbkT

unsigned char ch1,ch2;

String sContext;

char chr;

sContext = Memo1->Lines->Text;

i=1;

while(i < sContext.Length)

{

ch1 = sContext[i];

ch2 = sContext[i+1];

((ch1 >= 129)&&(ch1 <= 254))

{

(((ch2 >= 64)&&(ch2 < 127)) ||((ch2 > 127)&&(ch2 <= 254)))

{

posit = (ch1 - 129) * 190 + (ch2 - 64) - (ch2/128);

posit = posit * 2;

((posit > 23940*2) || (posit < 0))

{

i;

continue;

}

fseek(fGBK2Big5, posit - ftell(fGBK2Big5), 1);

fread((void *)(&chr), (char), 1, fGBK2Big5);

sContext[i] = chr;

fread((void *)(&chr), (char), 1, fGBK2Big5);

sContext[i+1] = chr;

i 2;

}{

i;

}

}{

i;

}

}

Memo1->Lines->Text=sContext;



delphi中将UCS2编码串转化为GB2312编码简单思路方法

function Ucs2ToGBK(const InValue: ): ;
var
I: Integer;
begin
Result := \'\';
for I := 1 to length(InValue) div 2 - 1 do
Result := Result + WideChar(StrToInt(\'$\' + IntToHex(Ord(InValue[2 * I - 1]), 2)
+ IntToHex(Ord(InValue[2 * I]), 2)));
end;


生成GBK码表


program GenGBKCode;
{$APPTYPE CONSOLE}
uses
SysUtils;
Var
i, j: ;
mFile: textfile;
begin
AssignFile(mFile, \'GBKCode.txt\');
Rewrite(mFile);
{
GBK集范围
分区 高位 低位
----------------------------------------------
●GBK/1:GB2312非汉号: A1~A9 || A1~FE
●GBK/2:GB2312汉字 : B0~F7 || A1~FE
●GBK/3:扩充汉字 : 81~A0 || 40~FE
●GBK/4:扩充汉字 : AA~FE || 40~A0
●GBK/5:扩充非汉字 : A8~A9 || 40~A0
}
for i := $A1 to $A9 do
for j := $A1 to $FE do
Write(mFile, chr(i), chr(j));
for i := $B0 to $F7 do
for j := $A1 to $FE do
Write(mFile, chr(i), chr(j));
for i := to $A0 do
for j := to $FE do
Write(mFile, chr(i), chr(j));
for i := $AA to $FE do
for j := to $A0 do
Write(mFile, chr(i), chr(j));
for i := $A8 to $A9 do
for j := to $A0 do
Write(mFile, chr(i), chr(j));
Close(mFile);
end.



Tags:  内码转换软件 内码转换工具 内码转换器 内码转换

延伸阅读

最新评论

发表评论