在系统管理或一些软件管理中,总是碰到需要设置字符集或字符编码的地方,如果设置不正确,可能产生许多意想不到的问题。

   但是在具体概念上,不仅自己,网络上也有很多人不太理解“字符集”和“字符编码”到底是不是一回事,或者究竟有啥不一样?

   查了些资料,加上自己的理解,做一个学习总结如下:

字符集与字符编码有很紧密的联系,但不能完全划等号,先解释下几个概念:  


字符(Character

字符是各种文字和符号的总称,包括各国家文字、标点符号、图形符号等。如英文字母a-z,数字0-9,汉字等。


字符集(CharacterSet

字符集顾名思义,就是不同字符的集合。当然还包括一套将人类阅读的字符转换为机器阅读的字符(01)的规则。

一个字符集包含了固定数量的字符,如ASCII字符集包含A-Za-z0-9、半角标点符号和特殊控制符号(如换行符)在内的128个字符;如GB2312是中国国家标准的简体中文字符集,覆盖99.75%的汉字等。


字符编码(Encode

字符编码,就是上面提到的将人类阅读的字符按照一定的方式转换为机器阅读字符(01)。这套映射规则就叫字符编码,字符编码是基于字符集的。

一套字符集可以只有一套编码规则,也可以有多种编码规则。有些字符集只有一套编码规则,而且名字和字符集名称一致。

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


先看下字符的存储方式。看下表

字符编码

每个字符字节数

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

     表(1)


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

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


常见的字符集

Unicode也叫统一字符集,它包含了几乎世界上所有的已经发现且需要使用的字符(如中文、日文、英文、德文等)。

ASCII早期的计算机系统只能处理英文,所以ASCII也就成为了计算机的缺省字符集,包含了英文所需要的所有字符。

GB2312中文字符集,包含ASCII字符集。ASCII部分用单字节表示,剩余部分用双字节表示。

GBKGB2312的扩展,但完整包含了GB2312的所有内容。

GB18030GBK字符集的超集,常叫大汉字字符集,也叫CJKChineseJapaneseKorea)字符集,包含了中、日、韩三国语言中的所有字符。


常见的字符编码,如utf8、GBK、GB2312、Big5等。见表(1)


字符集转换

 从一种字符集转换到另一种字符集,由于原先字符集中的某些字符可能并不包含在目标字符集中,所以有可能会导致某些字符丢失。

 例如GBK转换成ASCII字符集,就会导致除了单字节字符(ASCII部分)外的所有字符丢失。

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

 

字符编码转换

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


由此我们了解,字符集只是定义了一些包含不同字符的集合和一些映射方式,即字符编码。字符编码才是给我们使用的具体方式。

所以,我们在系统管理中经常所设置的UTF-8GB2312等都是字符编码。