对中国行政区域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字节。