我很难解析xml文件。
该文件已使用UTF-8编码保存。
正常ASCII正确读取,但韩文字符不正确。
所以我制作了一个简单的程序来读取UTF-8文本文件并打印内容。
ABC가나다
#include <fstream>
#include <iostream>
#include <string>
#include <iterator>
#include <streambuf>
const char* hex(char c) {
const char REF[] = "0123456789ABCDEF";
static char output[3] = "XX";
output[0] = REF[0x0f & c>>4];
output[1] = REF[0x0f & c];
return output;
}
int main() {
std::cout << "File(ifstream) : ";
std::ifstream file("test.txt");
std::string buffer((std::istreambuf_iterator<char>(file)), std::istreambuf_iterator<char>());
for (auto c : buffer) {
std::cout << hex(c)<< " ";
}
std::cout << std::endl;
std::cout << buffer << std::endl;
//String literal
std::string str = "ABC가나다";
std::cout << "String literal : ";
for (auto c : str) {
std::cout << hex(c) << " ";
}
std::cout << std::endl;
std::cout << str << std::endl;
return 0;
}
File(ifstream) : 41 42 43 EA B0 80 EB 82 98 EB 8B A4
ABC媛?섎떎
String literal : 41 42 43 B0 A1 B3 AA B4 D9
ABC가나다
输出表示字符在字符串文字和文件中的编码方式不同。
据我所知,在c ++中char
字符串以UTF-8编码,因此我们可以通过printf
或cout
查看它们。所以他们的字节应该是相同的,但它们实际上是不同的......
有没有办法使用std::ifstream
阅读UTF-8文本文件?
我在this article之后使用std::wifstream
成功解析了xml文件。
但是我使用的大多数库只支持const char*
字符串,因此我正在寻找另一种使用std::ifstream
的方法。
我还读过this article说不要使用wchar_t
。将char
字符串视为多字节字符就足够了。
答案 0 :(得分:2)
编码&#34; ABC가나다&#34;使用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序列,但此序列符合您的终端编码,因此您可以看到您的预期。
PS:我使用https://mothereff.in/utf-8以十六进制表示字符串的UTF-8表示。