各种编码知识简介

本文主要介绍我们在日常开发中接触到了latin1GBKGB18030UTF-8编码几种。下面首先来看看这几种编码的的区别。

latin1

1. 先来看看latin1 (参考百度百科)

  Latin1ISO-8859-1的别名,有些环境下写作Latin-1

  ISO-8859-1编码是单字节编码,向下兼容ASCII,其编码范围是0x00-0xFF0x00-0x7F之间完全和ASCII一致,0x80-0x9F之间是控制字符,0xA0-0xFF之间是文字符号。

  ISO-8859-1收录的字符除ASCII收录的字符外,还包括西欧语言、希腊语、泰语、阿拉伯语、希伯来语对应的文字符号。欧元符号出现的比较晚,没有被收录在ISO-8859-1当中。

  因为ISO-8859-1编码范围使用了单字节内的所有空间,在支持ISO-8859-1的系统中传输和存储其他任何编码的字节流都不会被抛弃。换言之,把其他任何编码的字节流当作ISO-8859-1编码看待都没有问题。这是个很重要的特性,MySQL数据库默认编码是Latin1就是利用了这个特性。ASCII编码是一个7位的容器,ISO-8859-1编码是一个8位的容器。

 

2. 如果数据库内表的字符集是latin1,那么默认情况下中文也可被支持!

a)        latin1覆盖了所有单字节的值,任何其他的码流都可以被看做latin1

b)        把一个gbk编码的串写入latin1的表,不会有任何问题,保存的是原封不动的字节流

c)        从表中读取已写入的串也不会有任何问题,且读出的字节流就和当初写入的完全一致

读取出来以后,如果在终端下,就会理解成locale类型(如果localegbk,当时写入的gbk中文串可正常回显)

读取出来以后,如果要写入文件,则文件编码方式即当时写入的字节流编码,如gbk写入的,读出存入文件后,文件编码也是gbk!但是如果混着写(utf-8 + gbk),那编辑器就犯蒙了,就可能会显示会有乱码。

: 纯文本文件大多无文件头,编辑器是通过字节流自己识别编码方式和字符集的

3. 综上,建DB和访问DB时如果都采用默认的latin1,那就不仅仅支持中文,而是支持任意的编码方式!

 

中文编码GB系列

字符必须编码后才能被计算机处理。计算机使用的缺省编码方式就是计算机的内码。早期的计算机使用7位的ASCII编码,但为了处理汉字,又设计出用于简体中文的GB2312和用于繁体中文的big5

GB2312(1980)一共收录了7445个字符,包括6763个汉字和682个其它符号。汉字区的内码范围高字节从B0-F7,低字节从A1-FE,占用的码位是72*94=6768。其中有5个空位是D7FA-D7FE

GB2312支持的汉字太少。1995年的汉字扩展规范GBK1.0收录了21886个符号,它分为汉字区和图形符号区。汉字区包括21003个字符。

ASCIIGB2312GBK,这些编码方法是向下兼容的,即同一个字符在这些方案中总是有相同的编码,后面的标准支持更多的字符。在这些编码中,英文和中文可以统一地处理。区分中文编码的方法是高字节的最高位不为0。按照程序员的称呼,GB2312GBK都属于双字节字符集 (DBCS)

2000年的GB18030是取代GBK1.0的正式国家标准。该标准收录了27484个汉字,同时还收录了藏文、蒙文、维吾尔文等主要的少数民族文字。从汉字字汇上说,GB18030GB13000.120902个汉字的基础上增加了CJK扩展A6582个汉字(Unicode0x3400-0x4db5),一共收录了27484个汉字。CJK就是中日韩的意思。Unicode为了节省码位,将中日韩三国语言中的文字统一编码。GB13000.1就是ISO/IEC 10646-1的中文版,相当于Unicode 1.1

GB18030的编码采用单字节、双字节和4字节方案。其中单字节、双字节和GBK是完全兼容的。4字节编码的码位就是收录了CJK扩展A6582个汉字。例如:UCS0x3400GB18030中的编码应该是8139EF30UCS0x3401GB18030中的编码应该是8139EF31

微软提供了GB18030的升级包,但这个升级包只是提供了一套支持CJK扩展A6582个汉字的新字体:新宋体-18030,并不改变内码。Windows的内码仍然是GBK

也就是说Big5支持繁体中文,GB2312支持简体中文,Big5,GB2312GBK的子集,GBKGB18030的子集

 

UTF-8

UTF-88-bitUnicode Transformation Format)是一种针对Unicode的可变长度字符编码,又称万国码。由Ken Thompson1992年创建。现在已经标准化为RFC3629UTF-816字节编码UNICODE字符。用在网页上可以同一页面显示中文简体繁体及其它语言(如英文,日文,韩文)。互联网工程工作小组(IETF)要求所有互联网协议都必须支持UTF-8编码。互联网邮件联盟(IMC)建议所有电子邮件软件都支持UTF-8编码。

 

区别和选择

从上所述中可以看出,目前数据库的字符集latin1是支持任何编码方式存储的。即当中文编码是GBK的时候,或者是UTF-8的时候,对于在数据库的存储都是没有问题的。那么GBKUTF-8有什么区别:

1)        字符均使用双字节来表示,只不过为区分中文,将其最高位都定成1

2)        至于UTF8编码则是用以解决国际上字符的一种多字节编码,它对英文使用8位(即一个字节),中文使用24位(三个字节)来编码。对于英文字符较多的论坛则用UTF8节省空间。

3)        GBK包含全部中文字符;UTF-8则包含全世界所有国家需要用到的字符。

4)        GBK是在国家标准GB2312基础上扩容后兼容GB2312的标准(好像还不是国家标准)
UTF-8编码的文字可以在各国各种支持UTF8字符集的浏览器上显示。比如,如果是UTF8编码,则在外国人的英文IE上也能显示中文,而无需他们下载IE的中文语言支持包。所以,对于英文比较多的论坛,使用GBK则每个字符占用2个字节,而使用UTF8英文却只占一个字节。

5)        UTF8是国际编码,它的通用性比较好,外国人也可以浏览论坛,GBK是国家编码,通用性比UTF8差,不过UTF8占用的数据库比GBK大。

 

对于中文较多的,适宜选择GBK编码节省数据库空间,由于编码方式不同,GBKUTF-8对于中文占用空间小,打开速度更快。

对于英文较多的,适宜选择UTF-8节省数据库空间。

如果要考虑到未来国际兼容性问题,适宜选择UTF-8.

你可能感兴趣的:(各种编码知识简介)