zoukankan      html  css  js  c++  java
  • c++下各种编码格式转换的方法

    1.利用c++11新特性 std::wstring_convert配合std::codecvt模板类

    作者:Gomo Psivarh
    链接:https://www.zhihu.com/question/39186934/answer/80443490
    来源:知乎
    著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。

    这两个模板类的功能是:
    std::wstring_convert:转码器,接收一个类似codecvt描述编码转换特性的模板参数,用于将本地化的宽字符wstring和指定编码的字节化string进行互转。
    std::codecvt:编码转换特性类,用在wstring_convert的模板参数中来指定使用哪种编码。

    所以编码A和B互转的实现方式就是:借助本地化宽字符串,先将以A编码的string转为本地化的wstring,再将本地化的wstring转为B编码后的string。

    codecvt一般使用下面两个特化子类:
    std::codecvt_utf8<wchar_t>:用于UTF8和本地化wchar_t的互转
    std::codecvt_byname<wchat_t, char, std::mbstate_t>:用于其他编码(例如GBK)和本地化wchar_t的互转,类的构造函数需要传入编码的locale name,由于编码的locale name是操作系统决定的(例如GBK在linux下的locale名可能是"zh_CN.GBK",而windows下是".936"),因此做跨平台的话仍然要给不同的系统做适配。

    这里给一个windows下,GBK string转UTF8 string的例子:
    首先将GBK string转wstring
    const char* GBK_LOCALE_NAME = ".936"; //GBK在windows下的locale name
    string gbk_str {"xCCxCC"};  //0xCCCC,"烫"的GBK码
    
    //构造GBK与wstring间的转码器(wstring_convert在析构时会负责销毁codecvt_byname,所以不用自己delete)
    wstring_convert<codecvt_byname<wchar_t, char, mbstate_t>> cv1(new codecvt_byname<wchar_t, char, mbstate_t>(GBK_LOCALE_NAME)); 
    wstring tmp_wstr = cv1.from_bytes(gbk_str);
    
    再将wstring转为UTF8 string
    wstring_convert<codecvt_utf8<wchar_t>> cv2;
    string utf8_str = cv.to_bytes(tmp_wstr);
    
    转码就完成了。utf8_str里的内容应该是"xE7x83xAB"(烫的UTF8)。
    2.用libiconv这个库(支持跨平台的)
  • 相关阅读:
    hibernate的dialect大全
    jdbc.properties 链接各类数据库的基本配置以及URL写法
    Springboot中redis的学习练习
    博客开通了
    Java String类的hashCode()函数
    Java String类中CaseInsensitiveComparator.compare()方法的实现
    git pull远程所有分支
    Python的权限修饰符
    Tmux快捷键
    __future__模块
  • 原文地址:https://www.cnblogs.com/wangshaowei/p/9012481.html
Copyright © 2011-2022 走看看