gb2312和utf8相互转换:
2017-02-14 16:58
701 查看
c++11 好像用u8来表示utf-8,然后还有一大套转换函数 u16string,char16_t。std::codecvt_utf8 std::codecvt_utf16 std::codecvt_utf8_utf16 wstring_convert。
然后还有utf-8常亮字符串
std::string str2 = u8"你好啊";
gb2312和utf8相互转换:
#include <locale>
#include <vector>
#include <string>
#include <codecvt>
std::string gb2312_to_utf8(std::string const &strGb2312)
{
std::vector<wchar_t> buff(strGb2312.size());
#ifdef _MSC_VER
std::locale loc("zh-CN");
#else
std::locale loc("zh_CN.GB18030");
#endif
wchar_t* pwszNext = nullptr;
const char* pszNext = nullptr;
mbstate_t state = {};
int res = std::use_facet<std::codecvt<wchar_t, char, mbstate_t> >
(loc).in(state,
strGb2312.data(), strGb2312.data() + strGb2312.size(), pszNext,
buff.data(), buff.data() + buff.size(), pwszNext);
if (std::codecvt_base::ok == res)
{
std::wstring_convert<std::codecvt_utf8<wchar_t>> cutf8;
return cutf8.to_bytes(std::wstring(buff.data(), pwszNext));
}
return "";
}
std::string utf8_to_gb2312(std::string const &strUtf8)
{
std::wstring_convert<std::codecvt_utf8<wchar_t>> cutf8;
std::wstring wTemp = cutf8.from_bytes(strUtf8);
#ifdef _MSC_VER
std::locale loc("zh-CN");
#else
std::locale loc("zh_CN.GB18030");
#endif
const wchar_t* pwszNext = nullptr;
char* pszNext = nullptr;
mbstate_t state = {};
std::vector<char> buff(wTemp.size() * 2);
int res = std::use_facet<std::codecvt<wchar_t, char, mbstate_t> >
(loc).out(state,
wTemp.data(), wTemp.data() + wTemp.size(), pwszNext,
buff.data(), buff.data() + buff.size(), pszNext);
if (std::codecvt_base::ok == res)
{
return std::string(buff.data(), pszNext);
}
return "";
}
注意linux要支持zh_CN.GB18030代码才能正常运行。Ubuntu下使用cat /var/lib/locales/supported.d/local 来查看系统是否支持zh_CN.GB18030。
然后还有utf-8常亮字符串
std::string str2 = u8"你好啊";
gb2312和utf8相互转换:
#include <locale>
#include <vector>
#include <string>
#include <codecvt>
std::string gb2312_to_utf8(std::string const &strGb2312)
{
std::vector<wchar_t> buff(strGb2312.size());
#ifdef _MSC_VER
std::locale loc("zh-CN");
#else
std::locale loc("zh_CN.GB18030");
#endif
wchar_t* pwszNext = nullptr;
const char* pszNext = nullptr;
mbstate_t state = {};
int res = std::use_facet<std::codecvt<wchar_t, char, mbstate_t> >
(loc).in(state,
strGb2312.data(), strGb2312.data() + strGb2312.size(), pszNext,
buff.data(), buff.data() + buff.size(), pwszNext);
if (std::codecvt_base::ok == res)
{
std::wstring_convert<std::codecvt_utf8<wchar_t>> cutf8;
return cutf8.to_bytes(std::wstring(buff.data(), pwszNext));
}
return "";
}
std::string utf8_to_gb2312(std::string const &strUtf8)
{
std::wstring_convert<std::codecvt_utf8<wchar_t>> cutf8;
std::wstring wTemp = cutf8.from_bytes(strUtf8);
#ifdef _MSC_VER
std::locale loc("zh-CN");
#else
std::locale loc("zh_CN.GB18030");
#endif
const wchar_t* pwszNext = nullptr;
char* pszNext = nullptr;
mbstate_t state = {};
std::vector<char> buff(wTemp.size() * 2);
int res = std::use_facet<std::codecvt<wchar_t, char, mbstate_t> >
(loc).out(state,
wTemp.data(), wTemp.data() + wTemp.size(), pwszNext,
buff.data(), buff.data() + buff.size(), pszNext);
if (std::codecvt_base::ok == res)
{
return std::string(buff.data(), pszNext);
}
return "";
}
注意linux要支持zh_CN.GB18030代码才能正常运行。Ubuntu下使用cat /var/lib/locales/supported.d/local 来查看系统是否支持zh_CN.GB18030。
相关文章推荐
- 字符集GB2312判断及UTF8相互转换
- 【转载】实现UTF8与GB2312编码格式相互转换(VC)已经验证!
- GB2312、UNICODE和UTF8的相互转换
- GB2312与UTF8相互转换
- UTF8、GB2312相互转换
- UTF8和GB2312的相互转换
- pb字符串实现GB2312与Unicode、UTF8之间的相互转换
- php-----utf8和gbk相互转换
- php-----utf8和gbk相互转换
- Vc下unicode和UTF8相互转换
- 中文篇码GB2312与UTF8互转换
- UTF8 ANSI 相互转换的函数
- ACSII,GB2312,GBK,GB18030,Unicode,UTF8,UTF16,UTF32,BOM区别与转换——字符编码最全总结
- Java中将数据由UTF8转换成GB2312格式
- perl 转码操作将utf8格式转换为gb2312
- UTF-8与GB2312间相互转换
- unicode与GB2312的相互转换(js)
- php-----utf8和gbk相互转换
- sell脚本,将GB2312编码转换成UTF8编码。
- Linux下 GB2312和UTF8转换接口