iconv 中文截断问题的解决方法

iconv 中文截断问题的解决方法php


今天作了一个采集程序,原理很简单,使用curl方法把对方页面的html获取分析,而后正则提取须要的数据并保存在数据库。
html

因为对方页面是GB2312编码,而本地使用的是UTF-8编码。所以在采集后须要进行编码转换。
数据库


使用了iconv方法进行编码转换
apache

[php] view plain copy 在CODE上查看代码片派生到个人代码片服务器

  1. iconv — 字符串按要求的字符编码来转换  curl

  2. string iconv ( string $in_charset , string $out_charset , string $str )  编码

  3. 将字符串 str 从 in_charset 转换编码到 out_charset 。   url


转换的方法很简单,直接使用iconv方法就能够了
spa

[php] view plain copy 在CODE上查看代码片派生到个人代码片.net

  1. <?php  

  2. $content = iconv('GB2312''UTF-8'$content); // $content为采集到的内容  

  3. ?>  


试验了几个页面,都能正常采集。但在以后的采集中,有几个页面采集不完整。

一开始考虑是否正则有错,检查后排除此问题。通过排查,发现通过iconv转码后的内容比采集的内容少了一大段。

查看apache log,看到提示:Notice: iconv(): Detected an illegal character in input string。


翻查手册,看到如下说明

若是你在 out_charset 后添加了字符串 //TRANSLIT,将启用转写(transliteration)功能。这个意思是,当一个字符不能被目标字符集所表示时,它能够经过一个或多个形似的字符来近似表达。 

若是你添加了字符串 //IGNORE,不能以目标字符集表达的字符将被默默丢弃。 不然, str 从第一个无效字符开始截断并致使一个 E_NOTICE 。 


原来iconv遇到不能识别的内容,会从第一个不能识别的字符开始截断,并生成一个E_NOTICE。所以后边的内容被丢弃了。

而在输出字符集后加上//IGNORE则只丢弃不能识别的内容,而不会截断和丢弃后面的内容。


修改程序后一切正常

[php] view plain copy 在CODE上查看代码片派生到个人代码片

  1. <?php  

  2. $content = iconv('GB2312''UTF-8//IGNORE'$content); // $content为采集到的内容  

  3. ?>  


Tips:使用iconv时,若是要使用UTF-8编码的,请使用UTF-8而不要使用UTF8,由于UTF8有些服务器会有问题。

相关文章
相关标签/搜索