efo*_*nis 26
不幸的是,没有办法使Unicode成为Windows中的当前代码页.的CP_UTF7和CP_UTF8常数是伪代码页,仅在所用的MultiByteToWideChar和调用WideCharToMultiByte转换功能,像本提及.
您的问题类似于fstream C++类的问题.fstream构造函数只接受char*名称,因此无法打开具有真正Unicode名称的文件.VC提供的唯一解决方案是黑客攻击:单独打开文件,然后将句柄设置为流对象.当然,我担心这不是你的选择,因为第三方库可能不接受句柄.
我能想到的唯一解决方案是创建一个非Unicode名称的临时文件,该文件与原始文件硬链接,并将其用作参数.
Ben*_*aub 11
所有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;
}
Run Code Online (Sandbox Code Playgroud)
和类似的形式转换回来.
2018 更新:Windows 10 分两步让“65001”代码页少了“伪”:
conhost更改:适用于 Linux 的 Windows 子系统对其控制台使用代码页 65001。它也可以运行chcp 65001在cmd.exe自WSL。(它导致了一些非常愚蠢的 Python 错误。)