繁简转换是老技术,但如果方法不当,还是得花一点时间的,本文尽量阐明其中的陷阱,减少新手的时间。
首先繁简转换不等于Big5 to GBK。GBK包含Big5中的所有繁体字,所以你平时看到的繁体不一定就是Big5的。word中的繁简转换就只是在GBK编码中进行。很多繁简转换的工具是Big5 to GBK,所以如果你的文本不是Big5编码的,那么转换结果肯定是乱码。在简体的操作系统上,你把“專案管理導出範本”这几个字复制到记事本中,这几个字其实是GBK编码,如果你想保存在BIG5编码的文件中,要复制到word中,点击另存为,将保存类型设为txt,接着word会出现一个对话框让你选择编码,选择big5即可。了解这一点后下一步就很容易了。
下面我们要把"專案管理導出範本.xls"转换成简体:
GBK编码的繁简转换方法(VC)
char *strTemp="專案管理導出範本.xls";
//把区域设置为简体
WORD wLCID = MAKELCID(MAKELANGID(LANG_CHINESE, SUBLANG_CHINESE_SIMPLIFIED), SORT_CHINESE_BIG5);
//获取转换后的字符串的长度。
//把字符串映射到简体编码之上。
int nReturn = LCMapString(wLCID, LCMAP_SIMPLIFIED_CHINESE, strTemp, k, NULL, 0);
char *myStr = new char[nReturn+1];//结果字符串
LCMapString(wLCID,LCMAP_SIMPLIFIED_CHINESE,
(LPCSTR)strTemp, nReturn,
(LPSTR)myStr, nReturn+1);
myStr[nReturn] = '/0';
AfxMessageBox(myStr);
如果你使用delphi,代码就更简单:
function Big52Gb(Str:string):string;
begin
SetLength(Result,Length(Str));
LCMapString(GetUserDefaultLCID,LCMAP_SIMPLIFIED_CHINESE,
PChar(Str),Length(Str),
PChar(Result),Length(Result));
end;
如果你执着于不使用API,要自己实现,那么首先要把GBK编码转换成BIG5编码,方法是先转换为Unicode,再转换为Big5(在此谢谢CSDN上的朋友):
CString Convert(CString str, int sourceCodepage, int targetCodepage)
{
int len=str.GetLength();
//先转成WideChar
//codepage按照什么来读取传入的字符串。
int unicodeLen=MultiByteToWideChar(sourceCodepage,0,str,-1,NULL,0);
wchar_t * pUnicode;
pUnicode=new wchar_t[unicodeLen+1];
memset(pUnicode,0,(unicodeLen+1)*sizeof(wchar_t));
MultiByteToWideChar(sourceCodepage,0,str,-1,(LPWSTR)pUnicode,unicodeLen);
//再转成二进制流(或者说是字符流,就是最终的字符。)
BYTE * pTargetData;
int targetLen=WideCharToMultiByte(targetCodepage,0,(LPWSTR)pUnicode,-1,(char *)pTargetData,0,NULL,NULL);
pTargetData=new BYTE[targetLen+1];
memset(pTargetData,0,targetLen+1);
WideCharToMultiByte(targetCodepage,0,(LPWSTR)pUnicode,-1,(char *)pTargetData,targetLen,NULL,NULL);
CString rt;
rt.Format("%s",pTargetData);
delete pUnicode;
delete pTargetData;
return rt;
}
得到Big5编码的字符串后,你就可以进行Big5 to GB的转换了,详细算法描述见 GBK字符集知识(http://www.hacker.com.cn/article/list.asp?id=3697)。网上还有现成的VC、java、python实现源代码,在此不再赘述。