iconv错误Detected an illegal character in input string问题解决
在几天Kaijia还在改进@HFLS2012,新功能希望将旧版校网的数据整合到搜索中,在抓取旧版校网信息时遇到了一个问题。由于旧版校园网离现在已经10年多了,当时写的时候编码还是GB2312,但@HFLS2012编码是UTF-8所以需要将抓取到的内容转换为UTF-8字集。这个采集脚本是用php写的,在转换时Kaijia使用的是iconv函数,代码是:
1 |
$html = iconv('GB2312', 'UTF-8', $html); |
程序写完后就去睡觉让它采集了,起来后发现遇到了很多PHP Notice错误“iconv(): Detected an illegal character in input string”,根据输出的日志回查发现报错的文章都没有采集完成,很多都在某个生僻字上中断。于是查询了一些资料,发现问题处在GB2312子集上,以下引用维基百科的解释:
由于GB 2312-80只收录6763个汉字,有不少汉字,如部分在GB 2312-80推出以后才简化的汉字(如“啰”),部分人名用字(如中国前总理朱镕基的“镕”字),台湾及香港使用的繁体字,日语及朝鲜语汉字等,并未有收录在内。
因此当原文中出现不包含在这“6763个汉字”中的字时iconv函数是无法解析的,于是出现了报错问题,按此思路,解决方法就是将代码中的GB2312解析改成GBK解析,代码改成了:
1 |
$html = iconv('GBK', 'UTF-8', $html); |
由于GBK向下完全兼容GB2312-80编码。支持GB2312-80编码不支持的部分中文姓,中文繁体,日文假名,还包括希腊字母以及俄语字母等字母,因此在重新运行程序后iconv报错就基本消失了,但仍然出现了几个错误,目测仍然是类似的问题,遇到这种情况再向上升级编码即可,由于GB18030编码基本兼容GBK编码,又扩充了百余个词,因此将代码改成:
1 |
$html = iconv('GB18030', 'UTF-8', $html); |
即可解决问题,当然由于编码集转换出错原因有很多,这里也无法概括完整情况,Gentle的文章《iconv函数提示错误,解决办法整理》类出了其他多种解决方案可供参考。
搜索“iconv Detected an illegal character in input string”来到了这里,不过有个问题是最初的 illegal character 是怎么输入(到老系统的)的?
估计是老网站最初的时候都使用GBK,然后又从Word中直接把文字复制到网页上,遇到人名这种情况变成illegal character吧。