首页 新闻 论坛 群组 Blog 文档 下载 读书 Tag 网摘 搜索 .NET Java 游戏 视频 人才 外包 培训 数据库 书店 程序员
中国软件网
欢迎您:游客 | 登录 注册 帮助
  • 字符编码问题,BIG5=》Unicode,Unicode=》BIG5,达人们来挑战吧? [已结贴,结贴人:jiefangtw]
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    • jiefangtw
    • 等级:
    • 可用分等级:
    • 总技术分:
    • 总技术分排名:
    • 揭贴率:
    发表于:2008-08-20 14:23:11 楼主
    最近遇到的问题:以下所有编码,都以二进制格式为准。

    首先从SQL库内部数据表读取到一个字符串“簙吹”(二进制编码是:19 7c 10 e7 39 54),
    其次要把这个编码转换成BIG5码显示出来,这个字符串的BIG5码格式是“漢克斯”(二进制格式:BA 7E A7 4A B4 B5),
    为了通用性,最后我需要把这个字符串转换成Unicode格式的编码,以便程序后期的处理,“漢克斯”(22 6f 4b 51 af 65)。

    我的系统使用的是 UNICODE 格式,也就是说默认的字符串格式是 wchar_t(宽字符),而不是char(窄字符)。

    我自己做了一个转换方法,该方法在简体中文的Windows上没有问题,到繁体中文Windows上就转换失败了。我的关键代码贴在下面:如果各位有什么解决方法或者指出我的错误所在,不胜感激!!!

    C/C++ code
    int nBig5BufLen = ::WideCharToMultiByte( CP_OEMCP, 0, (wchar_t *)pchSource, nSourceLen, NULL, 0, NULL, NULL ); pchBig5 = new char[nBig5BufLen + 1]; memset( pchBig5, 0, nBig5BufLen + 1 ); nDebugLen[1] = ::WideCharToMultiByte( CP_OEMCP, 0, (wchar_t *)pchSource, nSourceLen, pchBig5, nBig5BufLen, NULL, NULL );//简体windows和繁体windows就是这一步的转换结果有区别 nBig5Len = -1; int nUcs2Len = ::MultiByteToWideChar( 950, 0, pchBig5, nBig5Len, NULL, 0 ); //950就是传说中的BIG5码所对应的编号 wchar_t * pwchUcs2 = new wchar_t[nUcs2Len + 1]; memset( pwchUcs2, 0, sizeof(wchar_t) * (nUcs2Len + 1) ); nDebugLen[3] = ::MultiByteToWideChar( 950, 0, pchBig5, nBig5Len, pwchUcs2, nUcs2Len ); //950就是传说中的BIG5码所对应的编号


    PS:以前的问题经常不能得到任何回答,这次先用50分,有理想答案了,开转帖上分!
    50  修改 删除 举报 引用 回复
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    • veloting
    • 等级:
    • 可用分等级:
    • 总技术分:
    • 总技术分排名:
    发表于:2008-08-20 15:15:431楼 得分:10
    帮你up一下
    修改 删除 举报 引用 回复
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    • jiefangtw
    • 等级:
    • 可用分等级:
    • 总技术分:
    • 总技术分排名:
    发表于:2008-08-20 17:03:582楼 得分:0
    看来这个问题又要流产了!阿窗!
    修改 删除 举报 引用 回复
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    • npuhuxl
    • 等级:
    • 可用分等级:
    • 总技术分:
    • 总技术分排名:
    发表于:2008-08-20 23:14:563楼 得分:10

    帮顶!
    修改 删除 举报 引用 回复
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    • jiefangtw
    • 等级:
    • 可用分等级:
    • 总技术分:
    • 总技术分排名:
    发表于:2008-08-21 09:50:474楼 得分:0
    貌似没有人做过多语言支持吗?
    修改 删除 举报 引用 回复
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    • oo
    • 等级:
    • 可用分等级:
    • 总技术分:
    • 总技术分排名:
    发表于:2008-08-21 10:00:225楼 得分:10
    ::WideCharToMultiByte( CP_OEMCP //这里为什么不是用 950 ?
    修改 删除 举报 引用 回复
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    • nowplaycn
    • 等级:
    • 可用分等级:
    • 总技术分:
    • 总技术分排名:
    发表于:2008-08-21 11:28:176楼 得分:20
    1 你的操作系统是gbk的还是big5的内码?是否安装了big5的国家代码的支持?
    2 转换失败,用GetLastError()去看出错码是什么?

    -----------------------------------------------------------
    《征服C/C++企业软件开发核心技术》
    主题词 unix/linux 多线程 网络通讯 数据库 内存排错和性能分析
    http://www.khp.com.cn/books/detail.asp?bookid=1707
    修改 删除 举报 引用 回复
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    • jiefangtw
    • 等级:
    • 可用分等级:
    • 总技术分:
    • 总技术分排名:
    发表于:2008-08-21 16:21:357楼 得分:0
    我继续缩小了问题范围,如下:

    C/C++ code
    wchar_t *wchSource = _M("漢克斯"); char chTest[12]; memset( chTest, 0, sizeof(chTest) ); wchar_t wchTest[4]; memset( wchTest, 0, sizeof(wchTest) ); // 第一步 int n2 = ::WideCharToMultiByte( 950 , 0, wchSource, -1, chTest, 10, 0, 0 ); // 第二步 int n1 = ::MultiByteToWideChar( 0, 0, chTest, -1, wchTest, 4 );


    现在的问题是:
    如果以上代码在简体Windows环境下,结果是:
    // wchSource里存储的是 UNICODE 码(22 6f 4b 51 af 65) //宽字节
    // chTest 里存储的是 BIG5    码(ba 7e a7 4a b4 b5) //窄字节
    // wchTest 里存储的是 **      码(19 7c 10 e7 39 54) //宽字节
    如果在繁体Windows环境下,结果是:
    // wchSource里存储的是 UNICODE 码(22 6f 4b 51 af 65) //宽字节
    // chTest 里存储的是 BIG5    码(ba 7e a7 4a b4 b5) //窄字节
    // wchTest 里存储的是 UNICODE 码(22 6f 4b 51 af 65) //宽字节

    也就是说在第二步的时候,不同的系统调用出现了不同的结果。
    那位碰到过类似的问题,给解释下!不胜感激!

    修改 删除 举报 引用 回复
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    • jiefangtw
    • 等级:
    • 可用分等级:
    • 总技术分:
    • 总技术分排名:
    发表于:2008-09-05 09:34:348楼 得分:0
    算了,我使用了替代方法把问题解决了,谢谢各位!
    修改 删除 举报 引用 回复

    网站简介广告服务网站地图帮助联系方式诚聘英才English 问题报告
    北京创新乐知广告有限公司 版权所有 京 ICP 证 070598 号
    世纪乐知(北京)网络技术有限公司 提供技术支持
    Copyright © 2000-2008, CSDN.NET, All Rights Reserved