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 {"\xCC\xCC"}; //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里的内容应该是"\xE7\x83\xAB"(烫的UTF8)。

2.用libiconv这个库(支持跨平台的)

最新文章

  1. 尝试在你浏览器的Console(F12)中运行一下,你会发现页面被不同的颜色块高亮了(css调试中学到的js)
  2. gem sources --add http://ruby.taobao.org/
  3. Swift微博项目--Swift中通过类名字符串创建类以及动态加载控制器的实现
  4. Android高工必备技能
  5. 3xian之所在(转)
  6. TableLayout(表格布局)
  7. Facebook 的系统架构(转)
  8. MySQL查看表占用空间大小(转)
  9. centos6.5下Python IDE开发环境搭建
  10. substr(dirname(__FILE__))
  11. HDU1556(树状数组)
  12. sublime前端开发工具常用技巧
  13. poj 1015 Jury Compromise(背包变形dp)
  14. eclipse版本对应名称以及下载地址
  15. Spring缓存注解
  16. 2017-2018 Exp9 网络欺诈技术防范 20155214
  17. Linux下添加FTP账号和服务器、增加密码和用户,更改FTP目录
  18. jQuery实现按Esc清除信息功能
  19. Fowsniff: 1靶机入侵
  20. 1、cocos2d-x环境安装

热门文章

  1. Android高级工程师面试题整理
  2. PIE SDK自定义滤波
  3. Appium Android sdk自动化工具安装
  4. 从零实现一个简易jQuery框架之一—jQuery框架概述
  5. newInstance和new的区别(good)
  6. Cocos2d-x手游技术分享(1)-【天天打蚊子】数据存储与音效篇
  7. sublime开启vi编辑器功能,与vi常用快捷键
  8. java常用API之DateFormat
  9. Scrapy框架之基于RedisSpider实现的分布式爬虫
  10. 【Android】9.0活动的生命周期(二)——实际代码演示