这段将UTF-8简体中文转码为UTF-8繁体中文的代码,为什么在繁体XP上转换出乱码?

「已注销」 2008-07-21 03:19:30
这段将UTF-8简体中文转码为UTF-8繁体中文的代码,为什么在繁体XP上转换出乱码,而在简体中文XP系统上毫无问题?

int __fastcall GB2GBK(char *szInBuf, int len, char**szOutBuf)
{
char * tempstr = new char[len+1];
if(len>=3 && szInBuf[0]=='\xEF' && szInBuf[1]=='\xBB' && szInBuf[2]=='\xBF')
{
memcpy(tempstr, &szInBuf[3], len);
tempstr[len-3] = 0;
}
else
{
memcpy(tempstr, szInBuf, len);
tempstr[len] = 0;
}
String src = Utf8ToAnsi(tempstr);
delete tempstr;
int nsrclen = src.Length();
char * szBuf = new char[nsrclen+1];
strcpy(szBuf, src.c_str());
int outlen = 0;


if(!strcmp(szBuf, ""))
{
*szOutBuf = new char[1];
return 0;
}
int nStrLen = mystrlen(szBuf);
WORD wLCID = MAKELCID(MAKELANGID
(LANG_CHINESE, SUBLANG_CHINESE_SIMPLIFIED), SORT_CHINESE_PRC);
//WORD wLCID = MAKELCID(MAKELANGID
// (LANG_CHINESE, SUBLANG_CHINESE_TRADITIONAL), SORT_CHINESE_BIG5);
int nReturn = LCMapString(wLCID, LCMAP_TRADITIONAL_CHINESE, szBuf, nStrLen, NULL, 0);
if(!nReturn)
{
*szOutBuf = new char[1];
return 0;
}
char *pcBuf = new char[nReturn + 1];
try
{
wLCID = MAKELCID(MAKELANGID
(LANG_CHINESE, SUBLANG_CHINESE_SIMPLIFIED), SORT_CHINESE_PRC);
//wLCID = MAKELCID(MAKELANGID
// (LANG_CHINESE, SUBLANG_CHINESE_TRADITIONAL), SORT_CHINESE_BIG5);
LCMapString(wLCID, LCMAP_TRADITIONAL_CHINESE, szBuf, nReturn, pcBuf, nReturn + 1);
//strncpy(szBuf, pcBuf, nReturn);
pcBuf[nReturn] = 0;

String dest = AnsiToUtf8(pcBuf);
outlen = dest.Length();
*szOutBuf = new char[outlen+1];
strncpy(*szOutBuf, dest.c_str(), outlen);
}
__finally
{
delete[] pcBuf;
delete[] szBuf;
return outlen;
}


}
//---------------------------------------------------------------------------
...全文
485 点赞 收藏 8
写回复
8 条回复
切换为时间正序
当前发帖距今超过3年,不再开放新的回复
发表回复
「已注销」 2008-07-21
OK,我先试试,先谢谢了。
回复
僵哥 2008-07-21
[Quote=引用 6 楼 shasure520 的回复:]
那么就是说,用你在3楼提出的方法,可以解决繁体中文XP系统的问题?
[/Quote]
是,但是前提是你的系统需要支持简体中文.
回复
「已注销」 2008-07-21
那么就是说,用你在3楼提出的方法,可以解决繁体中文XP系统的问题?
回复
僵哥 2008-07-21
[Quote=引用 4 楼 shasure520 的回复:]
主要是这段代码在简体中文WinXP上运行转换毫无问题,但是拿到繁体中文WinXP系统上就转换不了了
[/Quote]
在简体的XP当中CodePage是936当然不会有问题,但是繁体的XP其CodePage是950,能没有问题才怪。
回复
「已注销」 2008-07-21
主要是这段代码在简体中文WinXP上运行转换毫无问题,但是拿到繁体中文WinXP系统上就转换不了了
回复
僵哥 2008-07-21
Utf8ToAnsi
这个函数有问题,须自己手动写代码使用MultiByteToWideChar从Utf8转Unicode,再使用WideCharToMultiByte由Unicode转为GBK(CodePage:936),再Map到GBK繁体,然后再使用MultiByteToWideChar转为Unicode(CodePage:936),再通过WideCharToMultiByte由Unicode转为BIG5(CodePage:950).
回复
「已注销」 2008-07-21
那我的代码该怎么改进呢?
回复
fayfarn 2008-07-21
要将最后的结果转换为UTF-16,再直接调用Unicode版本的Windows API传递给Windows内核,才不会乱码.
回复
相关推荐
发帖
Windows SDK/API
创建于2007-08-02

1205

社区成员

C++ Builder Windows SDK/API
申请成为版主
帖子事件
创建了帖子
2008-07-21 03:19
社区公告
暂无公告