#include <iostream>
#include <fstream>
#include <sstream>
#include <string>
int main()
{
// 文件路径
std::wstring filename = L"example.txt"; // 宽字符字符串,以 L 开头
// 加上这句话,解决乱码问题 ,第一种写法
std::locale::global(std::locale("en_US.UTF-8")); // 这里设置成你系统环境,我电脑是英文系统所以设置成en_US,中文系统可以设置成zh_CN
// 创建宽字符文件输入流对象
std::wifstream file(filename);
//第二种写法
std::locale loc("en_US.UTF-8");
file.imbue(loc)
// 检查文件是否成功打开
if (!file.is_open()) {
std::wcerr << L"Failed to open the file: " << filename << std::endl;
return 1;
}
// 使用 wstringstream 保存文件内容
std::wstringstream buffer;
buffer << file.rdbuf(); // 将文件内容读取到 wstringstream 中
// 关闭文件流
file.close();
// 从 wstringstream 中获取文件内容的字符串表示
std::wstring file_content = buffer.str();
// 打印文件内容(可选)
std::wcout << L"File content:\n" << file_content << std::endl;
// 转string
std::wstring_convert<std::codecvt_utf8<wchar_t>, wchar_t> converter;
std::string narrow_str = converter.to_bytes(file_content);
// 输出转换后的窄字符内容
std::cout << "Narrow string: " << narrow_str << std::endl;
return 0;
}
如上述代码,有两种写法区别在于:
locale::global()
是 C++ 标准库提供的函数,用于设置全局的 C++ 标准库的区域设置;std::locale
是 C++ 标准库中的类,用于创建和管理特定的区域设置对象。