这段将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;
}


}
//---------------------------------------------------------------------------
...全文
546 8 打赏 收藏 转发到动态 举报
AI 作业
写回复
用AI写文章
8 条回复
切换为时间正序
请发表友善的回复…
发表回复
「已注销」 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内核,才不会乱码.

1,222

社区成员

发帖
与我相关
我的任务
社区描述
C++ Builder Windows SDK/API
社区管理员
  • Windows SDK/API社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