PHP 如何转换编码
代码: <?php
//自动检测内容是编码进行转换 get_encoding($data,"GB2312"); function get_encoding($data,$to) {
$encode_arr=array(‘UTF-8′,’ASCII’,’GBK’,’GB2312′,’BIG5′,’JIS’, ‘eucjp-win’,’sjis-win’,’EUC-JP’); $encoded = mb_detect_encoding($data, $encode_arr);
$data = mb_convert_encoding($data,$to,$encoded);
return $data;
}
?>
详解:
首先解释一下mb_detect_encoding ,mb_convert_encoding 这两个函数
·mb_detect_encoding:
使用 mb_detect_encoding() 函数来判断字符串是什么编码的。
该函数有三个参数:
1:被检测的输入变量、
2:编码方式的检测顺序(一旦为真,后面自动忽略)、
3:strict模式(该模式表示是都按照严格的编码进行判断默认是false)
细节讨论: <?php
$encode=mb_detect_encoding($keytitle,array("ASCII",’UTF-8′,"GB2312′,"GBK",’ BIG5′));
if ($encode == “UTF-8″){
$keytitle = iconv("UTF-8″,"GBK",$keytitle);
}
?>
这段代码的作用是检测字符串的编码是否UTF-8,是的话就转换为GBK。
可是当 $keytitle = “%D0%BE%C6%AC”;时。检测结果却是UTF-8.这个bug其实不算是bug,写程序时也不应当过于依赖mb_detect_encoding,当字符串较短时,检测结果产生偏差的可能性很大。
怎么解决呢,我的办法是:
$encode = mb_detect_encoding($keytitle, array(‘ASCII’,’GB2312′,’GBK’,’UTF-8′); 所以结论:
对编码检测的顺序进行调整,将最大可能性放在前面,这样减少被错误转换的机会。 一般要先排gb2312,当有GBK和UTF-8时,需要将常用的排列到前面。
·mb_convert_encoding:
该函数有三个参数如下:
mb_convert_encoding( $str, $encoding1,$encoding2 );
$str,要转换编码的字符串
$encoding1,目标编码,如utf-8,gbk,大小写均可
$encoding2,原编码,如utf-8,gbk,大小写均可
例子:
<?php
$str=’编码’;
echo mb_convert_encoding($str, "UTF-8");
//编码转换为utf-8
?>
<?php $str=’编码’;
echo mb_convert_encoding($str, "UTF-8", "GBK");
//已知原编码为GBK,转换为utf-8
?>
<?php
$str=’编码’;
echo mb_convert_encoding($str, "UTF-8", "auto");
//未知原编码,通过auto自动检测后,转换编码为utf-8
?>
细节讨论:
iconv和mb_convert_encoding函数都具有转换编码的功能 区别是什么?
iconv不是php的默认函数,也是默认安装的模块。需要安装才能用的。
windows 下需要修改php.ini文件,将extension=php_iconv.dll前的";"去掉,同时你要copy你的原php安装文件下的iconv.dll到你的winnt/system32下。
在linux环境下,用静态安装的方式,在configure时加多一项 –with-iconv就可以了,phpinfo看得到iconv的项
string iconv ( string in_charset, string out_charset, string str )
注意:第二个参数,除了可以指定要转化到的编码以外,还可以增加两个后缀://TRANSLIT 和 //IGNORE,其中 //TRANSLIT 会自动将不能直接转化的字符变成一个或多个近似的字符,//IGNORE 会忽略掉不能转化的字符,而默认效果是从第一个非法字符截断。 写法如下:
$trans_sentence = iconv(‘UTF-8’, ‘ASCII//TRANSLIT’, $utf8_sentence);
$trans_sentence = iconv(‘UTF-8’, ‘ASCII//IGNORE’, $utf8_sentence);
string mb_convert_encoding ( string str, string to_encoding [, mixed from_encoding] ) 需要先enable mbstring 扩展库,在 php.ini里将; extension=php_mbstring.dll 前面的 ; 去掉
mb_convert_encoding 可以指定多种输入编码,它会根据内容自动识别。
需要注意的是:
1、iconv在转换字符”—”到gb2312时会出错,如果没有ignore参数,所有该字符后面的字符串都无法被保存,mb_convert_encoding没有这个bug。
2、mb_convert_encoding执行效率比iconv差太多,只有在iconv转化后无法正常显示时才使用。
$content = iconv(”GBK”, “UTF-8″, $content);
$content = mb_convert_encoding($content, “UTF-8″, “GBK”);
把$content由GBK转换成utf-8。