zoukankan      html  css  js  c++  java
  • Unicode转为UTF8

    Unicode转换为UTF8

    要说这个转换也简单,使用WideCharToMultiByte两次或者直接一次就可以转换。 今天在弄VLC的时候,由于VLC的视频文件名使用UTF8编码,因此当路径中包含中文的时候(其播放函数的参数为char*),直接使用 char*(ANSI) 或者 用WCHAR*(UNICODE)  将UNICODE转为ANSI的char*都不行。

    有事上网查得知VLC用了UTF8,英文数字用都用1个字节,中文用3个字节来编码。

    于是很容易想到用WideCharToMultiByte(CP_UTF8,...)来转换,于是开始动手搞:

    const char* Unicode2UTF8(const WCHAR* wszString)
    { 
        //预转换,得到所需空间的大小,这次用的函数和上面名字相反
        int u8Len = ::WideCharToMultiByte(CP_UTF8, NULL, wszString, -1, NULL, 0, NULL, NULL);
        //同上,分配空间要给''留个空间
        //UTF8虽然是Unicode的压缩形式,但也是多字节字符串,所以可以以char的形式保存
        char* szU8 = new char[u8Len + 1];
        if(NULL == szU8) return NULL;
    
        ZeroMemory(szU8, sizeof(char) * (u8Len + 1));
        //转换
        //unicode版对应的strlen是wcslen
        ::WideCharToMultiByte(CP_UTF8, NULL, wszString, -1, szU8, u8Len + 1, NULL, NULL); 
    
        return szU8;
    }

     

     单步调试的时候发现:最后的szU8中,路径中的中文为乱码!  上网查,得知在单步调试的时候,调试器看到char*还会认为是ANSI,所以用ANSI编码来解读,所以看到的是乱码。

    所以直接使用了此代码,发现报【断言失败】,看不出在哪里断言失败的。

    经过查看代码发现是在ASSERT(PathFileExists(lpFileName))这里报断言失败,即不存在此文件!

    于是一(ˇ?ˇ) 想, 这里的lpFileName为转换后的UTF8的编码,那就先把此行注释掉,把检测文件是否存在的操作放到Unicode2UTF8之前。

    改过后:一切正常!

      

  • 相关阅读:
    最短路径的三种实现方法
    c/c++小知识
    c++ char * const p问题
    C++ typedef 四个用途
    [转]c++面向对象基础
    [转]C++中引用(&)的用法和应用实例
    表情包。
    linux基础学习
    redis缓存在项目中的使用
    关于redis
  • 原文地址:https://www.cnblogs.com/cuish/p/3768664.html
Copyright © 2011-2022 走看看