关于编码的一些总结
by
西瓜要挖着吃
·
Published
· Updated
- 相关术语
- 字符集合Character Set:一组图形化字符的集合,比如说所有汉字的集合,就是你脑海中想象的汉字,这并不是计算机的术语
- 编码字符集Coded character set:字符集合到整数集合的映射,每个字符对应一个整数值;比如我们最早接触到的ASCII,Java使用的Unicode都属于这一概念
- 字符编码模式Character Encoding scheme:根据一定的算法,将CCS码点映射到一定长度的二进制序列,也就是映射到一个字节数组,我们常说的UTF-8,UTF-16都属于这个概念
- 码点code point:字符到整数的映射结果,也就是编码字符集中的一个元素
- 码元code unit:已编码的文本中具有最短比特组合的单元,在接下来的UTF-8介绍中能有更好的理解
- 具体介绍
- Unicode:万国码(听着就很牛逼),这是计算机界的业内标准;属于编码字符集,为每一个字符指定一个整数的规则(规则可以有很多,这是其中一种)
- 表示方式:U+ 16进制数 例:U+51e1
- 表示范围:U+0000 ~ U+10FFFF (算算能表示多少个数?)
- 划分平面:按照使用方式划分为17个部分(平面);U+0000 ~ U+FFFF为基本多语言平面(BMP),就是经常使用的字符;U+10000~U+1FFFF为增补多语言平面,也就是会使用但是较少使用的字符;其余平面需要的时候再去了解就好了
- UTF-16:属于字符编码格式,也就是真正可以存储到存储介质中的一种格式,也可以不严谨地说是Unicode地实现方式之一;
- UTF-16源于UCS-2,名字就不用纠结了,总之UCS-2码元是两个字节,所以顶多才能表示Unicode的BMP,显然不能满足需求
- UTF-16对UCS-2进行了拓展,对于BMP的表示和UCS-2一致;对于其他平面,UTF采用了“代理对”进行编码实现(以下两点为拓展,感兴趣可以看看,也挺有意思)
- 在BMP中,U+D800~U+DFFF为代理区,反正是未被使用
- 将代理区分为高代理和低代理:U+D800~U+DBFF表示第一码元,U+DC00~U+DFFF表示第二码元,恰能表示其他十六个平面,220个码点
- UTF-8:属于字符编码格式,Unicode的另一种实现方式;是一种变长的编码方式,最短情况下一个字节就可以表示一个字符(所以说码元长度是一个字节)
- 对于一个字符的编码,第一个字节隐含了该字符采用几个字节进行存储
- 可以看出UTF-8是兼容ASCII的
- 除了一子节情况,其他情况就看第一个字节高位有几个连续的1就可以知道该字符占几个字节了
来源于百度百科- 关于乱码:以下内容为浅显理解,请多加批评指正;我们在使用软件的时候经常需要设置编码格式,一旦设置不恰当,烫烫烫和?就来了;
- 我们的文件都有一个存储时的编码格式,例如UTF-8
- 当我们想要读取该文件时,我们就需要指定读取时使用的格式,只有这样文件内容才能被正确地解析,才不会乱码
- 在Java中
- char类型实际上描述一个UTF-16的码元,也就是两个字节,所以超过BMP就会出错
- String的length()返回值其实是UTF-16码元的个数