在几天Kaijia还在改进@HFLS2012,新功能希望将旧版校网的数据整合到搜索中,在抓取旧版校网信息时遇到了一个问题。由于旧版校园网离现在已经10年多了,当时写的时候编码还是GB2312,但@HFLS2012编码是UTF-8所以需要将抓取到的内容转换为UTF-8字集。这个采集脚本是用php写的,在转换时Kaijia使用的是iconv函数,代码是:
$html = iconv('GB2312', 'UTF-8', $html);
PHP message: PHP Notice: iconv(): Detected an illegal character in input string in /data/sites/webs/ PHP message: PHP Notice: iconv(): Detected an illegal character in input string in /data/sites/webs/ PHP message: PHP Notice: iconv(): Detected an illegal character in input string in /data/sites/webs/ PHP message: PHP Notice: iconv(): Detected an illegal character in input string in /data/sites/webs/ PHP message: PHP Notice: iconv(): Detected an illegal character in input string in /data/sites/webs/ PHP message: PHP Notice: iconv(): Detected an illegal character in input string in /data/sites/webs/
程序写完后就去睡觉让它采集了,起来后发现遇到了很多PHP Notice错误“iconv(): Detected an illegal character in input string”,根据输出的日志回查发现报错的文章都没有采集完成,很多都在某个生僻字上中断。于是查询了一些资料,发现问题处在GB2312子集上,以下引用维基百科的解释:
由于GB 2312-80只收录6763个汉字,有不少汉字,如部分在GB 2312-80推出以后才简化的汉字(如“啰”),部分人名用字(如中国前总理朱镕基的“镕”字),台湾及香港使用的繁体字,日语及朝鲜语汉字等,并未有收录在内。
因此当原文中出现不包含在这“6763个汉字”中的字时iconv函数是无法解析的,于是出现了报错问题,按此思路,解决方法就是将代码中的GB2312解析改成GBK解析,代码改成了:
$html = iconv('GBK', 'UTF-8', $html);
由于GBK向下完全兼容GB2312-80编码。支持GB2312-80编码不支持的部分中文姓,中文繁体,日文假名,还包括希腊字母以及俄语字母等字母,因此在重新运行程序后iconv报错就基本消失了,但仍然出现了几个错误,目测仍然是类似的问题,遇到这种情况再向上升级编码即可,由于GB18030编码基本兼容GBK编码,又扩充了百余个词,因此将代码改成:
$html = iconv('GB18030', 'UTF-8', $html);
即可解决问题,当然由于编码集转换出错原因有很多,这里也无法概括完整情况。
原文:http://www.kaijia.me/2013/02/iconv-detected-an-illegal-character-in-input-string-solved/
中日韩统一表意文字(CJK Unified Ideographs),目的是要把分别来自中文、日文、韩文、越文中,本质、意义相同、形状一样或稍异的表意文字(主要为汉字,但也有仿汉字如日本国字、韩国独有汉字、越南的喃字)于ISO 10646及Unicode标准内赋予相同编码。CJK 是中文(Chinese)、日文(Japanese)、韩文(Korean)三国文字的缩写。顾名思义,它能够支持这三种文字。实际上,CJK 能够支持在 LaTeX 中使用包括中文、日文、韩文在内的多种亚洲双字节文字。
什么是Gb18030?
国家标准GB18030-2005《信息技术 中文编码字符集》是我国继GB2312-1980和GB13000.1-1993之后最重要的汉字编码标准,是我国计算机系统必须遵循的基础性标准之一。 GB18030有两个版本:GB18030-2000和GB18030-2005。GB18030-2000是GBK的取代版本,它的主要特点是在GBK基础上增加了CJK统一汉字扩充A的汉字。GB18030-2005的主要特点是在GB18030-2000基础上增加了CJK统一汉字扩充B的汉字