mingl0280
V2EX  ›  C

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

By mingl0280 at 2018 年 3 月 19 日 · 2786 次点击

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

! ‘ ’ ! “ ” [ ] = - 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*

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

拢隆 隆庐 隆炉 拢隆隆掳 隆卤 隆戮 隆驴 隆垄 隆拢 拢卢 拢禄 拢潞 隆颅隆颅 隆陇 
第 1 条附言  ·  2018 年 3 月 19 日
第二个是我自己搞错了,输进去的字符串进行了二次 unicode 转换导致的
不过第一个尚未解决
3 条回复  •  2018-03-19 12:58:26 +08:00
sgissb1
   1
sgissb1  
   2018 年 3 月 19 日
字符集问题,还有存储方式的问题。

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