- 本文主要涉及utf-8以及utf-16编码.
- 一般我们谈论Unicode编码我们谈论的是UTF-16编码
- UTF-16(Unicode)
UTF-16中的基本单位是两个字节的码元,基本的码元范围是(0x0000-0xFFFF),
UTF-16的字符映射范围是(U+0000,U+10FFFF),
当一个生僻字符需要使用0xFFFF以上的映射范围时,其需要使用两个码元(4Byte)进行表示.
其映射规则如下
第一个码元(前导代理)范围:0xD800 - 0xDBFF
第二个码元(后尾代理)范围:0xDC00 - 0xDFFF
有:(0xDBFF-0xD800+1)*(0xDFFF-0xDC00+1) === (0x10FFFF-0xFFFF)双射
所以(0xD800 - 0xDBFF)范围内的码元不能单独表示字符,其必须与后尾代理一起构成一个完整字符.
一般来说,大部分编程语言字符串的内存编码都使用UTF-16进行统一,java class文件编码(jvm内部),python3内存表示以及javaScript字符串的内存表示都使用了UTF-16.
- UTF-8是UTF-16的缩略版本,其使用1-6个字节存储数据,在某些情况下可以大大减少存储空间,所以一般保存到文件时会选择utf-8,减少存储空间.
- 一般来说,我们对于内存的编码控制较少,最多会在调用length之类方法时有影响(比如java中String的length方法只是很简单的统计码元个数,并不对辅助平面内的字符进行区分),比如”\uD834\uDF06”.length() –> 返回2;javaScript的也是如此,但python则会将其识别为一个字符,返回1.).更多的保存到文件时的编码控制,会涉及到UTF-8这才是我们最常接触的编解码部分.