在windows和linux上通过c ++读取UTF8文件

我有一些使用UTF-8编码的文本文件。 有没有办法使用c ++stream类来读取它们(例如wifstream)?

我看到一些外部引用如boost和一些codeproject代码片段。 但是,我不想仅仅为了这个目的而使用它。

在Linux上它通过调用imbue(std :: locale(“en_US”))而不是在Windows上工作。 我认为问题是,窗口假定wifstream是一个UTF-16编码stream。 我不能指定用wifstream类unicode编码,以便它使用UTF-8而不是UTF-16?

除了正常读取文件中的字节,并将它们视为UTF-8(例如,不要将它们传递给任何期望使用locale编码的字符串的东西,仅适用于期望使用UTF-8的东西),Windows还有另一种读取方式在UTF-8。

您可以在文件描述符上设置“UTF-8”模式,然后在该文件描述符上使用宽字符输入和输出,而Microsoft的C运行库将处理将宽字符转换为UTF-8编码的字节流以及从UTF-8编码的字节流转换宽字符:

 #include <fcntl.h> #include <io.h> #include <stdio.h> int main(void) { _setmode(_fileno(stdout), _O_U8TEXT); wprintf(L"\x043a\x043e\x0448\x043a\x0430 \x65e5\x672c\x56fd\n"); } 

如果你运行上面的程序,输出重定向到一个文件,你将得到一个UTF-8编码的文件。

在文件描述符中设置这些Unicode模式之一对控制台会产生额外的影响,宽字符输出实际上可以在控制台上工作。 我不确定为什么微软选择“破”作为默认,但至少有一种方法来启用“不破”模式。

你可以正常阅读Windows上的utf8文件 – 唯一的问题是当你想要做什么与他们。

几乎所有的Windows API调用都使用UTF16或MBCS,只要将它传递给Windows API,就需要转换UTF8-MBCS – 请参阅将C-Strings从本地编码转换为UTF8