• 博客园logo
  • 会员
  • 众包
  • 新闻
  • 博问
  • 闪存
  • 赞助商
  • HarmonyOS
  • Chat2DB
    • 搜索
      所有博客
    • 搜索
      当前博客
  • 写随笔 我的博客 短消息 简洁模式
    用户头像
    我的博客 我的园子 账号设置 会员中心 简洁模式 ... 退出登录
    注册 登录

cynchanpin

  • 博客园
  • 联系
  • 订阅
  • 管理

View Post

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

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


今天做了一个採集程序,原理非常easy。使用curl方法把对方页面的html获取分析,然后正则提取须要的数据并保存在数据库。

因为对方页面是GB2312编码,而本地使用的是UTF-8编码。因此在採集后须要进行编码转换。


使用了iconv方法进行编码转换

iconv — 字符串按要求的字符编码来转换
string iconv ( string $in_charset , string $out_charset , string $str )
将字符串 str 从 in_charset 转换编码到 out_charset 。


转换的方法非常easy,直接使用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有些server会有问题。






posted on 2017-04-21 08:13  cynchanpin  阅读(751)  评论(0)    收藏  举报

刷新页面返回顶部
 
博客园  ©  2004-2025
浙公网安备 33010602011771号 浙ICP备2021040463号-3