繁体   English   中英

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

[英]Read UTF8 files on windows and linux through c++

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

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

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

除了正常读取文件中的字节,并将它们视为UTF-8(例如,通过不将它们传递给任何需要区域设置编码字符串的东西,只传递给期望UTF-8的东西),Windows还有另一种方法可以读取在UTF-8中。

您可以在文件描述符上设置“UTF-8”模式,然后在该文件描述符上使用宽字符输入和输出,Microsoft的C运行时将处理将宽字符转换为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字符串从本地编码转换为UTF8

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM