如何在C Windows程序中将代码页设置为UTF-8?
我有一个使用fopen打开文件的第三方库。 我可以使用wcstombs将我的Unicode文件名转换为当前代码页,但是如果用户在代码页之外具有一个字符的文件名,则会中断。
理想情况下,我只是调用_setmbcp(65001)将代码页设置为UTF-8,但是_setmbcp的MSDN文档声明不支持UTF-8。
我怎样才能解决这个问题?
不幸的是,在Windows中没有办法使Unicode成为当前的代码页。 CP_UTF7
和CP_UTF8
常量是伪代码页,仅在MultiByteToWideChar和WideCharToMultiByte转换函数中使用,如Ben提到的。
你的问题类似于fstream C ++类。 fstream构造函数只接受char*
名称,不可能用真正的Unicode名称打开文件。 VC提供的唯一解决方案是hack:单独打开文件,然后将句柄设置为流对象。 恐怕这不是你的选择,当然,因为第三方库可能不接受句柄。
我能想到的唯一解决方案是创建一个非Unicode名称的临时文件,该文件与原始文件很难链接,并将其用作参数。
所有的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; }
和一些类似的形式转换回来。
尝试使用#pragma设置代码页
你也可以添加一些细节? 如果我理解正确,你有一个第三方库,你可以改变,有一个函数,需要一个const char字符串,你想能够传递一个Unicode字符串?
使用cygwin(默认情况下提供UTF-8语言环境),或者为Windows编写自己的libc hack,以执行必要的UTF-8到UTF-16的转换,并封装非标准_wfopen
等功能。