C++文字编码转换

小吐槽

C++的文字编码问题一直都是坑B。linux上都用utf8编码,windows都用每个国家不同的文字编码(GBK,big5之类)。
微软倒是挺聪明的,内部都用utf16来处理。然鹅没预料到utf16还不够,导致很多字符在windows显示也蛋疼,更别说emoji了。
原先在linux上开发全套都用utf8倒也挺舒服的,但是跟其他人对接、处理各处来的文字语聊,就又搞来了各种奇葩编码。
本来语言内部能够处理好这些问题是最好的,标准库能提供解决方案也不错。结果来了又走了,只留下人人一脸懵逼。
这里就要吹一吹rust了,文字都以unicode处理就很舒服(字符类型为unicode标量,字符串用的utf8。不过处理都是以字符迭代方式处理)。
以至于这样的功能几行就能完成。
各种奇奇怪怪的文字编码引入个encoding crate也比c++方便得多(关键是不同平台都统一了)

注意

仅记录一下C++11到C++17之前的stl做法。
因为C++11引入了编码转换相关的内容,在C++17的时候又弃用了。
所以C++17之后的编码转换需要第三方库来做了。(Windows上倒是一直提供了方便的API)

示例

// STL中的实现析构为protect,无法直接使用
// 需要自己继承一个类使用,这里为了方便直接作为GBK转宽字符类
struct codecvt_gb : public std::codecvt_byname<wchar_t, char, std::mbstate_t> {
    codecvt_gb() : codecvt_byname("zh_CN.GBK") {}
};

std::string string_gbk; // GBK编码的字符串
std::wstring_convert<codecvt_gb> cvtgb; // 实例化转换器
// 转为utf32(Windows为utf16)宽字符串
std::wstring wstring_utf32 = cvtgv.from_bytes(string_gbk);
// 转为utf8字符串
std::wstring_convert<std::codecvt_utf8<wchar_t>> cvtu8;
std::string string_u8 =cvtu8.to_bytes(wstring_utf32);

@

Show Comments