扫盲:字符编码与字符集的区别

该文章根据 CC-BY-4.0 协议发表,转载请遵循该协议。
本文地址:https://fenying.net/post/2010/07/12/character-set-and-encoding/

Overview

近来学习字符编码,发现网络上总是把“字符集(Character Set)”与“字符编码(Encode)”搞混了,我也给弄得晕头转向。

遂写此文,以明其意。

其实字符编码与字符集在本质上就是不同的东西。

字符(Character)

一个文字就是一个字符。在计算机中,字符是用数字来表示的,不同的文字用不同的数字表示。

字符集(Character Set)

既然是“集”,也就是“集合”,“字符集”自然就是“一定量字符的集合”。

一个字符集包含了固定数量的字符,如ASCII字符集包含A-Z、a-z、0-9、半角标点符号和特殊控制符号(如换行符)在内的128个字符。

字符编码(Encode)

编码,意思是指将数据通过一定方式表达或储存,这个方式就叫编码。所以字符编码就是字符的表现、储存方式,也就是字符集的实现方式。但需要注意的是:有的字符编码和字符集的名称是一致的。

从上可以看出,字符集是字符的集合,字符编码是把字符集的实现方式。

字符集类型

先看下字符的表达方式。看下表(表1)。

字符编码 每个字符字节数
ASCII 1
UCS-2(Unicode) 2
UCS-4(Unicode) 4
UTF-8(Unicode) 1 - 6
UTF-16(Unicode) 2 - 4
GBK/GB2312(中文) 1 - 2
GB18030(CJK) 1 - 4

从上表可以看出,不同的字符编码用不同的方式表达字符集。

所以,根据所需要的字节数不同,把恒用2个字节表示一个字符的字符集(编码),叫做双字节字符集(Double-Byte Character Set,DBCS),其他的叫做多字节字符集(Multi-Byte Character Set,MBCS)。如上表中只有UCS-2才是DBCS字符集。

常见的字符集

  • Unicode:也叫统一字符集,它包含了几乎世界上所有的已经发现且需要使用的字符(如中文、日文、英文、德文等)。
  • ASCII:早期的计算机系统只能处理英文,所以ASCII也就成为了计算机的缺省字符集,包含了英文所需要的所有字符。
  • GB2312:中文字符集,包含ASCII字符集。ASCII部分用单字节表示,剩余部分用双字节表示。
  • GBK:GB2312的扩展,但完整包含了GB2312的所有内容。
  • GB18030:GBK字符集的超集,常叫大汉字字符集,也叫CJK(Chinese,Japanese,Korea)字符集,包含了中、日、韩三国语言中的所有字符。

常见的字符编码

见表1。

字符集转换

从一种字符集转换到另一种字符集,由于某些字符集的并不包含原先字符集中的字符,所以有可能会导致某些字符丢失。 例如GBK转换成ASCII字符集,就会导致除了单字节字符(ASCII部分)外的所有字符丢失。

注意,计算机上以ASCII方式(其实,ASCII代表了所有的MBCS字符集)储存文件虽然可以储存中文,但实质上是因为GB2312和GBK等字符集是MBCS字符集,所以才归类到ASCII中,其实本质上还是是GBK字符集而不是ASCII字符集。

字符编码转换

由于字符编码是基于字符集的,所以字符编码不同也可能导致部分字符丢失。但如果是相同字符集,例如UTF-8(Unicode)到UTF-16(Unicode)编码,那么是不会丢失的,因为它们是同一种字符集的不同表现形式。

因此,希望某些网站、作者、技术人员别把字符集和字符编码搞混了。否则字符集、字符编码本身就晦涩难懂,再搞混了就更难懂了。

comments powered by Disqus