c++11中新增的字符编码转换的功能,可以解决我们平时开发中字符编码转换的需求。主要使用wstring_convert和codecvt相结合进行转换。单独看这两个模板类肯定之所云,不过没关系,下面对常用的编码转换进行一个代码总结,供大家学习(ctrl+c, ctrl_v)。

使用下面代码需要包含头文件#include<locale>  和 #include<codecvt>

【注】windows平台的std::wstring 就是std::u16string, wchar_t 就是char16_t (utf-16编码)。window平台的终端编码一般是gbk。

linux平台的std::wstring就是std::u32string, wchar_t 就是char32_t (utf-32编码)

1。std::string 转为 std::wstring( utf-8 --> wchar )

std::wstring utf8_to_wstr(const std::string& src)
{std::wstring_convert<std::codecvt_utf8<wchar_t>> converter;return converter.from_bytes(src);
}

注意:使用这个函数的时候需要求std::string的编码是utf-8,不然会抛异常。

2。std::wstring转为std::string(wchar --> utf-8)

std::string wstr_to_utf8(const std::wstring& src)
{std::wstring_convert<std::codecvt_utf8<wchar_t>> convert;return convert.to_bytes(src);
}

注意:转换后的获得的std::string的编码为utf-8,windows下输出是乱码 (windows终端输出中文要正常显示,要转化为GBK编码)

既然说windows下要转gbk才能正常显示中文,那么下面就介绍utf-8与gbk互转

3。utf-8转gbk

std::string utf8_to_gbk(const std::string& str)
{std::wstring_convert<std::codecvt_utf8<wchar_t> > conv;std::wstring tmp_wstr = conv.from_bytes(str);//GBK locale name in windowsconst char* GBK_LOCALE_NAME = ".936";std::wstring_convert<std::codecvt_byname<wchar_t, char, mbstate_t>> convert(new std::codecvt_byname<wchar_t, char, mbstate_t>(GBK_LOCALE_NAME));return convert.to_bytes(tmp_wstr);
}

4。gbk转utf-8

std::string gbk_to_utf8(const std::string& str)
{//GBK locale name in windowsconst char* GBK_LOCALE_NAME = ".936";std::wstring_convert<std::codecvt_byname<wchar_t, char, mbstate_t>> convert(new std::codecvt_byname<wchar_t, char, mbstate_t>(GBK_LOCALE_NAME));std::wstring tmp_wstr = convert.from_bytes(str);std::wstring_convert<std::codecvt_utf8<wchar_t>> cv2;return cv2.to_bytes(tmp_wstr);
}

上面utf-8和gbk互转的代码,都是先转化为std::wstring的,我们可以再拆分。得到std::wstring和gbk互转。

5。gbk转std::wstring

std::wstring gbk_to_wstr(const std::string& str)
{//GBK locale name in windowsconst char* GBK_LOCALE_NAME = ".936";std::wstring_convert<std::codecvt_byname<wchar_t, char, mbstate_t>> convert(new std::codecvt_byname<wchar_t, char, mbstate_t>(GBK_LOCALE_NAME));return convert.from_bytes(str);
}

std::wstring转gbk类似。

写在最后:

注:(1)可能有人疑惑,gbk和utf-8怎么都是以std::string的形式展现?首先需要明白的是,std::string的没有编码的,里面可以保存gbk,utf-8等编码的字符串。

(2)上面的代码在windows上完美运行(linux转码需求小)。GBK在linux下的locale名可能是"zh_CN.GBK",而windows下是".936"),因此做跨平台的话仍然要给不同的系统做适配

(3)需要注意:在windows上一般的编码都是GBK编码(终端输入参数,输出)

如有疑惑或者错误请在下面留言。

