V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
mingl0280
V2EX  ›  C

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

  •  
  •   mingl0280 · 2018-03-19 09:17:54 +08:00 · 1832 次点击
    这是一个创建于 2201 天前的主题,其中的信息可能已经有所发展或是发生改变。

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

    ! ‘ ’ ! “ ” [ ] = - 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-03-19 10:15:20 +08:00
    第二个是我自己搞错了,输进去的字符串进行了二次 unicode 转换导致的
    不过第一个尚未解决
    3 条回复    2018-03-19 12:58:26 +08:00
    sgissb1
        1
    sgissb1  
       2018-03-19 10:08:38 +08:00
    字符集问题,还有存储方式的问题。

    1,不是所有的全角符号都有一一对应的字符集转换。
    2,检查你的代码,该用 wchar 的时候不要用 char。接口不要混淆使用。
    zado
        2
    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
        3
    ysc3839  
       2018-03-19 12:58:26 +08:00   ❤️ 1
    @zado 代码有问题 CP_ACP 不一定是 GBK,在其他语言的环境中会出问题。如果你确定是 GBK 的话就用 936。
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   我们的愿景   ·   实用小工具   ·   3190 人在线   最高记录 6543   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 23ms · UTC 13:05 · PVG 21:05 · LAX 06:05 · JFK 09:05
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.