• C++ 中文乱码问题解决方案


    网上看了好多说转文件编码格式的,在我的项目中感觉不是很实用,下面那个我愿称其为终结解决方案

    解决方案

    思路:先将中文给到wstring,然后再转为string。完美

    环境:windows vs2019 C++19、C++11

    代码:

    #include 
    #include 
    // 需包含locale、string头文件、使用setlocale函数。
    
    // string转wstring
    std::wstring StringToWstring(const std::string str)
    {
        unsigned len = str.size() * 2; // 预留字节数
        setlocale(LC_CTYPE, "");       //必须调用此函数
        wchar_t* p = new wchar_t[len]; // 申请一段内存存放转换后的字符串
        mbstowcs(p, str.c_str(), len); // 转换
        std::wstring str1(p);
        delete[] p;// 释放申请的内存
        return str1;
    }
    
    // wstring转string
    std::string WstringToString(const std::wstring str)
    {
        unsigned len = str.size() * 4;
        setlocale(LC_CTYPE, "");
        char* p = new char[len];
        wcstombs(p, str.c_str(), len);
        std::string str1(p);
        delete[] p;
        return str1;
    }
    
    // 清空场景
    int main()
    {
        std::wstring a = L"你好"; // 宽字符标识 L
        std::string b =  WstringToString(a);
        // 这时候已经正常了,可以进行我们自己的操作了
        ···
        ···
    	return 0;
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33
    • 34
    • 35
    • 36
    • 37
    • 38

    扩展

    std::wstring和std::string是C++中两种表示字符串的不同类型。

    std::string是基于单字节字符的字符串类型,适用于存储和处理ASCII字符集中的字符。它使用标准的C-风格的字符串表示(以空字符’\0’结尾)。这意味着每个字符只占用一个字节的存储空间。

    std::wstring是宽字符字符串类型,用于存储和处理所有Unicode字符(包括中文字符)。它使用一个或多个宽字符编码来表示每个字符,通常使用UTF-16或UTF-32编码。宽字符类型的字符串可以容纳更广泛的字符范围,并提供了更好的支持多语言和国际化。

    在C++中,你可以根据需要选择std::string还是std::wstring来存储字符串数据。如果你需要处理中文字符或其他Unicode字符,建议使用std::wstring。然而,要注意库和函数的兼容性,因为不是所有的第三方库和函数都能支持std::wstring和宽字符编码。在这种情况下,你可能需要进行类型转换或使用其他字符串处理方法。

    总之,std::string适用于ASCII字符集,而std::wstring适用于更广泛的Unicode字符集,特别是处理非ASCII字符时会更有优势。

  • 相关阅读:
    Google Earth Engine(GEE)——ImageCollection (Error)遍历影像集合产生的错误
    java实现顺序表
    Zookeeper集群 + Kafka集群
    Linux-新建用户/群组以及修改文件权限
    NFT 的潜力:扩展的艺术品鉴定证书
    离子液体 [C6MIm]BF4/cas:244193-50-8/1-己基-3-甲基咪唑四氟硼酸盐黄色液体
    xmind梳理测试点,根据这些测试点去写测试用例
    手写RPC框架-注册中心实现
    Qt之Model/View架构
    配置自己的docker开发环境
  • 原文地址:https://blog.csdn.net/weixin_44404541/article/details/133852289