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编码的,而 ...
随机推荐
- eclipse启动Tomcat加载项目时报内存溢出错误解决办法
在eclipse中点击Window->Preferences打开全局属性设置对话框,如下图所示设置Tomcat运行时的JVM参数,添加这段JVM设置:-Xms256M -Xmx768M -XX: ...
- vue.js原生组件化开发(一)——组件开发基础
前言 vue作为一个轻量级前端框架,其核心就是组件化开发.我们一般常用的是用脚手架vue-cli来进行开发和管理,一个个组件即为一个个vue页面,这种叫单文件组件.我们在引用组件之时只需将组件页面引入 ...
- Assembly.Load 详解(c#)
我们在使用C# 语言的Assembly.Load 来加载托管程序集并使用反射功能时,一般需要先通过Assembly.Load(), Assembly.LoadFrom() 等方法将目标托管程序集加载到 ...
- JAVA学习(一)——基本语法
tips:前端开发写惯了弱类型语言,再来学强类型语言,真的是被各种修饰符.类型声明给整的云里雾里,而且java语法和javascript语言差别还是很大的,所以做好笔记,把一些需要注意的地方记下来是非 ...
- debian8平滑升级到debian9
本文在Creative Commons许可证下发布. 首先,在升级时可以查看一下自己的版本号: uname -a ##查看内核信息 cat /etc/issue ##查看发行版本号 方法1:利用网 ...
- img下面的留白解决
在做网页的时候经常会出现一个令人困惑的现象.那就是行内元素和块级元素之间会出现“留白”.就是块级元素中明明只有一个行内元素,但行内元素却不会铺满块级元素.像这个例子: “留白”出现的原因 行内元素默认 ...
- 各消息队列对比,Kafka深度解析,众人推荐,精彩好文!
http://blog.csdn.net/allthesametome/article/details/47362451
- Nagle和Cork
我觉得这篇讲的不错. http://blog.csdn.net/c_cyoxi/article/details/8673645 Nagle算法的基本定义是任意时刻,最多只能有一个未被确认的小段. 关闭 ...
- zoj 2317 Nice Patterns Strike Back(矩阵乘法)
problemId=1317">http://acm.zju.edu.cn/onlinejudge/showProblem.do? problemId=1317 给出一个n*m的矩阵( ...
- Justinmind使用教程(5)——Justinmind破解
今天继续用Justinmind的时候.提示快到期啦. 所以今天学习的课题比較简单了,就是怎样破解Justinmind. 眼下没有无敌的注冊码,大家依照例如以下方式操作一定就解决全部问题了 1.删除两个 ...