读懂字符编码ASCII、Unicode与UTF-8

116 阅读3分钟

ASCII 由电报码发展而来,第一版标准发布于1963年,最后一次更新则是在1986年,至今为止共128个字符

  • 其中33个字符为不可显示的控制字符,主要用于控制设备或调整文本格式;
  • 在33个字符之外是95个可显示字符
    包含26个英文大小写字母10个阿拉伯数字以及包含空格在内的33个标点与特殊符号

EASCII(Extended ASCII)是ASCII码的扩展版本,其将ASCII码由7位扩充为8位,由128个字符扩展为256个字符,因此EASCII可以部分支持西欧语言。

转义字符并非ASCII控制字符的某种编码方式,而是一种约定俗成的写法,当向计算机输入转义字符时(如\r\n),其将自动将转移字符替换为CRLF控制字符,每个控制字符占一个字节

Unicode 编码是一个二进制字符集,其字符占用2~3个字节。目前分为17个组进行编排,每个组称为一个平面,每个平面拥有65536个编码点,且当前只使用了少数平面。
因此,Unicode有足够的编码空间,可以将世界上所有的符号都纳入其中,每一个符号都给予一个独一无二的编码,是名副其实的万国码。

  • 大写英文字母A,其对应的ASCII二进制编码为8位 ( 01000001 ),也就是说表示ASCII字符需1个字节 ;

  • 汉字的 Unicode 十六进制标识为590F,二进制表示有16位(0101100100001111),也就是说采用Unicode表示这个字符至少需要2个字节;

  • 而对于Unicode编码第14~16平面的字符,可能需要3个字节表示。

  • 若所有的字符均按3个字节进行表示:由于计算机存储空间有限,将造成不小的空间浪费;

  • 若按1~3字节对所有字符进行表示:计算机该如何区分ASCII 与 Unicode(计算机如何知道是一个字节表示一个字符,还是三个字节表示一个字符)?

这种情况下UTF-8应运而生,UTF-8 最大的特点是一种可变长的编码方式,其使用1~4个字节表示一个符号,根据不同的符号而变化字节长度。

UTF-8的英文全称是(8-bit Unicode Transformation Format),其为 Unicode 的实现方式之一

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