Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/136.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 如何使用std::ifstream读取UTF-8编码的文本文件?_C++_String_Encoding_Utf 8_Ifstream - Fatal编程技术网

C++ 如何使用std::ifstream读取UTF-8编码的文本文件?

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文本

我很难解析xml文件

该文件以UTF-8编码保存

正常ASCII码读取正确,但韩语字符不正确

所以我做了一个简单的程序来读取UTF-8文本文件并打印内容

文本文件(test.txt) 测试程序 输出表示字符串文字和文件中的字符编码不同

<> P>根据我所知,在C++中代码> char < /COD>字符串在UTF-8中编码,这样我们就可以通过代码> Prtff<代码>或<代码> cOUT/CODE>看到它们。所以它们的字节应该是相同的,但实际上它们是不同的

有没有办法使用
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