php使用iconv中文截断问题的解决方法
本文实例讲述了php使用iconv中文截断问题的解决方法。分享给大家供大家参考。具体分析如下:
今天做了一个采集程序,原理很简单,使用curl方法把对方页面的html获取分析,然后正则提取需要的数据并保存在数据库。
由于对方页面是gb2312编码,而本地使用的是utf-8编码。因此在采集后需要进行编码转换。
使用了iconv方法进行编码转换
iconv — 字符串按要求的字符编码来转换
string iconv ( string $in_charset , string $out_charset , string $str )
将字符串 str 从 in_charset 转换编码到 out_charset 。
转换的方法很简单,直接使用iconv方法就可以了
<?php $content = iconv('gb2312', 'utf-8', $content); //$content为采集到的内容 ?>
试验了几个页面,都能正常采集。但在之后的采集中,有几个页面采集不完整。
一开始考虑是否正则有错,检查后排除此问题。经过排查,发现经过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 $content = iconv('gb2312','utf-8//ignore',$content);//$content为采集到的内容 ?>
tips:使用iconv时,如果要使用utf-8编码的,请使用utf-8而不要使用utf8,因为utf8有些服务器会有问题。
希望本文所述对大家的php程序设计有所帮助。
推荐阅读
-
spring boot使用i18n时properties文件中文乱码问题的解决方法
-
Mysql5.7中使用group concat函数数据被截断的问题完美解决方法
-
php+AJAX传送中文会导致乱码的问题的解决方法
-
PHP的foreach中使用引用时需要注意的一个问题和解决方法
-
使用php+apc实现上传进度条且在IE7下不显示的问题解决方法
-
PHP中iconv函数转码时截断字符问题的解决方法
-
php中json_encode处理gbk与gb2312中文乱码问题的解决方法
-
PHP中使用file_get_contents抓取网页中文乱码问题解决方法
-
Mysql5.7中使用group concat函数数据被截断的问题完美解决方法
-
php下使用iconv需要注意的问题