这个问题我去年发帖子讨论过一次
考虑两个场合:
一、内存处理
如果要在内存中处理大小写转换、不区分大小写查找,UTF8是不合适的。
如果只是字符串拼接处理,那可以用UTF8。
1、可以统一用UTF16(Windows平台用UTF16-LE。其他平台用UTF16-LE或者UTF16-BE,原则是尽量不做LE和BE的转换操作)。
2、不涉及Windows平台而且内存占用不是问题的话,UTF32也可以。基本上没人会在Windows上用UTF32,因为os是用的UTF16-LE,调用os API时都得转为UTF16-LE。
我目前内存中是用wchar_t/std::wstring这种取决于编译器实现的类型,使用者需要清楚它有平台差异(字节数、BE和LE),
这种实际上就是:Windows平台用UTF16-LE,linux和macos用UTF32(是UTF32-LE还是UTF32-BE取决于硬件)。
UTF16有个问题是:大部分字符是16-bit,但是也有32-bit的字符(术语称为surrogate pair)。
所以不如UTF32来得简单痛快,就是吃点内存,也有LE和BE的区分。
下面这种能搜到的大小写转换代码,在Windows上的实现是错误的,不能处理surrogate pair:
void MakeLower(std::wstring &s) {
std::for_each(s.begin(), s.end(), [](WCHAR &c) { c = ::towlower(c); });
}
二、I/O
就像楼上有位说的,UTF8可以用来做输入输出,file、socket等里面的数据用utf8,没有endian问题。
如果同一个file还需要跨平台共享,需要明确file里的存储格式。
三、转换库:
1、Windows上用两个api(WideCharToMultiByte/MultiByteToWideChar),其他平台用iconv或者icu
2、或者统一用iconv或icu
--
FROM 114.241.225.*