libiconv 支持的编码



php 中的 iconv() 函数常用来作编码转换用。作一些不同编码的动态数据的转换时常遇到一些未知编码的数据,这时 iconv() 支持那些编码转换就很重要。



刚开始,是分析 header  或者是网页的 charset ,从而提取编码方法,但是这种方法是有缺陷的,一些网页中是没有 charset 的,而是由浏览器自动分析而来,有时候判断不准,那就是乱码



使用iconv函数将含有繁体的 GB2312 到 UTF-8 转换时导致内容不完整,就是无法转换的时候就从此处断开,同时报 Notice  ,解决这个问题需要使用它的两个可选的辅助参数:TRANSLIT和IGNORE ,其中//IGNORE 是遇到无法转换的就跳过,继续下文; //TRANSLIT 会自动将不能直接转化的字符变成一个或多个近似的字符。

然后这两个参数并不是万能的,繁体和简体的混合字符在转的时候仍然无法显示繁体,这是由于 GB2312 编码的字符集没有含繁体字造成的,如果有一种编码包括了繁体和简体字符集,那么在转换的时候就没有错误,这就用到了 GBK 或者是 GB18030,三者的关系是 GB18030 > GBK > GB2312,也就是说在用iconv函数将含有繁简体的 GB2312 到 UTF-8 转换时标记为 GBk 的 GBK 到 UTF-8 转换效果更好一点。



对iconv函数而言,就是按上面的方法有时候问题仍不能解决,这是由于iconv函数本身的缺陷造成的,PHP还有一个扩展:MBSTRING ,也是用来编码转化的,在编码转换上效果似乎更优,而且能自动判断数据编码,但是用 MBSTRING 自动判断含有繁体的 GB2312 字符集时,它不会认为这是GBK集而是ASCII,而ASCII仅仅可能就是美式键盘的字符集合而已,怎么能和 GBK 相提并论呢,当用 MBSTRING 判断出错,自然用MBSTRING 转换就出问题



所以,不管是用 iconv 或者是 MBSTRING,首先取得网页中数据编码,这里用到了 iconv 、MBSTRING 支持的编码集,知道这个之后就能判断未知数据的编码,从而准确的进行编码转换,再也不怕乱码了。



libiconv 官方网站上的编码支持明细 http://www.gnu.org/software/libiconv/



下面的这个函数能取得数据的编码方式



<?php

header("Content-type: text/html; charset=UTF-8");

$str = file_get_contents('gbk.html');

$coding = chkcode($str); //判断文件gbk.html的编码

$str = iconv($coding,"UTF-8//IGNORE//TRANSLIT",$str); //转为UTF-8编码

echo $str;



function chkcode($str){

    $code = array(

        'GBK',

        'EUC-CN',

        'BIG5',

        'EUC-TW',

        'HZ',

        'CP950',

        'BIG5-HKSCS',

        'UTF-8',

        'ASCII',

        'ISO-8859-1',

        'ISO-8859-6',

        'ISO-8859-8',

        'GB2312',

        'CP936',

        'BIG5-HKSCS:2001',

        'BIG5-HKSCS:1999',

        'ISO-2022-CN',

        'ISO-2022-CN-EXT',

        'SJIS',

        'JIS',

        'EUC-JP',

        'SHIFT_JIS',

        'eucJP-win',

        'SJIS-win',

        'ISO-2022-JP',

        'CP932',

        'ISO-2022-JP',

        'ISO-2022-JP-2',

        'ISO-2022-JP-1',

        'EUC-KR',

        'CP949',

        'ISO-2022-KR',

        'JOHAB',

        'UTF-7'

);



foreach($code as $charset){

if($str==iconv('UTF-8',"$charset//IGNORE//TRANSLIT",iconv($charset,'UTF-8// IGNORE//TRANSLIT',$str))){

        return $charset;

        break;

        }

    }

return 'UTF-8';

}

?>

