C++:中文编码转换 | 您所在的位置:网站首页 › utf8翻译器 › C++:中文编码转换 |
在介绍如何使用C++11标准库进行中文编码转换之前,先说一下byte string、multibyte string、wide string之间的区别。 byte string 由8比特的字节组成的字符串。由char表示字节。因而字符串长度=字节数=char数 multibyte string 在内存布局上与byte string相同。但是由于它是区域(locale)相关的,所以它有可能表示的是UTF-8, GB18030, EUC-JP, Shift-JIS等格式的字符串,而这些格式中的每个字码(codepoint)可能是由多个连续的char组合构成的,所以字符串长度=字码数,但!=char数,也!=字节数。 wide string 每个宽字符由于操作系统的不同,其宽度为16位或32位的多语言字符代码。格式分别采用unicode(UTF-16LE)、UTF-16、UTF-32,由wchar_t, char16_t, char32_t表示。 C++标准库中对应关系: char * std::string wchar_t* std::wstring char16_t* std::u16string char32_t* std::u32string 1.string与wstring互相转化C++标准库从C++11开始提供了std::codecvt_utf8和std::codecvt_byname两个转换器来完成编码转换,可使用的通用代码如下: #include #include #include // string的编码方式为utf8,则采用: std::string wstring2utf8string(const std::wstring& str) { static std::wstring_convert strCnv; return strCnv.to_bytes(str); } std::wstring utf8string2wstring(const std::string& str) { static std::wstring_convert< std::codecvt_utf8 > strCnv; return strCnv.from_bytes(str); } // string的编码方式为除utf8外的其它编码方式,可采用: std::string wstring2string(const std::wstring& str, const std::string& locale) { typedef std::codecvt_byname F; static std::wstring_convert strCnv(new F(locale)); return strCnv.to_bytes(str); } std::wstring string2wstring(const std::string& str, const std::string& locale) { typedef std::codecvt_byname F; static std::wstring_convert strCnv(new F(locale)); return strCnv.from_bytes(str); }如果是GBK string与wstring互相转化,locale可取值: linux下: zh_CN.GBK zh_CN.GB2312 zh_CN.GB18030 windows下: 标准格式的locale: Chinese_China.936 zh-CN .936非标准格式的locale: chs Chinese-simplified Chinese ZHI不能使用的locale: Chinese.936,chs.936,Chinese.GB2312,chs.GB18030等此类值。 下面通过一些例子说明上面的函数如何使用吧。 2.string与wstring如何输出到控制台代码页为936 以在windows控制台为例,举例说明: // testCode.cpp #include #include #include #include #include int main() { std::wstring txt = L"中国人"; std::wcout |
CopyRight 2018-2019 实验室设备网 版权所有 |