首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >如何使用std::ifstream读取UTF-8编码的文本文件?

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

Stack Overflow用户
提问于 2017-04-08 15:59:37
回答 1查看 17.1K关注 0票数 8

我很难解析xml文件。

该文件用UTF-8编码保存.

正常的ASCII是正确的,但韩国字符不是。

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

文本文件(test.txt)

代码语言:javascript
运行
复制
ABC가나다

测试程序

代码语言:javascript
运行
复制
#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;
}

输出

代码语言:javascript
运行
复制
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文本文件的方法?

我成功地使用std::wifstream这篇文章之后解析了xml文件。

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

我还读过这篇文章说过不要使用wchar_t。将char字符串视为多字节字符就足够了.

EN

回答 1

Stack Overflow用户

发布于 2017-10-10 20:54:59

使用UTF-8编码"ABC가나다“应该会给您

代码语言:javascript
运行
复制
"\x41\x42\x43\xEA\xB0\x80\xEB\x82\x98\xEB\x8B\xA4"

所以你得到的文件的内容是正确的。问题在于源文件编码。您不允许在字符串文本中使用非ascii符号,您应该在它们前面加上u8以获得UTF-8文字:

代码语言:javascript
运行
复制
u8"ABC가나다"

此时,我假设您正在使用Windows,否则您将不会遇到编码问题。您必须将终端字符集更改为UTF-8:

代码语言:javascript
运行
复制
chcp 65001

在您的情况下发生的情况是,您正在将UTF-8文本从一个文件读取到一个字符串,然后将其打印到无法按预期显示的非unicode终端。当您打印字符串文字时,您正在打印非unicode序列,但此序列与您的终端编码匹配,因此您可以看到您期望的结果。

PS:我用https://mothereff.in/utf-8得到了你的六角线的UTF-8表示。

票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/43296237

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档