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编码的,而 ...
随机推荐
- SSH之IDEA2017整合Struts2+Spring+Hibernate
转自:https://blog.csdn.net/sysushui/article/details/68937005
- django 笔记3
FBV function base view url.py index -> 函数名 view.py def 函数(requset): ... CBV class base view /inde ...
- HTTP 各种特性应用(二)
一.Cookie 通过 Set-Cookie 设置. 下次浏览器请求就会带上. 键值对,可以设置多个. Cookie 属性 max-age 和 expires 设置过期时间 Secure 只在 htt ...
- SQL语句查询数据库所有表和所有字段的详细信息(包括表描述和字段描述)
select (case then ddd.value else '' end ) as "表名(中文)" --如果表名相同就返回空 , (case then d.name els ...
- whereis---定位指令的二进制程序、源代码文件和man手册页等相关文件的路径。
whereis命令用来定位指令的二进制程序.源代码文件和man手册页等相关文件的路径. whereis命令只能用于程序名的搜索,而且只搜索二进制文件(参数-b).man说明文件(参数-m)和源代码文件 ...
- 【Henu ACM Round#17 B】USB Flash Drives
[链接] 我是链接,点我呀:) [题意] 在这里输入题意 [题解] 排序,逆序.贪心选较大的就好. [代码] #include <bits/stdc++.h> #define ll lon ...
- android SIM Switch功能和配置
SIM Switch feature是Smart 3G switch feature在LTE版本号上发展演变而来的功能: MTK双卡双待单通版本号仅仅有一个3/4 G Protocol.所以同一时刻仅 ...
- sqoop 1.4.4-cdh5.1.2高速入门
一.高速入门 (一)下载安装 1.下载并解压 wget http://archive.cloudera.com/cdh5/cdh/5/sqoop-1.4.4-cdh5.1.2.tar.gz tar - ...
- 数据结构——串的朴素模式和KMP匹配算法
一.朴素模式 假设我们要从主串S="goodgoogle"中找到子串T="google"的位置,步骤如下: i表示主串的当前位置下标,j表示子串的当前位置下标, ...
- 【基础篇】Android下拉列表框(Spinner)的基本使用
个人学习经验:第一步:新建工程,在main.xml中,main.xml内容如下: <?xml version="1.0" encoding="utf-8" ...