libiconv 支持的编码的更多相关文章

  1. CodePage------Encoding 类支持的编码以及与这些编码关联的代码页(CodePage)

    Encoding 类 .NET Framework 4  表示字符编码. 继承层次结构 System.Object  System.Text.Encoding    System.Text.ASCII ...

  2. 让ffmpeg支持10bit编码

    文章版权由作者柯O德尔和博客园共有,请尊重并支持原创,若转载请于明显处标明出处:http://www.cnblogs.com/koder/ 最近因为工作需要,要进行265 10bit编码,于是从ffm ...

  3. ubuntu中eclipse 不支持gbk编码问题解决办法

    今天在ubuntu 下, 把Windows下工程导入Linux下Eclipse中,由于工程代码,是GBK编码,而Ubuntu默认不支持GBK编码,所以,要让Ubuntu支持GBK. 方法如下: 1.修 ...

  4. 让ubuntu下的eclipse支持GBK编码

    把Windows下工程导入Linux下Eclipse中,由于以前的工程代码,都是GBK编码,而Ubuntu默认不支持GBK编码,所以,我们要让Ubuntu支持GBK,方法如下: 1.修改/var/li ...

  5. 获取jdk支持的编码类型

    //获取jdk支持的编码类型 Map<String,Charset> maps = Charset.availableCharsets(); for(Map.Entry<String ...

  6. php开启mbstring扩展并设置支持utf-8编码

    前一段时间使用一个服务的接口,因为调用接口时使用的参数里面有中文,调用接口会出现异常问题,后来才明白是编码不一致的问题.然而,我本地项目开发使用的是utf-8,接口那边也是需要utf-8的,那么问题来 ...

  7. freeswitch 音 视频 支持的编码

    FreeSWITCH 支持很多的语音编解码:[13] PCMU – G.711 µ-law PCMA – G.711 A-law G.722 G.722.1 G.722.1c G.726 G.726  ...

  8. 如何使 vlc 支持 fdk-aac 编码(windows平台

    可能是由于fdk-aac开源协议的原因,VLC默认是不支持fdk-aac编码的,fdk-aac 是非常优秀的AAC编码库,并且支持AAC-LD AAC-ELD, 对于要求低延迟的场景下很有用. 可以通 ...

  9. 让linux下的eclipse支持GBK编码

    原文链接:http://leaze.blog.51cto.com/83088/195584 今天,把windows下的工程导入到了Linux下eclipse中,由于以前的工程代码,都是GBK编码的,而 ...

随机推荐

  1. 25.内置API

    转自:https://www.cnblogs.com/best/tag/Angular/ 3.1.数据转换 示例: 默认情况JavaScript中对象是传引用的: var tom={name:&quo ...

  2. Android 勤用RXJava compose操作符消除重复代码

    相信小伙伴在使用RXJava与Retrofit请求网络时,都有遇到过这样的场景,在IO线程请求网络解析数据,接着返回主线程setData.更新View试图,那么也肯定熟悉下面这几句代码: .subsc ...

  3. 分享关于浏览器对象 history对象

    window.history.forward() == window.history.go(-1) //返回下一页 window.history.back() == window.history.go ...

  4. Codefroces 852 G. Bathroom terminal

    G. Bathroom terminal Smith wakes up at the side of a dirty, disused bathroom, his ankle chained to p ...

  5. 重写prototype原型后哪些东西改变了

    参考<JavaScript高级教程>实例看: 1.重写原型对象后,首先原型对象的constructor属性值(constructor的指向)会发生改变. function Person() ...

  6. 实现IE下兼容CSS3的圆角效果

    有些CSS3的牛逼的效果在IE下展示不出来是最烦人的啦,在项目中做的圆角效果到了IE下一堆方块....忒尴尬了...,找了个替代解决方案 1.首先下载一个js插件PIE.js百度一搜都是的,我也就不写 ...

  7. qt获取磁盘序列号

    #include "windows.h" QString lpRootPathName = "c:\\"; LPTSTR lpVolumeNameBuffer= ...

  8. java 第三方库

    转载自http://www.cnblogs.com/lucus-jia/p/3483511.html java 第三方库   总结一下常用的java第三方库,方便查询和使用,欢迎补充. 1.核心库 A ...

  9. 源码安装 ipython

    https://blog.csdn.net/huobanjishijian/article/details/51470898

  10. 用Ngen指令加快C#程序的启动速度

    用Ngen指令加快C#程序的启动速度 由于C#是使用实时 (JIT) 编译器编译原始程序集.因此第一次运行C#程序(或Dll)时,程序的启动非常慢.为了提高用户的体验,可以用Microsoft的供的本 ...