GB2312-80, GBK与GB18030中文编码与UTF8

对中国行政区域http://www.stats.gov.cn/tjsj/tjbz/xzqhdm/201401/t20140116_501070.html爬虫,发现其中有80多行地名为空。后来发现最初的爬虫软件是采用GB2312编码的,后来修改为GBK后问题解决。

经过对比发现以下'漷县镇','俵口乡','柳树酄镇','浭阳街道办事处','倴城镇'等地名没有正常显示出来。


下面是GB 2312与GBK的一些小差异:

《信息交换用汉字编码字符集》是由中国国家标准总局1980年发布,1981年5月1日开始实施的一套简体中文汉字国家标准,标准号是GB2312—1980,每个汉字采用双字节编码,GB2312共收入汉字6763个和非汉字图形字符682个。 但对于人名、古汉语等方面出现的罕用字,GB 2312不能处理,这导致了后来GBK及GB 18030汉字字符集的出现。

BIG5编码是台湾地区繁体中文标准字符集,采用双字节编码,共收录13053个中文字,1984年实施。


1995年12月颁布了《汉字编码扩展规范》(GBK)。GBK与GB2312—1980国家标准所对应的内码标准兼容,每个汉字采用双字节编码,同时在字汇一级支持ISO/IEC10646.1和GB 13000.1的全部中、日、韩(CJK)汉字,共计20902字。GBK是GB2312-80简体中文,BIG5繁体中文,ISO/IEC10646.1和GB 13000.1 CJK等字符集的超集。

中日韩统一表意文字(CJK Unified Ideographs),目的是要把分别来自中文、日文、韩文、越文中,本质、意义相同、形状一样或稍异的表意文字(主要为汉字,但也有仿汉字如日本国字、韩国独有汉字、越南的喃字)于ISO 10646及Unicode标准内赋予相同编码。CJK 是中文(Chinese)、日文(Japanese)、韩文(Korean)三国文字的缩写。顾名思义,它能够支持这三种文字。实际上,CJK 能够支持在 LaTeX 中使用包括中文、日文、韩文在内的多种亚洲双字节文字。

2000年3月17日发布了GB18030汉字编码国家标准,全名是《信息技术 汉字编码字符集 基本集的扩充》,它是对GBK编码的扩充,覆盖中文、日文、朝鲜语和中国少数民族文字,其中收录27484个汉字。GB18030字符集采用单字节、双字节和四字节三种方式对字符编码。兼容GBK和GB2312字符集。GB18030-2000是全文强制性标准,市场上销售的产品必须符合。

GB18030最新版本是GB18030-2005,它在GB18030-2000的基础上增加了42711个汉字和多种我国少数民族文字的编码,增加的这些内容是推荐性的,收录了70244个汉字。原GB18030-2000中的内容是强制性的,市场上销售的产品必须符合。故GB18030-2005为部分强制性标准,自发布之日起代替GB18030-2000。GB18030-2005标准采用单字节、双字节和四字节三种方式对字符编码。

GB 13000-2010目的是替换GB 13000-1993标准。


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

在Unicode 5.0(2006.07发布)的99089个字符中,有71226个字符与汉字有关。它们的分布如下:

Block名称                 开始码位   结束码位    字符数

CJK统一汉字                4E00           9FBB    20924

CJK统一汉字扩充A        3400           4DB5      6582

CJK统一汉字扩充B    20000             2A6D6    42711

CJK兼容汉字               F900               FA2D        302

CJK兼容汉字               FA30               FA6A          59

CJK兼容汉字               FA70                FAD9        106

CJK兼容汉字补充       2F800                2FA1D        542

如果不算兼容汉字,Unicode 5.0支持的汉字总数是20924+6582+42711=70217。

这里有一个细节。在早期的Unicode版本中,CJK统一汉字区的范围是0x4E00-0x9FA5,也就是我们经常提到的20902个汉字。Unicode 5.0中增加了22个字符,码位是0x9FA6-0x9FBB,达到20924个汉字。


在Unicode 8.0(2015.06发布)中,汉字相对于Unicode 5.0有以下变化:

Block名称                 开始码位   结束码位                 字符数

CJK统一汉字                 4E00           9FBB-->9FD5      20924-->20950

CJK统一汉字扩充A        3400           4DB5      6582(未变动)

CJK统一汉字扩充B        20000             2A6D6    42711(未变动)

