C++ 读取文件数据或文件名中文乱码问题

#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++ 标准库中的类,用于创建和管理特定的区域设置对象。
  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值