当前位置:  开发笔记 > 开发工具 > 正文

Windows中的UTF-8

如何解决《Windows中的UTF-8》经验,为你挑选了2个好方法。

如何在C Windows程序中将代码页设置为UTF-8?

我有一个第三方库,使用fopen打开文件.我可以使用wcstombs将我的Unicode文件名转换为当前代码页,但是如果用户的文件名在代码页之外有一个字符,则会中断.

理想情况下,我只需调用_setmbcp(65001)将代码页设置为UTF-8,但_setmbcp的MSDN文档声明不支持UTF-8.

我怎么能绕过这个?



1> efotinis..:

不幸的是,没有办法使Unicode成为Windows中的当前代码页.的CP_UTF7CP_UTF8常数是伪代码页,仅在所用的MultiByteToWideChar和调用WideCharToMultiByte转换功能,像本提及.

您的问题类似于fstream C++类的问题.fstream构造函数只接受char*名称,因此无法打开具有真正Unicode名称的文件.VC提供的唯一解决方案是黑客攻击:单独打开文件,然后将句柄设置为流对象.当然,我担心这不是你的选择,因为第三方库可能不接受句柄.

我能想到的唯一解决方案是创建一个非Unicode名称的临时文件,该文件与原始文件硬链接,并将其用作参数.



2> Ben Straub..:

所有Windows API都以UTF-16的形式思考,因此您最好在您的库周围编写一个包装器,以便在边界处进行转换.

奇怪的是,Windows认为UTF-8是用于转换目的的代码页,因此您使用与在代码页之间转换相同的API:

std::wstring Utf8ToUtf16(const char* u8string)
{
    int wcharcount = strlen(u8string);
    wchar_t *tempWstr = new wchar_t[wcharcount];
    MultiByteToWideChar(CP_UTF8, 0, u8string, -1, tempWstr, wcharcount);
    wstring w(tempWstr);
    delete [] tempWstr;
    return w;
}

和类似的形式转换回来.

推荐阅读
吻过彩虹的脸_378
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有