wstring在windows上就是utf16,在linux上是utf32(或者说在win上适合存放utf16字符,在linux上适合存放utf32字符)
如果在linux上用utf16,需要自己处理utf16的surrogate pair吧,那其实比较麻烦,每个字符不等长。
windows上的api应该是可以直接处理utf16的surrogate pair。
当然,如果只是那26个英文字母的大小写,就不涉及到surrogate pair,把每个surrogate pair当作两个独立的utf16字符处理也能接受。
对utf16字符串,下面这种转换是buggy的实现:
std::wstring data = L"Abc";
std::transform(data.begin(), data.end(), data.begin(), [](wchar_t c){ return std::towlower(c); });
一是处理不了surrogate pair;二是某些语言的字符有问题,例子可以参考下面的:
https://en.cppreference.com/w/cpp/string/wide/towupper
https://en.cppreference.com/w/cpp/string/wide/towlower
我这边大部分字符串是用完就释放了,内存占用不是问题,需要转换大小写再匹配的场合,等长字符串处理方便,而且统一用std::wstring方便源代码跨平台(差异的部分用宏控制)
【 在 kirbyzhou 的大作中提到: 】
: 话说你们用wstring不嫌内存占用太大么?
: 而且wchar_t有16bit和32bit两种实现。
: 我一般都用u16string,偶尔用u32string
: ...................
--
修改:z16166 FROM 123.118.191.*
FROM 123.118.191.*