字符编码转换实现(基于C++11)

#include <codecvt>
#include <string>

using CODECVR_BYNAME_TYPE = std::codecvt_byname<wchar_t, char, mbstate_t>;
const char* GBK_LOCALE_NAME = ".936";

namespace ConvertUtil{

    bool UTF8ToWide(std::wstring& wstr, const std::string& utf8)
    {
        std::wstring_convert<std::codecvt_utf8<wchar_t>> converter;
        wstr = converter.from_bytes(utf8);
        return true;
    }

    bool GBKToWide(std::wstring& wstr, const std::string& gbk)
    {
        std::wstring_convert<CODECVR_BYNAME_TYPE> convert(new CODECVR_BYNAME_TYPE(GBK_LOCALE_NAME));
        wstr = convert.from_bytes(gbk);
        return true;
    }

    bool WideToUTF8(std::string& utf8, const std::wstring& wstr)
    {
        std::wstring_convert<std::codecvt_utf8<wchar_t>> converter;
        utf8 = converter.to_bytes(wstr);
        return true;
    }

    bool WideToGBK(std::string& gbk, const std::wstring& wstr)
    {
        std::wstring_convert<CODECVR_BYNAME_TYPE> convert(new CODECVR_BYNAME_TYPE(GBK_LOCALE_NAME));
        gbk = convert.to_bytes(wstr);
        return true;
    }

    bool GBKToUTF8(std::string& utf8, const std::string& gbk)
    {
        std::wstring wstr;
        GBKToWide(wstr, gbk);
        WideToUTF8(utf8, wstr);
        return true;
    }

    bool UTF8ToGBK(std::string& gbk, const std::string& utf8)
    {
        std::wstring wstr;
        UTF8ToWide(wstr, utf8);
        WideToGBK(gbk, wstr);
        return true;
    }
}

int main2()
{
    std::string ansi = "中国";    //  GB2312
    std::string utf8;
    std::wstring wstr_by_ansi;
    std::wstring wstr_by_utf8;
    ConvertUtil::GBKToUTF8(utf8, ansi);
    ConvertUtil::GBKToWide(wstr_by_ansi, ansi);
    ConvertUtil::UTF8ToWide(wstr_by_utf8, utf8);
    ConvertUtil::WideToGBK(ansi, wstr_by_utf8);
    ConvertUtil::WideToUTF8(utf8, wstr_by_utf8);
    return true;
}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值