iconv错误Detected an illegal character in input string问题解决

02/02/2013

在几天Kaijia还在改进@HFLS2012,新功能希望将旧版校网的数据整合到搜索中,在抓取旧版校网信息时遇到了一个问题。由于旧版校园网离现在已经10年多了,当时写的时候编码还是GB2312,但@HFLS2012编码是UTF-8所以需要将抓取到的内容转换为UTF-8字集。这个采集脚本是用php写的,在转换时Kaijia使用的是iconv函数,代码是:

程序写完后就去睡觉让它采集了,起来后发现遇到了很多PHP Notice错误“iconv(): Detected an illegal character in input string”,根据输出的日志回查发现报错的文章都没有采集完成,很多都在某个生僻字上中断。于是查询了一些资料,发现问题处在GB2312子集上,以下引用维基百科的解释

由于GB 2312-80只收录6763个汉字,有不少汉字,如部分在GB 2312-80推出以后才简化的汉字(如“啰”),部分人名用字(如中国前总理朱镕基的“镕”字),台湾及香港使用的繁体字,日语及朝鲜语汉字等,并未有收录在内。

因此当原文中出现不包含在这“6763个汉字”中的字时iconv函数是无法解析的,于是出现了报错问题,按此思路,解决方法就是将代码中的GB2312解析改成GBK解析,代码改成了:

由于GBK向下完全兼容GB2312-80编码。支持GB2312-80编码不支持的部分中文姓,中文繁体,日文假名,还包括希腊字母以及俄语字母等字母,因此在重新运行程序后iconv报错就基本消失了,但仍然出现了几个错误,目测仍然是类似的问题,遇到这种情况再向上升级编码即可,由于GB18030编码基本兼容GBK编码,又扩充了百余个词,因此将代码改成:

即可解决问题,当然由于编码集转换出错原因有很多,这里也无法概括完整情况,Gentle的文章《iconv函数提示错误,解决办法整理》类出了其他多种解决方案可供参考。