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 支持的编码的更多相关文章
- CodePage------Encoding 类支持的编码以及与这些编码关联的代码页(CodePage)
Encoding 类 .NET Framework 4 表示字符编码. 继承层次结构 System.Object System.Text.Encoding System.Text.ASCII ...
- 让ffmpeg支持10bit编码
文章版权由作者柯O德尔和博客园共有,请尊重并支持原创,若转载请于明显处标明出处:http://www.cnblogs.com/koder/ 最近因为工作需要,要进行265 10bit编码,于是从ffm ...
- ubuntu中eclipse 不支持gbk编码问题解决办法
今天在ubuntu 下, 把Windows下工程导入Linux下Eclipse中,由于工程代码,是GBK编码,而Ubuntu默认不支持GBK编码,所以,要让Ubuntu支持GBK. 方法如下: 1.修 ...
- 让ubuntu下的eclipse支持GBK编码
把Windows下工程导入Linux下Eclipse中,由于以前的工程代码,都是GBK编码,而Ubuntu默认不支持GBK编码,所以,我们要让Ubuntu支持GBK,方法如下: 1.修改/var/li ...
- 获取jdk支持的编码类型
//获取jdk支持的编码类型 Map<String,Charset> maps = Charset.availableCharsets(); for(Map.Entry<String ...
- php开启mbstring扩展并设置支持utf-8编码
前一段时间使用一个服务的接口,因为调用接口时使用的参数里面有中文,调用接口会出现异常问题,后来才明白是编码不一致的问题.然而,我本地项目开发使用的是utf-8,接口那边也是需要utf-8的,那么问题来 ...
- freeswitch 音 视频 支持的编码
FreeSWITCH 支持很多的语音编解码:[13] PCMU – G.711 µ-law PCMA – G.711 A-law G.722 G.722.1 G.722.1c G.726 G.726 ...
- 如何使 vlc 支持 fdk-aac 编码(windows平台
可能是由于fdk-aac开源协议的原因,VLC默认是不支持fdk-aac编码的,fdk-aac 是非常优秀的AAC编码库,并且支持AAC-LD AAC-ELD, 对于要求低延迟的场景下很有用. 可以通 ...
- 让linux下的eclipse支持GBK编码
原文链接:http://leaze.blog.51cto.com/83088/195584 今天,把windows下的工程导入到了Linux下eclipse中,由于以前的工程代码,都是GBK编码的,而 ...
随机推荐
- 25.内置API
转自:https://www.cnblogs.com/best/tag/Angular/ 3.1.数据转换 示例: 默认情况JavaScript中对象是传引用的: var tom={name:&quo ...
- Android 勤用RXJava compose操作符消除重复代码
相信小伙伴在使用RXJava与Retrofit请求网络时,都有遇到过这样的场景,在IO线程请求网络解析数据,接着返回主线程setData.更新View试图,那么也肯定熟悉下面这几句代码: .subsc ...
- 分享关于浏览器对象 history对象
window.history.forward() == window.history.go(-1) //返回下一页 window.history.back() == window.history.go ...
- Codefroces 852 G. Bathroom terminal
G. Bathroom terminal Smith wakes up at the side of a dirty, disused bathroom, his ankle chained to p ...
- 重写prototype原型后哪些东西改变了
参考<JavaScript高级教程>实例看: 1.重写原型对象后,首先原型对象的constructor属性值(constructor的指向)会发生改变. function Person() ...
- 实现IE下兼容CSS3的圆角效果
有些CSS3的牛逼的效果在IE下展示不出来是最烦人的啦,在项目中做的圆角效果到了IE下一堆方块....忒尴尬了...,找了个替代解决方案 1.首先下载一个js插件PIE.js百度一搜都是的,我也就不写 ...
- qt获取磁盘序列号
#include "windows.h" QString lpRootPathName = "c:\\"; LPTSTR lpVolumeNameBuffer= ...
- java 第三方库
转载自http://www.cnblogs.com/lucus-jia/p/3483511.html java 第三方库 总结一下常用的java第三方库,方便查询和使用,欢迎补充. 1.核心库 A ...
- 源码安装 ipython
https://blog.csdn.net/huobanjishijian/article/details/51470898
- 用Ngen指令加快C#程序的启动速度
用Ngen指令加快C#程序的启动速度 由于C#是使用实时 (JIT) 编译器编译原始程序集.因此第一次运行C#程序(或Dll)时,程序的启动非常慢.为了提高用户的体验,可以用Microsoft的供的本 ...