关于编码的一些总结

  • 相关术语
    • 字符集合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码元的个数

西瓜要挖着吃

一个通往大佬之路的男人

You may also like...

发表评论

电子邮件地址不会被公开。 必填项已用*标注