2008-10-03 62 views
23

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

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

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

我该如何解决这个问题?

回答

25

不幸的是,没有办法使Unicode成为Windows中的当前代码页。 CP_UTF7CP_UTF8常数是伪代码页,仅在MultiByteToWideCharWideCharToMultiByte转换函数中使用,如Ben提到的。

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

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

10

所有的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; 
} 

而且类似形式的东西转换回。

-4

使用cygwin(默认情况下提供UTF-8语言环境),或者为Windows编写自己的libc hack,以执行必要的UTF-8转换为UTF-16转换并包装非标准_wfopen等功能。

+2

真的吗?你会建议吗? – 2014-05-25 08:20:55