常用的字符编码

一、基础知识

计算机中储存的信息都是用二进制数表示的,(bit)是指计算机里存放的二进制值(0/1),而 8 个位组合成的“位串”称为一个 字节
字符集(Charset):是一个系统支持的所有抽象字符的集合。字符是各种文字和符号的总称,包括各国家文字、标点符号、图形符号、数字等。
字符编码(Character encoding)也称字集码,是把字符集中的字符编码为指定集合中某一对象(例如:比特模式、自然数序列、8 位组或者电脉冲),以便文本在计算机中存储和通过通信网络的传递。

二、ASCII

ASCII 的全称是 American Standard Code for Information Interchange(美国信息交换标准代码)。ASCII 编码只支持基础拉丁字符,主要用于显示现代英语。ASCII 用一个字节(8 个位)来表示一个字符,并保证最高位的取值永远为’0’。即表示字符含义的位数为 7 位,不难算出其可表达字符数为 2^7 =128 个。这 128 个字符包括 95 个可打印的字符(涵盖了 26 个英文字母的大小写以及英文标点符号能)与 33 个控制字符(不可打印字符)。
为了解决西欧的字符编码问题,用上第 8 位,这样能表达的字符个数就达到了 2^8 =256 个,相比较原来,增长了一倍, 这个编码规则也常被称为 EASCII

三、中文编码

  • GB2312(国家简体中文字符集)用两个字节来表示一个汉字(注意是表示一个汉字,对于拉丁字母,GB2312 还是是用一个字节来表示以兼容 ASCII)。GB2312 能表示 7445 个符号,包括 6763 个汉字。
  • BIG5 (统一繁体字符集),能表示 21886 个符号,兼容 ASCII,但与 GB2312 有冲突。
  • GBK (汉字内码扩展规范) GB2312 的扩展,支持繁体字,能表示 21886 个符号。
  • GB18030 (中文编码字符集),是中华人民共和国现时最新的内码字集,与 GB2312 完全兼容,与 GBK 基本兼容,支持 GB13000 及 Unicode 的全部统一汉字

四、Unicode

针对不同的语言采用不同的编码,有可能导致冲突与不兼容性,为了能独立表示世界上所有的字符,Unicode 采用 4 个字节表示一个字符,这样理论上 Unicode 能表示的字符数就达到了 2^31 = 2147483648 = 21 亿左右个字符,完全可以涵盖世界上一切语言所用的符号。

缺点:Unicode 对所有的字符编码均需要四个字节,而这对于拉丁字母或汉字来说其前面三个或两个字节均是 0,这对信息存储来说是极大的浪费。另外一个问题就是,如何区分 Unicode 与其它编码这也是一个问题,

UTF-8(8-bit Unicode Transformation Format)是一种针对 Unicode 的可变长度字符编码(定长码),UTF-8 使用一至四个字节为每个字符编码

UTF-8 是 Unicode 的一种实现方式,而 Unicode 是一个统一标准规范,Unicode 的实现方式除了 UTF-8 还有其它的,比如 UTF-16 等

参考文档

字符编码常识及问题解析
字符集和字符编码(Charset & Encoding)