MultiByteToWideChar 和 WideCharToMultiByte 处理 UTF8/Unicode 字符串的时候,会出现一些奇怪的现象,请问如何解决?

2018-03-19 09:17:54 +08:00
 mingl0280

发生情况:一个全角的符号(感叹号,单引号之类的)后跟一个空格,例如

! ‘ ’ ! “ ” [ ] = - 0、 。 , ; : …… · (这里的所有引号请用全角)

这种情况下,MultiByteToWideChar 会输出一堆乱码出来

�?�?�?!�?�?�?�?= - 0 �?�?�?�?�?…�?% · 

这样的,请问有人知道怎么解决吗?

调用:

MultiByteToWideChar(CP_UTF8, 0, szUTF8, -1, pWcharTmp, nWcharCnt); //szUTF8 为 const char*的 UTF8 字面量

Unicode 的现象是

WideCharToMultiByte(CP_ACP, 0, szUCS2, -1, szGBK, nMB, NULL, NULL); //szGBK 是 char*,szUCS2 是 wchar_t*

处理上述的特殊字符串的时候,输出

拢隆 隆庐 隆炉 拢隆隆掳 隆卤 隆戮 隆驴 隆垄 隆拢 拢卢 拢禄 拢潞 隆颅隆颅 隆陇 
1972 次点击
所在节点    C
3 条回复
sgissb1
2018-03-19 10:08:38 +08:00
字符集问题,还有存储方式的问题。

1,不是所有的全角符号都有一一对应的字符集转换。
2,检查你的代码,该用 wchar 的时候不要用 char。接口不要混淆使用。
zado
2018-03-19 10:48:00 +08:00
我也经常要用这两个函数,的确很容易搞混。下面不同的组合都试一下吧:
MultiByteToWideChar(CP_UTF8,...//UTF8->UNICODE
MultiByteToWideChar(CP_ACP,...//GBK->UNICODE
WideCharToMultiByte(CP_UTF8,...//UNICODE->UTF8
WideCharToMultiByte(CP_ACP,...//UNICODE->GBK
ysc3839
2018-03-19 12:58:26 +08:00
@zado 代码有问题 CP_ACP 不一定是 GBK,在其他语言的环境中会出问题。如果你确定是 GBK 的话就用 936。

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/439241

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX