C++11 字符串编码转换

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编码)

一、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,不然会抛异常。

二、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互转

三、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 windows
    const 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);
}

四、gbk转utf-8

std::string gbk_to_utf8(const std::string& str)
{
    //GBK locale name in windows
    const 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互转。

五、gbk转std::wstring

std::wstring gbk_to_wstr(const std::string& str)
{
    //GBK locale name in windows
    const 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编码(终端输入参数,输出)

  • 0
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值