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


Posted in PHP onFebruary 11, 2015

本文实例讲述了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程序设计有所帮助。

PHP 相关文章推荐
PHP5.2中date()函数显示时间与北京时间相差8小时的解决办法
May 28 PHP
一步一步学习PHP(3) php 函数
Feb 15 PHP
让PHP以ROOT权限执行系统命令的方法
Feb 10 PHP
ThinkPHP实现事务回滚示例代码
Jun 23 PHP
PHP经典面试题集锦
Mar 19 PHP
php中使用gd库实现远程图片下载实例
May 12 PHP
编写PHP脚本来实现WordPress中评论分页的功能
Dec 10 PHP
Laravel SQL语句记录方式(推荐)
May 26 PHP
thinkPHP中钩子的两种配置调用方法详解
Nov 11 PHP
PHP里面把16进制的图片数据显示在html的img标签上(实现方法)
May 02 PHP
laravel中的一些简单实用功能
Nov 03 PHP
php 使用 __call实现重载功能示例
Nov 18 PHP
php发送与接收流文件的方法
Feb 11 #PHP
php实现上传图片保存到数据库的方法
Feb 11 #PHP
php使用curl获取https请求的方法
Feb 11 #PHP
php+html5使用FormData对象提交表单及上传图片的方法
Feb 11 #PHP
php判断并删除空目录及空子目录的方法
Feb 11 #PHP
php获取YouTube视频信息的方法
Feb 11 #PHP
php实现图片局部打马赛克的方法
Feb 11 #PHP
You might like
PHP学习笔记之php文件操作
2016/06/03 PHP
php计算给定日期所在周的开始日期和结束日期示例
2017/02/06 PHP
PHP实现的自定义图像居中裁剪函数示例【测试可用】
2017/08/11 PHP
PHPExcel 修改已存在Excel的方法
2018/05/03 PHP
tp5框架使用composer实现日志记录功能示例
2019/01/10 PHP
redis+php实现微博(二)发布与关注功能详解
2019/09/23 PHP
在VS2008中使用jQuery智能感应的方法
2010/12/30 Javascript
JQuery入门——事件切换之toggle()方法应用介绍
2013/02/05 Javascript
JQuery分别取得每行最后一列和最后一行的示例代码
2013/08/18 Javascript
JS制作简单的三级联动
2015/03/18 Javascript
深入理解javascript中concat方法
2016/12/12 Javascript
详解AngularJS1.x学习directive 中‘&amp; ’‘=’ ‘@’符号的区别使用
2017/08/23 Javascript
JS中精巧的自动柯里化实现方法
2017/12/12 Javascript
webpack之devtool详解
2018/02/10 Javascript
vue的toast弹窗组件实例详解
2018/05/14 Javascript
Vue.js实现的计算器功能完整示例
2018/07/11 Javascript
从vue源码看props的用法
2019/01/09 Javascript
javascript浅层克隆、深度克隆对比及实例解析
2020/02/09 Javascript
Vue快速实现通用表单验证的方法
2020/02/24 Javascript
vue 弹出遮罩层样式实例
2020/07/22 Javascript
[01:00:17]DOTA2-DPC中国联赛 正赛 SAG vs Dynasty BO3 第二场 1月25日
2021/03/11 DOTA
Python导入txt数据到mysql的方法
2015/04/08 Python
python中pandas.DataFrame对行与列求和及添加新行与列示例
2017/03/12 Python
python 监听salt job状态,并任务数据推送到redis中的方法
2019/01/14 Python
使用Python创建简单的HTTP服务器的方法步骤
2019/04/26 Python
利用Python计算KS的实例详解
2020/03/03 Python
美国隐形眼镜销售网站:ContactsDirect
2017/10/28 全球购物
linux面试题参考答案(11)
2012/05/01 面试题
哈理工毕业生的求职信
2013/12/22 职场文书
员工合理化建议书
2014/05/19 职场文书
采购部2015年度工作总结
2015/07/24 职场文书
社区志愿服务活动感想
2015/08/07 职场文书
大学生党员暑假实践(活动总结)
2019/08/21 职场文书
深入理解Vue的数据响应式
2021/05/15 Vue.js
redis requires ruby version2.2.2的解决方案
2021/07/15 Redis
SpringBoot+Redis实现布隆过滤器的示例代码
2022/03/17 Java/Android