如何在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
相关产品推荐
相关产品推荐

