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

yipeiwu_com6年前PHP代码库

本文实例讲述了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依赖注入(DI)和控制反转(IoC)详解

首先依赖注入和控制反转说的是同一个东西,是一种设计模式,这种设计模式用来减少程序间的耦合,鄙人学习了一下,看TP官网还没有相关的文章,就写下这篇拙作介绍一下这种设计模式,希望能为TP社区...

深入解析php中的foreach问题

深入解析php中的foreach问题

前言:php4中引入了foreach结构,这是一种遍历数组的简单方式。相比传统的for循环,foreach能够更加便捷的获取键值对。在php5之前,foreach仅能用于数组;php5之...

php 表单提交大量数据发生丢失的解决方法

php 表单提交大量数据发生丢失的解决方法

最近在项目中,出现一个奇怪的现象,有一个大form里面有上千个input,提交的时候,老是发现post过来的数据不完整,一开始还怀疑是html 表单名称有冲突,排除掉了。然后,网上找了一...

探讨:如何编写PHP扩展

探讨:如何编写PHP扩展

用C/C++扩展PHP的优缺点:优点:效率,还是效率减少PHP脚本的复杂度, 极端情况下, 你只需要在PHP脚本中,简单的调用一个扩展实现的函数,然后你所有的功能都就被扩展实现了而缺点也...

PHP 读取大文件的X行到Y行内容的实现代码

需要读取一个文件的几行内容,但是文件比较大,所以研究了下php读取大文件的几行内容的方法,写了一个方法,代码如下(加了注释): 缓存文件如果能够保存在一行, 而利用算法读取指定的行数,...