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这个库(支持跨平台的)

c++下各种编码格式转换的方法的更多相关文章

  1. java下拉框转换公共方法

    1. 下拉框实例类 import org.apache.commons.beanutils.PropertyUtils; import org.apache.commons.lang3.Boolean ...

  2. Linux下时间格式转换及获取方法

    Linux下使用clock_gettime给程序计时 #include <stdio.h> #include <unistd.h> #include <stdlib.h& ...

  3. jquery对象与dom对象之间互相转换的方法

    本文主要讲述jquery对象和js里的dom对象之间互相转换的方法,使jquery对象可以直接使用js里的方法,或js里的dom对象使用jquery里的方法. jquery对象和dom对象是不一样的, ...

  4. [转帖]Linux下批量替换文件内容方法

    Linux下批量替换文件内容方法 https://www.cnblogs.com/fjping0606/p/4428850.html 刚才用到的命令 原作者写的挺好的记录一下 以后 用. 1:查找fi ...

  5. Android 将drawable下的图片转换成bitmap、Drawable

    将drawable下的图片转换成bitmap . Bitmap bitmap = BitmapFactory.decodeResource(getResources(), R.drawable.xxx ...

  6. linux下文件编码格式转换方法(gb18030/utf-8)

    文章转载自:http://www.firekyrin.com/archives/249.html linux下文件编码格式转换方法(gb18030/utf-8) 在Linux做开发或者系统管理遇到乱 ...

  7. python轻松实现代码编码格式转换

    python轻松实现代码编码格式转换 最近刚换工作不久,没太多的时间去整理工作中的东西,大部分时间都在用来熟悉新公司的业务,熟悉他们的代码框架了,最主要的是还有很多新东西要学,我之前主要是做php后台 ...

  8. 【转】在Python的struct模块中进行数据格式转换的方法

    这篇文章主要介绍了在Python的struct模块中进行数据格式转换的方法,文中还给出了C语言和Python语言的数据类型比较,需要的朋友可以参考下 Python是一门非常简洁的语言,对于数据类型的表 ...

  9. FilesCodingConvert--批量文件编码格式转换工具

    FilesCodingConvert–批量文件编码格式转换工具 简介 最近开始学习使用Android Studio,因为它的方便易用,我打算以后就不在使用ADT的方式编写Android项目了.当从Ec ...

随机推荐

  1. 初用msui.js

    MSui,基于 Framework7 开发,组件功能使用Zepto库提供.定位轻量级的ui库 简单的使用MSui组件只需要引入所提供的CDN则可 <link rel="styleshe ...

  2. MyBatis模糊查询相关

    Mybatis模糊查询的实现不难,如下实例:在UserMapper.xml中根据用户名模糊查询用户: <!-- 模糊查询用户 --> <select id="findSom ...

  3. java se系列(四) 函数、数组、排序算法、二分法、二维数组

    1 函数 1.1  数的概述 发现不断进行加法运算,为了提高代码的复用性,就把该功能独立封装成一段独立的小程序,当下次需要执行加法运算的时候,就可以直接调用这个段小程序即可,那么这种封装形形式的具体表 ...

  4. 写给初学者的话---linux使用说明

    2018年noip上海赛区可以使用window操作系统的美梦终究还是破灭了!!!!上海大部分noip选手都陆陆续续开始改linux........好吧,那我们今天来看看linux操作系统中,noip选 ...

  5. ubuntu18.04 与 python

    Ubuntu安装pycharm专业破解版方法 首先我们要下载pycharm的安装包, 地址为https://www.jetbrains.com/pycharm/download/#section=li ...

  6. python 爬虫系列07-天气爬虫

    看天气 import requests from bs4 import BeautifulSoup ALL_DATA = [] def parse_page(url): headers = { 'Us ...

  7. android检查网络连接状态的变化,无网络时跳转到设置界面

    在AndroidManifest.xml中加一个声明<receiver android:name="NetCheckReceiver"> <intent-filt ...

  8. cmd激活win10

    自己动手,KMS激活win10 2016 长期服务版.步骤如下:命令提示符(管理员),依次输入以下3条命令 slmgr /ipk DCPHK-NFMTC-H88MJ-PFHPY-QJ4BJslmgr ...

  9. SQLite 大小写敏感

    --转自mojianpo  http://mojianpo.iteye.com/blog/1496579 大部分数据库在进行字符串比较的时候,对大小写是不敏感的. 但是,在SQLite中,对大小写是敏 ...

  10. python学习(五)--打印错误信息

    from urllib import request #打印错误信息 except Exceptionlist = [ "http://www.baidu11.com/", &qu ...