【求助】简体->繁体转换表及其使用方法 如题,求将简体unicode编码转成对应繁体big5编码的转换表及其使用方法,不够可再加分! 解决方案 » 免费领取超大流量手机卡,每月29元包185G流量+100分钟通话, 中国电信官方发货 如果你能找到 GB2312编码到BIG5转换的表,就容易制造出Unicode简体到BIG5转换表了。因为,在Windows里Unicode简体到GB2312转换是小事一件。 有个工具 Big52GB.exe, 用它可以实现GB2312 与 BIG5相互转换,可以用来制作一个 GB2312 to BIG5转换表。 Function Big52GB(BIG5Str: String): AnsiString;{进行big5转GB内码}Var Len: Integer; pBIG5Char: PChar; pGBCHSChar: PChar; pGBCHTChar: PChar; pUniCodeChar: PWideChar;Begin //String -> PChar pBIG5Char := PChar(BIG5Str); Len := MultiByteToWideChar(950, 0, pBIG5Char, -1, Nil, 0); GetMem(pUniCodeChar, Len * 2); ZeroMemory(pUniCodeChar, Len * 2); //Big5 -> UniCode MultiByteToWideChar(950, 0, pBIG5Char, -1, pUniCodeChar, Len); Len := WideCharToMultiByte(936, 0, pUniCodeChar, -1, Nil, 0, Nil, Nil); GetMem(pGBCHTChar, Len * 2); GetMem(pGBCHSChar, Len * 2); ZeroMemory(pGBCHTChar, Len * 2); ZeroMemory(pGBCHSChar, Len * 2); //UniCode->GB CHT WideCharToMultiByte(936, 0, pUniCodeChar, -1, pGBCHTChar, Len, Nil, Nil); //GB CHT -> GB CHS LCMapString($804, LCMAP_SIMPLIFIED_CHINESE, pGBCHTChar, -1, pGBCHSChar, Len); Result := String(pGBCHSChar); FreeMem(pGBCHTChar); FreeMem(pGBCHSChar); FreeMem(pUniCodeChar);End;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(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);End; To ahjoe:我找到了,还带转换程序的,但是转换一点效果都没有To laihongbo524:你的方法是GBK的简体转换为GBK的繁体的,编码仍然是GBK,在繁体平台显示仍然是乱码,我试过了的。 所以一定要找到GBK到Big5的转换表,而不是只简单的在GBK内部转! 在简体中文Windows里试了一下, laihongbo524(风铃夜思雨) 提供的代码可以实现在GBK编码范围内的简繁字转换。有了这个要做一个Unicode转Big5的表也不难了。 以GB2312编码范围为例1. 制造一个GB2312所有字符的文件,并给每个字符留下存储转码的空间类似结构 record cChar1: array [0..1] of Byte;//现在保存GB2312(最终将保存Unicode简体)cChar2: array [0..1] of Byte;//保存目标编码end;2. 利用laihongbo524的代码实现简繁转换, 转换后的繁体字保存在cChar2位置3. 将简体字与繁体字都转成Unicode, 在Windows里要进行本地编码与Unicode的转换就很简单了s: stringws: WideStringws := s;转换后, 保存Unicode简体在cChar1位置, Unicode繁体在 cChar2位置4. 在Big5系统下,再将cChar2位置的Unicode繁体字转成Big5编码,也是一样简单s: stringws: WideStrings := ws;转换后,保存Big5繁体在cChar2位置。5. 对最终生成的 Unicode -> Big5表按Unicode进行排序, 以加快使用时的查找速度 不好意思,搞错了laihongbo524提供的代码已经可以生成 Big5码了。 有谁知道如何判断某个字是属于GBK繁体还是属于BIG5呀? 请教一个D7写的DLL,调用出现Stack OverFlow的问题,谢谢! 怎么把资源(如图片)直接编译到exe中?最好有例子程序! 组织了一个群 欢迎大家加入啊: fastreport里面怎么加上下标? 文件操作:定义了个结构,但其中string[] 最大255个字符,太少了,怎么办? 关于模糊查询的!各位帮帮忙,先谢谢了! 再问防止字段值重复的问题 ★★★★★★★★晋升三星,散分!★★★★★★★★ windows消息的问题 不理解delphi中的面向对象,请解答? 在多线程中用SOCKET出现的问题 怎么在程序中签名?
因为,在Windows里Unicode简体到GB2312转换是小事一件。
{进行big5转GB内码}
Var
Len: Integer;
pBIG5Char: PChar;
pGBCHSChar: PChar;
pGBCHTChar: PChar;
pUniCodeChar: PWideChar;
Begin
//String -> PChar
pBIG5Char := PChar(BIG5Str);
Len := MultiByteToWideChar(950, 0, pBIG5Char, -1, Nil, 0);
GetMem(pUniCodeChar, Len * 2);
ZeroMemory(pUniCodeChar, Len * 2);
//Big5 -> UniCode
MultiByteToWideChar(950, 0, pBIG5Char, -1, pUniCodeChar, Len);
Len := WideCharToMultiByte(936, 0, pUniCodeChar, -1, Nil, 0, Nil, Nil);
GetMem(pGBCHTChar, Len * 2);
GetMem(pGBCHSChar, Len * 2);
ZeroMemory(pGBCHTChar, Len * 2);
ZeroMemory(pGBCHSChar, Len * 2);
//UniCode->GB CHT
WideCharToMultiByte(936, 0, pUniCodeChar, -1, pGBCHTChar, Len, Nil, Nil);
//GB CHT -> GB CHS
LCMapString($804, LCMAP_SIMPLIFIED_CHINESE, pGBCHTChar, -1, pGBCHSChar, Len);
Result := String(pGBCHSChar);
FreeMem(pGBCHTChar);
FreeMem(pGBCHSChar);
FreeMem(pUniCodeChar);
End;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(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);
End;
我找到了,还带转换程序的,但是转换一点效果都没有To laihongbo524:
你的方法是GBK的简体转换为GBK的繁体的,编码仍然是GBK,在繁体平台显示仍然是乱码,我试过了的。 所以一定要找到GBK到Big5的转换表,而不是只简单的在GBK内部转!
1. 制造一个GB2312所有字符的文件,并给每个字符留下存储转码的空间
类似结构
record
cChar1: array [0..1] of Byte;//现在保存GB2312(最终将保存Unicode简体)
cChar2: array [0..1] of Byte;//保存目标编码
end;
2. 利用laihongbo524的代码实现简繁转换, 转换后的繁体字保存在cChar2位置
3. 将简体字与繁体字都转成Unicode, 在Windows里要进行本地编码与Unicode的转换就很简单了
s: string
ws: WideString
ws := s;
转换后, 保存Unicode简体在cChar1位置, Unicode繁体在 cChar2位置
4. 在Big5系统下,再将cChar2位置的Unicode繁体字转成Big5编码,也是一样简单
s: string
ws: WideString
s := ws;
转换后,保存Big5繁体在cChar2位置。
5. 对最终生成的 Unicode -> Big5表按Unicode进行排序, 以加快使用时的查找速度
laihongbo524提供的代码已经可以生成 Big5码了。