zoukankan      html  css  js  c++  java
  • iconv 中文截断问题的解决方法

    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有些服务器会有问题。

  • 相关阅读:
    201671010417 金振兴 词频统计软件项目报告
    201671010417 金振兴 实验三 作业互评与改进
    读构建之法提出的问题
    201671010422 结对项目报告
    201671010422 马亮 实验三作业互评与改进报告
    实验十四 个人学习总结
    201671010422 词频统计软件项目报告
    201671010423马丽莎 《英文文本统计分析》结对项目报告
    201671010423 词频统计软件项目报告
    201671010423马丽莎 实验三作业互评与改进报告
  • 原文地址:https://www.cnblogs.com/easirm/p/4180001.html
Copyright © 2011-2022 走看看