编程文汇

[c++11]跨平台字符串处理

这里的跨平台,指的是在windows linux android ios等主流操作系统,以及各自的编译器。

采用标准c++来处理,方法也是比较直接的。本文用代码来展示这一过程。字符串操作、正则表达操作,这里没展示,从API上看,是支持的。

本文所有代码,在debian linux strech和 windows10上编译通过。

字符串处理要用宿主OS的内部编码

比如windows:用wstring,就是utf16BE

linux,用u32string,就是utf32

然后 字符串操作,就可以直接调用string的函数,以及string算法,还可以使用正则表达式,这些都是标准API,无需额外的学习成本。

存储文本、网络交互要使用utf8

因为utf8编码是平台无关的,放在哪里都可以直接使用。而且文本觉有可读性,用编辑器、浏览器打开可以直接查看。

其次,c++11标准内建了utf8支持,主流编译器都提供了相关实现。所以,无需引入第三方库。

utf8与OS内部编码的转换

至此,就确定了字符串处理的基调,就是使用u32string, wstring。那么utf8如何与它们转换呢?

// utf8文本可以从文件、网络中读入,用array或者string存储
// 也可以使用字面量
 std::string data = u8"z水三方";


//windows下转码器
std::wstring_convert<
    codecvt<wchar_t, char, std::mbstate_t>, wchar_t> conv16;

//linux转码器,实际编程中应该用预编译指令区分一下各种平台
std::wstring_convert<
    codecvt<char32_t, char, std::mbstate_t>, char32_t> conv16;


//从utf8转windows u16
std::wstring str16 = conv16.from_bytes(s);

//从utf8转linux u32
std::u32string str16 = conv16.from_bytes(data);

//转utf8
std::string u8 = conv16.to_bytes(str16);

打印调试

console打印是我们常用的监控手段。那么u32string wstring 如何输出到console呢?

我的做法是:转成utf8输出。

auto loc = std::locale("zh_CN.UTF-8");
std::locale::global(loc);
std::cout << conv16.to_bytes(str16) << std::endl;

参考文献: