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);
    //同上,分配空间要给'\0'留个空间
    //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之前。

 

改过后:一切正常!

 

  

 

posted on   崔好好  阅读(1938)  评论(0编辑  收藏  举报

编辑推荐:
· AI与.NET技术实操系列:基于图像分类模型对图像进行分类
· go语言实现终端里的倒计时
· 如何编写易于单元测试的代码
· 10年+ .NET Coder 心语,封装的思维:从隐藏、稳定开始理解其本质意义
· .NET Core 中如何实现缓存的预热?
阅读排行:
· 25岁的心里话
· 闲置电脑爆改个人服务器(超详细) #公网映射 #Vmware虚拟网络编辑器
· 零经验选手,Compose 一天开发一款小游戏!
· 通过 API 将Deepseek响应流式内容输出到前端
· AI Agent开发,如何调用三方的API Function,是通过提示词来发起调用的吗

导航

< 2025年3月 >
23 24 25 26 27 28 1
2 3 4 5 6 7 8
9 10 11 12 13 14 15
16 17 18 19 20 21 22
23 24 25 26 27 28 29
30 31 1 2 3 4 5
点击右上角即可分享
微信分享提示