You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在C++中读取包含UTF-8字符的TXT文件?

读取UTF-8文件的现代C++解决方案

问题分析

你遇到的std::locale::empty()是C17前的过时API,std::codecvt_utf8<wchar_t>也在C17中被标记为过时;直接用std::wifstream读取UTF-8文件输出空白,是因为默认locale不支持UTF-8到宽字符的转换。下面提供两种现代解决思路:


方案1:C++20 原生UTF-8支持(推荐)

C20引入了char8_t类型和对UTF-8的原生支持,无需手动处理编码转换,是最标准的现代方案(要求编译器支持C20,如GCC 11+、Clang 14+、MSVC 2022+)。

#include <fstream>
#include <string>
#include <iostream>

int main() {
    // 用char8_t专属的流读取UTF-8文件
    std::basic_ifstream<char8_t> file("utf8_file.txt");
    if (!file.is_open()) {
        std::cerr << "无法打开文件" << std::endl;
        return 1;
    }

    // 读取整个文件内容到u8string
    std::u8string content(
        std::istreambuf_iterator<char8_t>(file),
        std::istreambuf_iterator<char8_t>()
    );

    // 输出到控制台(需确保控制台支持UTF-8显示,Windows下可执行chcp 65001)
    std::cout.write(
        reinterpret_cast<const char*>(content.data()),
        content.size()
    );
    std::cout << std::endl;

    return 0;
}

方案2:兼容旧C++版本的替代方案

如果无法使用C++20,可通过默认locale替代过时的locale::empty(),配合codecvt_utf8<wchar_t>实现转换(虽然该API标记为过时,但主流编译器仍持续支持)。

#include <fstream>
#include <string>
#include <wstring>
#include <locale>
#include <iostream>

int main() {
    std::wifstream file("utf8_file.txt");
    if (!file.is_open()) {
        std::cerr << "无法打开文件" << std::endl;
        return 1;
    }

    // 用当前全局locale作为基础,替换编码转换facet
    std::locale loc(std::locale(), new std::codecvt_utf8<wchar_t>);
    file.imbue(loc);

    // 读取内容到宽字符串
    std::wstring content(
        std::istreambuf_iterator<wchar_t>(file),
        std::istreambuf_iterator<wchar_t>()
    );

    // 输出宽字符(需控制台支持宽字符编码)
    std::wcout << content << std::endl;

    return 0;
}

补充说明

  • 如果需要完全避免过时API,可考虑使用第三方国际化库(如ICU),提供更全面的编码处理能力。
  • 控制台显示UTF-8内容时,需确保控制台的编码设置与文件一致(Windows默认是GBK,需切换为UTF-8;Linux/macOS默认支持UTF-8)。

内容的提问来源于stack exchange,提问作者Nikita Developer

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.30 03:23:32