字符编码

Catalogue   

ASCII 码

计算机内部,所有信息最终都是一个二进制值。每一个二进制位(bit)有 0 和 1 两种 状态,因此八个二进制位就可以组合出256种状态,这被称为一个字节(byte)。
也就是说,一个字节一共可以用来表示256种不同的状态,每一个状态对应一个符号,就是256个符号,从00000000 到 11111111 。

上个世纪60年代,美国制定了一套字符编码,对英语字符与二进制位之间的关系,做了统一规定。这被称为 ASCII 码,一直沿用至今。

ASCII 码一共规定了128个字符的编码,比如空格 SPACE 是32(二进制 00100000 ),大写的字母 A 是65(二进制 01000001 )。这128个符号(包括32个不能打印出来的控制符号),只占用了一
个字节的后面7位,最前面的一位统一规定为 0 。

Unicode

Unicode 只是一个符号集。Unicode可以容纳100多万个符号。他规定了符号的二进制代码,却没有规定这个二进制代码应该如何存储。比如,汉字的Unicode是十六进制数 4E25 ,转换成二进制数足足有15位
( 100111000100101 ),也就是说,这个符号的表示至少需要2个字节。表示其他更大的符号,可能需要3个字节或者4个字节,甚至更多。

UTF-8

UTF-8 就是在互联网上使用最广的一种 Unicode 的实现方式。UTF-8 最大的一个特点,就是它是一种变长的编码方式。它可以使用1~4个字节表示一个符号, 根据不同的符号而变化字节长度。

UTF-8 的编码规则:

  1. 对于单字节的符号,字节的第一位设为 0 ,后面7位为这个符号的 Unicode 码。因此对于英语字母,UTF-8 编码和 ASCII 码是相同的。
  2. 对于n字节的符号(n>1),第一个字节的前n位都设为1,第n+1 位设为0,后面字节的前两位一律设为 10 。剩下的没有提及的二进制位,全部为这个符号的 Unicode 码。

严 的 Unicode 是 4E25 (100111000100101 ),根据上表,可以发现 4E25 处在第三行的范围内 ( 0000 0800 - 0000 FFFF),因此 严 的 UTF-8 编码需要三个字节,即格式是 1110xxxx 10xxxxxx 10xxxxxx 。然后,从 严 的最后一个二进制位开始,依次从后向前填入格式中的 x ,多出的位补
0 。这样就得到了, 严 的 UTF-8 编码是 11100100 10111000 10100101 ,转换成十六进制就是 E4B8A5 。

一个utf8数字占1个字节,一个utf8英文字母占1个字节,少数是汉字每个占用3个字节,多数占用4个字节。

编程转换

一般的文件编辑器(比如notepad)中保存时会有编码选项:

  • ANSI:对于英文文件是 ASCII 编码,对于简体中文文件是 GB2312 编码
  • Unicode:notepad使用的 UCS-2 编码方式,即直接用两个字节存入字符 的 Unicode 码,这个选项用的 little endian 格式(如果一个文本文件的头两个字节是 FE FF ,就表示该文件采用大头方式;如果头两个字节是 FF FE ,就表示该文件采用小头方式。)
  • Unicode big endian
  • UTF-8