gpt4 book ai didi

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

转载 作者:塔克拉玛干 更新时间:2023-11-03 00:42:51 40 4
gpt4 key购买 nike

我很难解析 xml 文件。

文件以 UTF-8 编码保存。

可以正确读取普通 ASCII,但不能正确读取韩文字符。

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

文本文件(test.txt)

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 编码,因此我们可以通过 printfcout 查看它们。所以它们的字节应该是相同的,但实际上它们是不同的......

有什么方法可以使用 std::ifstream 读取 UTF-8 文本文件吗?


我使用 this article 之后的 std::wifstream 成功解析了 xml 文件。

但我使用的大多数库仅支持 const char* 字符串,因此我正在寻找另一种使用 std::ifstream 的方法。

而且我还读到 this article 说不要使用 wchar_t 。将 char 字符串视为多字节字符就足够了。

最佳答案

使用 UTF-8 编码“ABC가나다”应该给你

"\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 表示。

关于c++ - 如何使用 std::ifstream 读取 UTF-8 编码的文本文件?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43296237/

40 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com