使用c++11标准库转换字符编码
2014-10-27 14:15
381 查看
#include <stdio.h> #include <locale> #include <codecvt> const std::string ws2s( const std::wstring& src ) { std::locale sys_locale(""); const wchar_t* data_from = src.c_str(); const wchar_t* data_from_end = src.c_str() + src.size(); const wchar_t* data_from_next = 0; int wchar_size = 4; char* data_to = new char[(src.size() + 1) * wchar_size]; char* data_to_end = data_to + (src.size() + 1) * wchar_size; char* data_to_next = 0; memset( data_to, 0, (src.size() + 1) * wchar_size ); typedef std::codecvt<wchar_t, char, mbstate_t> convert_facet; mbstate_t out_state = 0; auto result = std::use_facet<convert_facet>(sys_locale).out( out_state, data_from, data_from_end, data_from_next, data_to, data_to_end, data_to_next ); if( result == convert_facet::ok ) { std::string dst = data_to; delete[] data_to; return dst; } else { printf( "convert error!\n" ); delete[] data_to; return std::string(""); } } const std::wstring s2ws( const std::string& src ) { std::locale sys_locale(""); const char* data_from = src.c_str(); const char* data_from_end = src.c_str() + src.size(); const char* data_from_next = 0; wchar_t* data_to = new wchar_t[src.size() + 1]; wchar_t* data_to_end = data_to + src.size() + 1; wchar_t* data_to_next = 0; wmemset( data_to, 0, src.size() + 1 ); typedef std::codecvt<wchar_t, char, mbstate_t> convert_facet; mbstate_t in_state = 0; auto result = std::use_facet<convert_facet>(sys_locale).in( in_state, data_from, data_from_end, data_from_next, data_to, data_to_end, data_to_next ); if( result == convert_facet::ok ) { std::wstring dst = data_to; delete[] data_to; return dst; } else { printf( "convert error!\n" ); delete[] data_to; return std::wstring(L""); } } const std::string ws2utf8( const std::wstring& src ) { std::wstring_convert<std::codecvt_utf8<wchar_t>> conv; return conv.to_bytes( src ); } const std::wstring utf8_2_ws( const std::string& src ) { std::wstring_convert<std::codecvt_utf8<wchar_t> > conv; return conv.from_bytes( src ); }
http://it.cppreference.com/w/cpp/locale/wstring_convert
Vedi anche
Character conversions | narrow multibyte (char) | UTF-8 (char) | UTF-16 (char16_t) |
---|---|---|---|
UTF-16 | mbrtoc16 / c16rtomb | codecvt<char16_t, char, mbstate_t> codecvt_utf8_utf16<char16_t> codecvt_utf8_utf16<char32_t> codecvt_utf8_utf16<wchar_t> | N/A |
UCS2 | No | codecvt_utf8<char16_t> | codecvt_utf16<char16_t> |
UTF-32/UCS4 (char32_t) | mbrtoc32 / c32rtomb | codecvt<char32_t, char, mbstate_t> codecvt_utf8<char32_t> | codecvt_utf16<char32_t> |
UCS2/UCS4 (wchar_t) | No | codecvt_utf8<wchar_t> | codecvt_utf16<wchar_t> |
wide (wchar_t) | codecvt<wchar_t, char, mbstate_t> mbsrtowcs / wcsrtombs | No | No |
相关文章推荐
- 使用c++11标准库转换字符编码
- 使用Java将中文字符转换成Unicode编码
- 字符编码、字符存储、字符转换及工程中字符的使用
- mb_convert_encoding 函数的使用 转换字符编码
- linux使用iconv在不同字符编码中转换
- 使用 Java 将中文字符转换成 Unicode 编码
- 二者都是将 byte[] 转换成字符串,一个区别在于 Convert.ToBase64String 使用 base 64 数字编码,所以它生成的全部是 ASCII 字符。
- JavaScript 实现字符与unicode编码的相互转换
- JAVA字符编码系列二:Unicode,ISO-8859,GBK,UTF-8编码及相互转换
- Java字符编码转换过程说明[转]
- 在C++中如何将ActiveX控件所使用的BSTR数据转换成CHAR字符数组?
- 使用iconv命令轻松实现linux下字符集编码的转换
- 使用java的native2ascii工具命令来转换编码gbk,gb2312,utf-8
- 字符转换与编码模式
- 把字符转换成un编码。。。
- JAVA字符编码系列二:Unicode,ISO-8859,GBK,UTF-8编码及相互转换[引]
- Python Cookbook 第二版 汉化版 [Recipe 1.2] 字符与其对应的数字编码之间的转换
- 使用System.Convert.ToString将字符串转换成utf16进制编码
- Python Cookbook 第二版 汉化版 [Recipe 1.2] 字符与其对应的数字编码之间的转换
- JAVA字符编码系列二:Unicode,ISO-8859,GBK,UTF-8编码及相互转换