• 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之前。

    改过后:一切正常!

      

  • 相关阅读:
    set转成toarray()
    list和set的拉拉扯扯的关系
    【转载】VNC和远程桌面的区别
    笔记本最小安装centos7 连接WiFi的方法
    mysql 索引优化 性能调优 锁
    PageHelper 自动去掉排序参数问题
    抽奖算法 百万次抽奖 单线程环境下 约 3.5 秒
    gitlab 安装和使用
    sharding sphere 分表分库 读写分离
    mycat 安装 分表 分库 读写分离
  • 原文地址:https://www.cnblogs.com/cuish/p/3768664.html
Copyright © 2020-2023  润新知