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 相关文章推荐
php下过滤html代码的函数 提高程序安全性
Mar 02 PHP
array_multisort实现PHP多维数组排序示例讲解
Jan 04 PHP
php格式输出文件var_export函数实例
Nov 15 PHP
php实现parent调用父类的构造方法与被覆写的方法
Feb 11 PHP
PHP实现的简单网络硬盘
Jul 29 PHP
学习php设计模式 php实现原型模式(prototype)
Dec 07 PHP
深入理解PHP类的自动载入机制
Sep 16 PHP
php 如何禁用eval() 函数实例详解
Dec 01 PHP
php注册审核重点解析(数据访问)
May 23 PHP
搜索附近的人PHP实现代码
Feb 11 PHP
PHP里的$_GET数组介绍
Mar 22 PHP
PHP Beanstalkd消息队列的安装与使用方法实例详解
Feb 21 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
destoon二次开发入门示例
2014/06/20 PHP
简单实现PHP留言板功能
2016/12/21 PHP
php提交表单时保留多个空格及换行的文本样式的方法
2017/06/20 PHP
js模拟类继承小例子
2010/07/17 Javascript
基于jquery的鼠标拖动效果代码
2012/05/30 Javascript
JavaScript cookie的设置获取删除详解
2014/02/11 Javascript
关于JS数组追加数组采用push.apply的问题
2014/06/09 Javascript
node.js中的fs.readdirSync方法使用说明
2014/12/17 Javascript
JQuery控制div外点击隐藏而div内点击不会隐藏的方法
2015/01/13 Javascript
NODE.JS跨域问题的完美解决方案
2016/10/20 Javascript
分享bootstrap学习笔记心得(组件及其属性)
2017/01/11 Javascript
Express+Nodejs 下的登录拦截实现代码
2017/07/01 NodeJs
基于匀速运动的实例讲解(侧边栏,淡入淡出)
2017/10/17 Javascript
如何将你的AngularJS1.x应用迁移至React的方法
2018/02/01 Javascript
vuex 项目结构目录及一些简单配置介绍
2018/04/08 Javascript
ajaxfileupload.js实现上传文件功能
2019/04/19 Javascript
vue下使用nginx刷新页面404的问题解决
2019/08/02 Javascript
深入理解 TypeScript Reflect Metadata
2019/12/12 Javascript
基于Ionic3实现选项卡切换并重新加载echarts
2020/09/24 Javascript
Python中3种内建数据结构:列表、元组和字典
2014/11/30 Python
Python简单实现两个任意字符串乘积的方法示例
2018/04/12 Python
pyqt5 lineEdit设置密码隐藏,删除lineEdit已输入的内容等属性方法
2019/06/24 Python
基于python实现检索标记敏感词并输出
2020/05/07 Python
Python Socket多线程并发原理及实现
2020/12/11 Python
详解使用postMessage解决iframe跨域通信问题
2019/11/01 HTML / CSS
毕业生自荐信如何写
2014/03/24 职场文书
2014年高中生自我评价范文
2014/09/26 职场文书
2015年学生会个人工作总结
2015/04/09 职场文书
学校中层领导培训心得体会
2016/01/11 职场文书
2016年师德学习心得体会
2016/01/12 职场文书
《敬重卑微》读后感3篇
2019/11/26 职场文书
Java中使用Filter过滤器的方法
2021/06/28 Java/Android
PHP中多字节字符串操作实例详解
2021/08/23 PHP
欧元符号 €
2022/02/17 杂记
MySQL优化及索引解析
2022/03/17 MySQL
深入理解pytorch库的dockerfile
2022/06/10 Python