CJK统一汉字扩充C        2A700             2B734              4148

CJK统一汉字扩充D        2B740             2B81D                221

CJK统一汉字扩充E        2B820             2CEA1               5761 

CJK兼容汉字                   F900                FA2D-->FA2F    302-->304

CJK兼容汉字                   FA30               FA6A-->FA6D      59-->62

CJK兼容汉字                   FA70                FAD9               106(未变动)

CJK兼容汉字补充           2F800                2FA1D            542(未变动)


按照标准发布或实施时间点的一个简要总结:

GB2312-1980-->                       GBK-1995  -->  GB18030-2000   -->   GB18030-2005

            BIG5-1984

                     GB 13000.1-CJK-1993                                                            --> GB 13000-2010

UTF8.0-2015(推荐都使用UTF8编码标准)

参考:

[1] 字符编码笔记:ASCII,Unicode和UTF-8, http://www.ruanyifeng.com/blog/2007/10/ascii_unicode_and_utf-8.html

[2] http://zh.wikipedia.org/wiki/UTF-8

[3] Unicode Technical Standard #35, UNICODE LOCALE DATA MARKUP LANGUAGE (LDML), http://www.unicode.org/reports/tr35/,  http://unicode.org/charts/PDF/U4E00.pdf

[4] Unicode 5.0、GB2312、GBK和GB18030中的汉字, http://www.fmddlmyy.cn/text24.html

[5] 浅谈文字编码和Unicode(上/下), http://www.fmddlmyy.cn/mytext.html

[6] Unicode维基百科, https://zh.wikipedia.org/zh-cn/Unicode

[7] Unicode官方网站字符,http://www.unicode.org/charts/


MySQL数据库中串类型占用的字节与编码:

http://dev.mysql.com/doc/refman/5.6/en/storage-requirements.html

MySQL 5.6 Reference Manual :: 11 Data Types :: 11.7 Data Type Storage Requirements

  其中有下面描述:当某一列类型是CHAR, VARCHAR, 或TEXT时,计算存储所需的字节数,需要考虑该列的字符集,该列的值是否包含多字节的字符。

  尤其是当该列使用utf8 (或utf8mb4) Unicode字符集时,需要注意并非所有的字符占用的字节数相同,每个字符可能需要占用3个(或4个)字节。

  VARCHAR, VARBINARY, BLOB和TEXT类型是可变长度类型,对每一种类型占用的空间依赖于3个因素:

  . 列取值的实际长度。

  . 列的最大长度限制。

  . 列的字符集, 因为一些字符集中的一个字符占用多字节。


http://dev.mysql.com/doc/refman/5.6/en/charset-unicode-utf8.html

MySQL 5.6 Reference Manual :: 10 Globalization :: 10.1 Character Set Support :: 10.1.10 Unicode Support :: 10.1.10.5 The utf8 Character Set (3-Byte UTF-8 Unicode Encoding)

UTF-8 (Unicode Transformation Format with 8-bit units) 是存储Unicode数据的一种可选方式。依据RFC 3629实现, 该文档描述了编码序列(encoding sequences)占用1到4个字节。

UTF-8的思想是不同Unicode字符使用不同长度的字节序列来编码:

 。基础拉丁字母,数字,标点符号用一个字节来编码。

 。大多数欧洲与中东script letters用2个字节序列来编码:扩展的拉丁字母 (with tilde, macron, acute, grave and other accents), 斯拉夫, 希腊, 亚美尼亚, 希伯来, 阿拉伯, 叙利亚等等.

 。中日韩象形文字占用3个字节或4个字节序列。


UTF-8字符集中,每个多字节字符最大占用3个字节。

提醒: 当列使用UTF-8字符集时,使用VARCHAR而不是CHAR可以节省空间。MySQL必须为utf-8字符集编码的列中每个字符预留3个字节,例如,对一个CHAR(10) CHARACTER SET utf8列,MySQL必须预留30个字节。

由于数据库连接和表的字段(或列)通常都以UTF-8字符集来编码,因此当一列是CHAR(10)时,MySQL中必须预留30个字节。该列最大可存储10个拉丁字母(a-zA-Z)或数字(0-9),每个字母或数字占用1字节,但预留2字节。

      该列最大可存储10个汉字,每个汉字占用3字节。

转载于:https://my.oschina.net/1pei/blog/390663

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值