游戏开发者联盟

c++跨平台处理utf字符串3:icu

icu还是很方便的,核心功能(字符串、转码等)在common目录。
如果只需要核心功能,可以只编译common和stubdata,就能够正常使用。使用cmake的话,检索一下两个目录的cpp文件,直接编译即可。

字符串

头文件是:<unicode/unistr.h>
类:icu::UnicodeString

这个类的用法,官方有api文档。java的字符串就是基于icu,java字符串的API和UnicodeString高度相似。比如构建字符串,可以用new String(byte[] data,String encoding)的方式,指定二进制数据,以及它所使用的编码,就能正确构建一个字符串。

字符集转换:

icu的字符集转换是通过unicode为中间媒介,从unicode向别的字符集转入转出。
icu转换器列表:https://github.com/unicode-org/icu/blob/master/icu4c/source/data/mappings/convrtrs.txt

字符集检测:

这也是个常用的功能,icu用CharsetDetector 进行检测,非常方便。比如在出乱码的时候,想知道接受到的数据是什么编码,这时,CharsetDetector 就非常有用,是诊断问题所在的得力助手。
字符集名称 http://demo.icu-project.org/icu-bin/convexp

字符串格式化:

有MessageFormat,DateFormat,还有很多,这两个是比较常用的。这些功能在i18n中。

io

如果想把UnicodeString打印到流中,需要用io。

如果以上功能全部都用,就是需要:common、stubdata、i18n、io。
icu还包括一个data目录,这是icu编码的映射文件,如果不包含这个文件,很多icu功能是不可用的,比如gbk编码、locale,等等。

我自己也切换到icu,省事。稍微封装一下,隐藏一下实现,可以减少头文件,方便使用。