编程文汇

跨平台c++中处理UTF字符串

utf
unicode
utf-8
cxx
#1
  • 基本概念
  1. 跨平常用的字符集:utf-8 utf-16 utf-32
  2. 大端、小端:这时编码顺序的问题,是字节顺序,以字节为单位,正反存储。就像说话正着说、倒着说一样,0x1234,在存储时可以存为0x1234或者0x3412,如果实际存储顺序和我们正常阅读的顺序一致,那就是大端存储,否则就是小端。只有utf8不存在大小端问题。utf16 utf32都有大小端问题,两个系统采用相同的编码,但是大小端可能不一样,那编码就不能直接通用。其实计算机中的整数、浮点数,也一样,也可以正着存、反着存,所以不同计算机、不同系统、不同语言交互时才会需要统一序列化格式。
  3. 字符集选择:如果用与存储、传输,utf8是首选,因为体积小。如果是字符串处理,首选utf-16(它的常用字符集6万多,是固定的),utf-32,固定宽度,算法简单。如果只选一个,选utf-16把,常用字符集6万,操作也方便。网页里一般都是utf8,这样网页的体积小,因为utf8里英文字符都是单字节,光这一项,体积就小很多。
  4. locale:时区,把字符串输出到控制台时,很有可能要用到这东西了,这东西需要的是什么编码,就要把自己的字符串转成什么编码输出。
  5. unicode和utf:unicode是一个不断演进的编码体系,具体到编程上,unicode编码是16位固定编码,比较老的了,现在一般不用,麻烦,搞不懂。utf(8,16,32)编码都是相对比较新、设计考量比较全面。新的开发语言、新的操作系统,现代的应用开发,一般都会采用utf编码,我们跟随潮流走,就行了。

这个库的用法和java中的字符串用法基本一样。可以查找、比较、查询字节数、查询字符串长度、正则表达式查找、字符集之间的相互转换,基本上java里能干的它都能干,感觉很强大。

  • 利用宿主语言:

如果c++代码是作为动态库存在,被别的语言调用,比如c#,那么字符串处理,可以在c#中进行,c++至需要存放相应编码(最好直接使用宿主语言的内部编码,这样在使用时不必进行编码转换)的二进制。注意,往数据库存储、或者往网络上发送时,要统一编码(各个操作系统、各种宿主语言的内部编码不一样),一般用utf8,这就要求在发送之前,做一次转码(从宿主语言的内部编码c# utf16=>utf8),接受方收到后,如果要使用或者打印,需要做一次反向转码(utf8=>java utf16 ),如果确认双方编码一致,可以直接统一使用utf-16,无须来回转换。

参考文献

  1. 维基百科,utf16
  2. 字节顺序
0 Likes