#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;
}
字符编码转换实现(基于C++11)
最新推荐文章于 2024-04-07 13:52:23 发布