C++ 如何使用std::ifstream读取UTF-8编码的文本文件?
我很难解析xml文件 该文件以UTF-8编码保存 正常ASCII码读取正确,但韩语字符不正确 所以我做了一个简单的程序来读取UTF-8文本文件并打印内容 文本文件(test.txt) 测试程序 输出表示字符串文字和文件中的字符编码不同 <> P>根据我所知,在C++中代码> char < /COD>字符串在UTF-8中编码,这样我们就可以通过代码> Prtff<代码>或<代码> cOUT/CODE>看到它们。所以它们的字节应该是相同的,但实际上它们是不同的 有没有办法使用C++ 如何使用std::ifstream读取UTF-8编码的文本文件?,c++,string,encoding,utf-8,ifstream,C++,String,Encoding,Utf 8,Ifstream,我很难解析xml文件 该文件以UTF-8编码保存 正常ASCII码读取正确,但韩语字符不正确 所以我做了一个简单的程序来读取UTF-8文本文件并打印内容 文本文件(test.txt) 测试程序 输出表示字符串文字和文件中的字符编码不同 P>根据我所知,在C++中代码> char < /COD>字符串在UTF-8中编码,这样我们就可以通过代码> Prtff或 cOUT/CODE>看到它们。所以它们的字节应该是相同的,但实际上它们是不同的 有没有办法使用std::ifstream读取UTF-8文本
std::ifstream
读取UTF-8文本文件?
我成功地使用下面的
std::wifstream
解析了xml文件
但是我使用的大多数库只支持constchar*
string,所以我正在寻找另一种使用std::ifstream
的方法
我也读到过这样的话,不要使用wchar\u t
。将char
字符串视为多字节字符就足够了。编码“ABC”가나다" 使用UTF-8应该会让您
"\x41\x42\x43\xEA\xB0\x80\xEB\x82\x98\xEB\x8B\xA4"
因此,您得到的文件内容是正确的。问题在于源文件编码。您不允许在字符串文本中使用非ascii符号,例如,您应该在它们前面加上u8以获得UTF-8文本:
u8"ABC가나다"
此时,我假设您使用的是Windows,否则编码就不会有任何问题。您必须将终端字符集更改为UTF-8:
chcp 65001
在您的案例中,您正在将UTF-8文本从文件读入字符串,然后将其打印到非unicode终端,而非unicode终端无法按预期显示。当您打印字符串文字时,您正在打印非unicode序列,但此序列编码与您的终端编码相匹配,因此您可以看到您的体验特德
PS:我曾经用十六进制表示字符串的UTF-8。在读取文件数据之前,您应该将UTF-8区域设置为
std::ifstream
。您还需要imbue()
将UTF-8区域设置为std::cout
,和/或将终端的字符集设置为UTF-8。您的ifstream
输出对于UTF-8是正确的(UTF-8编码形式为ABC가나다
实际上是12个字节)。字符串文字示例无法生成正确的输出,因为它受制于源代码文件保存为的字符集以及终端的字符集,两者均未使用UTF-8。这没有意义。如果文件以UTF8编码,并且您想以8位字符读取它(`char的std::string
)作为UTF8,您只需读取字符而不进行转换。您到底想实现什么?如果您在Windows上,您可能必须以二进制模式打开文件以防止某些字符转换。我从来没有遇到过使用文件流读取UTF-8
的问题。@RemyLebeau MSVC运行时不支持Unicode区域设置,因此他唯一让UTF-8Locale对象注入流的方法是使用Boost.locale,这对于这样简单的任务来说太难了。
"\x41\x42\x43\xEA\xB0\x80\xEB\x82\x98\xEB\x8B\xA4"
u8"ABC가나다"
chcp 65001