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 相关文章推荐
一键删除顽固的空文件夹 软件下载
Jan 26 PHP
PHP中冒号、endif、endwhile、endfor使用介绍
Apr 28 PHP
强烈声明: 不要使用(include/require)_once
Jun 06 PHP
使用Smarty 获取当前日期时间和格式化日期时间的方法详解
Jun 18 PHP
PHP时间格式控制符对照表分享
Jul 23 PHP
WordPress主题制作中自定义头部的相关PHP函数解析
Jan 08 PHP
php函数mkdir实现递归创建层级目录
Oct 27 PHP
PHP5.5安装PHPRedis扩展及连接测试方法
Jan 22 PHP
php实现留言板功能(代码详解)
Mar 28 PHP
php面向对象之反射功能与用法分析
Mar 29 PHP
Yii 2中的load()和save()示例详解
Aug 03 PHP
PHP基于DateTime类解决Unix时间戳与日期互转问题【针对1970年前及2038年后时间戳】
Jun 13 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 函数语法介绍一
2009/06/14 PHP
php $_SERVER windows系统与linux系统下的区别说明
2014/02/14 PHP
php简单实现数组分页的方法
2016/04/30 PHP
Yii调试查看执行SQL语句的方法
2016/07/15 PHP
jquery BS,dialog控件自适应大小
2009/07/06 Javascript
自己动手开发jQuery插件教程
2011/08/25 Javascript
javascript实现促销倒计时+fixed固定在底部
2013/09/18 Javascript
JQuery中的html()、text()、val()区别示例介绍
2014/09/01 Javascript
node.js中的http.response.writeHead方法使用说明
2014/12/14 Javascript
JS实现同时搜索百度和必应的方法
2015/01/27 Javascript
jQuery实现的背景动态变化导航菜单效果
2015/08/24 Javascript
浅谈JavaScript中面向对象的的深拷贝和浅拷贝
2016/08/01 Javascript
100多个基础常用JS函数和语法集合大全
2017/02/16 Javascript
Vue.js仿Metronic高级表格(一)静态设计
2017/04/17 Javascript
mui上拉加载更多下拉刷新数据的封装过程
2017/11/03 Javascript
js遍历添加栏目类添加css 再点击其它删除css【推荐】
2018/06/12 Javascript
使用webpack编译es6代码的方法步骤
2019/04/28 Javascript
5种Python单例模式的实现方式
2016/01/14 Python
使用Python处理BAM的方法
2018/09/28 Python
使用Django连接Mysql数据库步骤
2019/01/15 Python
python 三元运算符使用解析
2019/09/16 Python
基于Python新建用户并产生随机密码过程解析
2019/10/08 Python
python3使用Pillow、tesseract-ocr与pytesseract模块的图片识别的方法
2020/02/26 Python
详解Python IO编程
2020/07/24 Python
Django-celery-beat动态添加周期性任务实现过程解析
2020/11/26 Python
英国领先的在线药房:Pharmacy First
2017/09/10 全球购物
测试工程师程序员求职信范文
2014/02/20 职场文书
2014年学习雷锋活动总结
2014/03/01 职场文书
cf收人广告词
2014/03/14 职场文书
班子四风对照检查材料
2014/08/21 职场文书
汽车销售员岗位职责
2015/04/11 职场文书
2016年“六一儿童节”校园广播稿
2015/12/17 职场文书
2016年优秀少先队辅导员事迹材料
2016/02/26 职场文书
再也不用花钱买漫画!Python爬取某漫画的脚本及源码
2021/06/09 Python
Win11任务栏太宽了怎么办?一招解决Win11任务栏太宽问题
2021/11/21 数码科技
SQL Server中的逻辑函数介绍
2022/05/25 SQL Server