字符编码入门

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了字符编码入门相关的知识,希望对你有一定的参考价值。

字符编码入门

ASCII

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

上世纪 60 年代,美国制定了一套字符编码。对英语字符与二进制位之间的关系做了统一规定,这套方案被称作 ASCII 码(American Standard Code for Information Interchange 美国标准信息交换码),一直沿用至今。

ASCII 码一共规定了 128 个字符的编码,如常见的有:

  • 32(二进制 00100000)是空格
  • 48(二进制 00110000)是数字 0
  • 65(二进制 01000001)是字母 A
  • 97(二进制 ?01100001?)是字母 a

这 128 个字符(包括 32 个不能打印出来的控制符号),只占用了一个字节的后面 7 位,最前面的一位统一规定为 0

Unicode

英语用 128 个字符就够了。但是用来表示其他语言,128 个字符是不够的,后来欧洲国家在 ASCII 基础上,利用字节中闲置的最高位编入新的符号,这样一来,这些欧洲国家使用的编码体系可以最多表示 256 个字符。

由于不同国家有不同的字母,因此,即使它们都使用 256 个符号的编码方式,代表的字母却不一样。但是在所有的编码方式中,0-127 表示的符号是相同的,不一样的是128-256这一段。

正因为如此,世界上存在很多种编码方式,同一个二进制数字可以被解释成不同的符号。因此,要想打开一个文本文件,就必须直到它的编码方式,否则将会出现乱码。

如果有一种编码,将世界上所有的符号都纳入其中,每一个符号都给予一个独一无二的编码,那么乱码问题就会消失。这就是 Unicode(也叫万国码),就像它的名字都表示的,这是一种所有符号的编码。

然而,Unicode 有很严重的问题。由于Unicode只是一个字符集集,它只规定了符号的二进制代码,却没有规定这个二进制代码应该怎么存储。后来,出现了 Unicode 的多种存储方式,也就是说有许多种不同的二进制格式可以用来表示 Unicode 编码,导致 Unicode 编码没有流行起来,直到互联网的出现。

UTF-8

互联网的普及,强烈要求出现一种统一的编码方式,UTF-8 (8-bit Unicode Transformation Format)就是一种互联网上最流行的一种 Unicode 的实现方式。

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

UTF-8 的编码规则很简单,只有两条:

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

注:在 UTF-8 编码规则中,汉字通常占三个字节,扩展 B 区以后的汉字占四个字节。

总结与扩展

  • GB2312 编码从 ASCII 基础上扩充而来,GBK 从 GB2312 基础上扩充而来,每个汉字占 2 个字节,ASCII 编码规定的字符依然占 1 字节。
  • ISO 组织重新规定了一套包含世界上所有字符的编码方案,叫做 Unicode 字符集(Universal Multiple-Octet Coded Character Set)。
  • Unicode 在网络传输中,出现了 UTF-8 和 UTF-16 两个标准,分别每次传输 8 个位和 16 个位。
  • 因为 UTF-8 等编码体积较大,占电脑空间比较多,所以如果面向的对象大部分是中国人,可以采用 GBK 等编码。
  • ISO-8859-1(= Latin-1 / Latin1)是最早的 8 位字符集,用于支持部分欧洲使用的语言,是在 ASCII 基础上扩充了 96 个字母和符号而来。

参见:http://www.ruanyifeng.com/blog/2007/10/ascii_unicode_and_utf-8.html

以上是关于字符编码入门的主要内容,如果未能解决你的问题,请参考以下文章

Flowable入门系列文章92 - 一般可流动的REST原则 03

python入门:字符编码

2020Python修炼记13Python语法入门—字符编码

markdown 打字稿...编码说明,提示,作弊,指南,代码片段和教程文章

算法竞赛入门码蹄集进阶塔335题(MT3330-3335)

字符编码入门