免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
最近访问板块 发新帖
查看: 5004 | 回复: 3
打印 上一主题 下一主题

[C++] mbstowcs 可以代替 MultiByteToWideChar 吗? [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2016-03-29 19:01 |只看该作者 |倒序浏览
因为不是在电脑cpu上跑的程序,代码需要在其他设备中跑,设备中没有MultiByteToWideChar,所以需要实现类似MultiByteToWideChar的功能。只要考虑ANSI 0~127 的字符加上gb2312中文就好, utf-8等其他编码都不考虑。 MultiByteToWideChar的源码过于复杂看不懂(reactos里),所以想找个替代函数,并且是有源码的。于是找到了 mbstowcs,但测试结果不一样。下面是测试代码:
  1. #include <iostream>
  2. #include <string>
  3. using namespace std;

  4. #include <windows.h>

  5. std::wstring Ansi2WChar(LPCSTR pszSrc, int nLen)

  6. {
  7.         int nSize = MultiByteToWideChar(CP_ACP, 0, (LPCSTR)pszSrc, nLen, 0, 0);
  8.         if(nSize <= 0) return NULL;

  9.         WCHAR* pwszDst = new WCHAR[nSize + 1];
  10.         if(NULL == pwszDst) return NULL;

  11.         MultiByteToWideChar(CP_ACP, 0, (LPCSTR)pszSrc, nLen, pwszDst, nSize);
  12.         pwszDst[nSize] = 0;

  13.         if(pwszDst[0] == 0xFEFF) // skip Oxfeff
  14.                 for(int i = 0; i < nSize; i++)
  15.                         pwszDst[i] = pwszDst[i + 1];

  16.         std::wstring wcharString(pwszDst);
  17.         delete pwszDst;

  18.         return wcharString;
  19. }

  20. std::wstring s2ws(const std::string& s){
  21.         return Ansi2WChar(s.c_str(), s.size());
  22. }

  23. int main() {
  24.         string s = "一二三"; // 内存中为:d2 bb b6 fe c8 fd
  25.         { // 正确的结果
  26.                 wstring ws = s2ws(s); // 这里面用了 MultiByteToWideChar
  27.                 // 这里ws得到正确结果:  00 4e 8c 4e 09 4e
  28.         }
  29.         { // 错误的结果
  30.                 wchar_t wstr[100] = {0};
  31.                 std::mbstowcs(wstr, s.data(), s.size()); // 这里用了mbstowcs
  32.                 // 这里的wstr得到错误结果:d2 00 bb 00 b6 00 fe 00 c8 00 fd 00
  33.         }
  34. }
复制代码
中文 “一二三”
用MultiByteToWideChar得到: 00 4e 8c 4e 09 4e
用mbstowcs得到:d2 00 bb 00 b6 00 fe 00 c8 00 fd 00

不知道是哪里有问题?

论坛徽章:
44
15-16赛季CBA联赛之浙江
日期:2021-10-11 02:03:59程序设计版块每日发帖之星
日期:2016-07-02 06:20:0015-16赛季CBA联赛之新疆
日期:2016-04-25 10:55:452016科比退役纪念章
日期:2016-04-23 00:51:2315-16赛季CBA联赛之山东
日期:2016-04-17 12:00:2815-16赛季CBA联赛之福建
日期:2016-04-12 15:21:2915-16赛季CBA联赛之辽宁
日期:2016-03-24 21:38:2715-16赛季CBA联赛之福建
日期:2016-03-18 12:13:4015-16赛季CBA联赛之佛山
日期:2016-02-05 00:55:2015-16赛季CBA联赛之佛山
日期:2016-02-04 21:11:3615-16赛季CBA联赛之天津
日期:2016-11-02 00:33:1215-16赛季CBA联赛之浙江
日期:2017-01-13 01:31:49
2 [报告]
发表于 2016-03-29 19:29 |只看该作者
显然你当前locale不对。

论坛徽章:
14
巨蟹座
日期:2013-11-19 14:09:4615-16赛季CBA联赛之青岛
日期:2016-07-05 12:36:0515-16赛季CBA联赛之广东
日期:2016-06-29 11:45:542015亚冠之全北现代
日期:2015-07-22 08:09:472015年辞旧岁徽章
日期:2015-03-03 16:54:15巨蟹座
日期:2014-12-29 08:22:29射手座
日期:2014-12-05 08:20:39狮子座
日期:2014-11-05 12:33:52寅虎
日期:2014-08-13 09:01:31巳蛇
日期:2014-06-16 16:29:52技术图书徽章
日期:2014-04-15 08:44:01天蝎座
日期:2014-03-11 13:06:45
3 [报告]
发表于 2016-03-30 08:59 |只看该作者
windoze 说得很正确
我在mbstowcs之前加上 setlocale( LC_CTYPE, "" ); 就转化成功了,windows上用 setlocale( LC_CTYPE, "chs" ) 也行

论坛徽章:
0
4 [报告]
发表于 2016-03-30 11:01 |只看该作者
哦,多谢各位。看来是locale问题。
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP