字符编码

Author Avatar
ahscuml 9月 26, 2018
  • 在其它设备中阅读本文章

简单理解现代编码
编码简单的理解就是将字符编码成计算机可以理解的内容,看起来很简单,但是实际上还是比较复杂。字符的集合很复杂,因为世界上有很多语言,所以字符种类很多,光中文字符就有10万多个。有了字符集之后就要将字符集映射为对应的数字(因为计算机只能处理0和1),数字还要映射成比特。各种不同的方案很多。

抽象字符表

很简单的概念,就是字符的集合

编码字符集

将字符映射为整数或者坐标,unicode属于这一层。

  • 码点(code point):编码空间的一个位置(与一个编码表中的某个字符对应的代码值)
  • 码点值(code point value): 一个字符所占用的码位
    unicode字符集分为两部分(17个代码级别),第一部分为第一个代码级别成为基本的多语言级别(U+0000-U+FFFF),其中(U+D800-U+DFFF)为保留字符,没有使用。第二部分为其余代码级别,其中包括辅助字符(U+10000-U+10FFFF)。

字符编码表

简单理解就是如何存储编码字符集的整数,是一个存储的规则。
将编码字符集的非负整数转换成有限比特长度的整型值序列。对于定长编码就是简单的自身映射,但是对于变长编码就比较复杂。UTF-8,UTF-16等编码方式属于这一层

  • 码元(code units):有限比特长度的整型值序列(一个Unicode字符由一个或者两个码元组成)

UTF-8(8-bit Unicode Transformation Format)

是一种针对Unicode的可变长度字符编码,也是一种前缀码。它可以用来表示Unicode标准中的任何字符,且其编码中的第一个字节仍与ASCII兼容,这使得原来处理ASCII字符的软件无须或只须做少部分修改,即可继续使用。
对于UTF-8编码中的任意字节B,如果B的第一位为0,则B独立的表示一个字符(ASCII码);

  • 如果B的第一位为1,第二位为0,则B为一个多字节字符中的一个字节(非ASCII字符);
  • 如果B的前两位为1,第三位为0,则B为两个字节表示的字符中的第一个字节;
  • 如果B的前三位为1,第四位为0,则B为三个字节表示的字符中的第一个字节;
  • 如果B的前四位为1,第五位为0,则B为四个字节表示的字符中的第一个字节;

因此,对UTF-8编码中的任意字节,根据第一位,可判断是否为ASCII字符;根据前二位,可判断该字节是否为一个字符编码的第一个字节;根据前四位(如果前两位均为1),可确定该字节为字符编码的第一个字节,并且可判断对应的字符由几个字节表示;根据前五位(如果前四位为1),可判断编码是否有错误或数据传输过程中是否有错误。

在Java中,char类型描述了UTF-16编码中的一个代码单元。基本多语言级别每个字符使用16位来表示。辅助字符采用一对连续的代码单元进行编码。[保留字符U+D800-U+DBFF用于第一个代码单元,U+DC00-U+DFFF用于第二个代码单元]
在Java当中,一个char代表一个代码单元,所以尽量少用char类型

字符编码方案

将定长的整型值(即码元)映射到8位字节序列

传输编码语法

用于处理上一层次的字符编码方案提供的字节序列

参考:字符编码

This blog is under a CC BY-NC-SA 4.0 Unported License
本文链接:https://ahscuml.github.io/字符编码/