mingl0280
V2EX  ›  C

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

  •  
  •   mingl0280 · Mar 19, 2018 · 2486 views
    This topic created in 2979 days ago, the information mentioned may be changed or developed.

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

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

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

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

    1,不是所有的全角符号都有一一对应的字符集转换。
    2,检查你的代码,该用 wchar 的时候不要用 char。接口不要混淆使用。
    zado
        2
    zado  
       Mar 19, 2018
    我也经常要用这两个函数,的确很容易搞混。下面不同的组合都试一下吧:
    MultiByteToWideChar(CP_UTF8,...//UTF8->UNICODE
    MultiByteToWideChar(CP_ACP,...//GBK->UNICODE
    WideCharToMultiByte(CP_UTF8,...//UNICODE->UTF8
    WideCharToMultiByte(CP_ACP,...//UNICODE->GBK
    ysc3839
        3
    ysc3839  
       Mar 19, 2018   ❤️ 1
    @zado 代码有问题 CP_ACP 不一定是 GBK,在其他语言的环境中会出问题。如果你确定是 GBK 的话就用 936。
    About   ·   Help   ·   Advertise   ·   Blog   ·   API   ·   FAQ   ·   Solana   ·   3194 Online   Highest 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 38ms · UTC 10:53 · PVG 18:53 · LAX 03:53 · JFK 06:53
    ♥ Do have faith in what you're doing.