C++11 字符串编码转换相关推荐

  1. chrome字符串编码转换

    chrome字符串编码转换 字符串编码转换涉及宽字节表示法与UTF-8表示法之间的转换.宽字节表示法与UTF-16表示法之间的转换.UTF-8表示法与UTF-16表示法之间的转换.UTF-16表示法于 ...

  2. 分享万能java字符串编码转换工具类

    代码下载地址:http://www.zuidaima.com/share/1795356301560832.htm 原文:分享万能java字符串编码转换工具类 package com.zuidaima ...

  3. 站长在线Python精讲:Python中字符串编码转换encode编码和decode解码详解

    欢迎你来到站长在线的站长学堂学习Python知识,本文学习的是<Python中字符串编码转换:encode编码和decode解码详解>.本知识点主要内容有:常用编码简介.使用encode( ...

  4. java万能编码转换_分享万能java字符串编码转换工具类

    package com.zuidaima.util; import java.io.UnsupportedEncodingException; /** * 转换字符串的编码 */ public cla ...

  5. js符号转码_js 字符串编码转换函数

    escape 方法 对 String 对象编码以便它们能在所有计算机上可读, escape(charString) 必选项 charstring 参数是要编码的任意 String 对象或文字. 说明 ...

  6. 字符串 编码转换 ATL

    相关链接: http://www.vckbase.com/index.php/wv/1206 不同的编码的存储方式不同,经常需要进行编码的转换 重点关注:ATL的内存占用问题,可能导致的栈溢出: 使用 ...

  7. python中字符串编码转换

    字符串编码转换程序员最苦逼的地方,什么乱码之类的几乎都是由汉字引起的. 其实编码问题很好搞定,只要记住一点: 任何平台的任何编码,都能和Unicode互相转换. UTF-8与GBK互相转换,那就先把U ...

  8. unix系统编码 java_Java 正确的做字符串编码转换

    字符串的内部表示? 字符串在java中统一用unicode表示( 即utf-16 LE) , 对于 String s = "你好哦!"; 如果源码文件是GBK编码, 操作系统(wi ...

  9. 关于\x开头的字符串编码转换中文解决方法

    做爬虫可能经常遇到爬取到的数据存在编码问题,简直让人头疼,比如爬取到的是这样的: 例如: \xe4\xbd\xa0\xe5\xa5\xbd\xe4\xb8\x96\xe7\x95\x8c 中文是: 你 ...

  10. java对字符串编码转换_处理字符串编码转换java类详解

    该字符串处理类包括将ISO-8859-1编码的字符串转换成GBK编码 .对输入的字符串进行一次编码转换,防止SQL注入和验证URL地址是否存在的方法. 字符串处理类(编码转化.SQL注入.URL) i ...

最新文章

  1. 用进化算法来优化SVM的参数C和Gamma——利用SCOOP库进行分布式加速计算
  2. 爱吃苹果的与喜欢篮球的没必要非得达成一致~
  3. 使用Freemarker来页面静态化,与Spring整合使用
  4. 事故现场之依赖了不该依赖的 host ip
  5. 基础知识很扎实 - 但是面试就是做不出来, 怎么办? (长, 慎入)
  6. Widget开发中遇到的坑
  7. linux最小化原则
  8. 关于golden gate director client的一点点使用总结
  9. web页面防盗链功能使用--request.getHeader(Referer)
  10. 不推荐使用getResources()。getColor()[重复]
  11. hdu 1233还是畅通工程 最小生成树(入门题)prim算法
  12. centos下编译abseil-cpp
  13. 改变PSD文件单一的图标,让图标变成图像缩略图
  14. 通俗易懂的UART协议帧格式
  15. 头歌-自己动手画CPU(第二关)-原码一位乘法器-Logisim
  16. 深度学习—利用TensorFlow2实现狗狗品种品种(mobilenet实现)
  17. Python得到前面12个月的数据
  18. 技术分享1: jinkens构建Android工程,并上传到蒲公英平台
  19. Python数据库(MySQL、MongoDB、Redis)编程
  20. Android文本输入框EditText属性和方法说明

热门文章

  1. 阿里巴巴Java开发手册详细版本
  2. 超市登录系统 java_超市订单管理系统,登录功能实现
  3. 秒表的检定及设备使用方法说明
  4. ADS2015安装包和教程
  5. java代码性能优化实例
  6. 微信小程序图片流动动画效果(附代码,图)
  7. Kindle3 升级
  8. java是面向对象还是面向过程_Java面向对象编程和面向过程编程的区别
  9. MDUI 输入确认框
  10. jdk动态代理的实现流程(事务处理)