php字符编码转换之gb2312转为utf8


Posted in PHP onOctober 28, 2013

 在php中字符编码转换我们一般会用到iconv与mb_convert_encoding进行操作,但是mb_convert_encoding在转换性能上比iconv要差很多哦。
string iconv ( string in_charset, string out_charset, string str ) 注意:第二个参数,除了可以指定要转化到的编码以外,还可以增加两个后缀://TRANSLIT 和 //IGNORE,其中 //TRANSLIT 会自动将不能直接转化的字符变成一个或多个近似的字符,//IGNORE 会忽略掉不能转化的字符,而默认效果是从第一个非法字符截断。
Returns the converted string or FALSE on failure.
string mb_convert_encoding ( string str, string to_encoding [, mixed from_encoding] )
需要先enable mbstring 扩展库,在 php.ini里将; extension=php_mbstring.dll 前面的 ; 去掉
mb_convert_encoding 可以指定多种输入编码,它会根据内容自动识别,但是执行效率比iconv差太多;

使用:
发现iconv在转换字符”—”到gb2312时会出错,如果没有ignore参数,所有该字符后面的字符串都无法被保存。不管怎么样,这个”—”都无法转换成功,无法输出。 另外mb_convert_encoding没有这个bug.
一般情况下用 iconv,只有当遇到无法确定原编码是何种编码,或者iconv转化后无法正常显示时才用mb_convert_encoding 函数.

/** 
*自动判断把gbk或gb2312编码的字符串转为utf8 
*能自动判断输入字符串的编码类,如果本身是utf-8就不用转换,否则就转换为utf-8的字符串 
*支持的字符编码类型是:utf-8,gbk,gb2312 
*@$str:string 字符串 
*/ 
function yang_gbk2utf8($str){ 
    $charset = mb_detect_encoding()($str,array('UTF-8','GBK','GB2312')); 
    $charset = strtolower($charset); 
    if('cp936' == $charset){ 
        $charset='GBK'; 
    } 
    if("utf-8" != $charset){ 
        $str = iconv($charset,"UTF-8//IGNORE",$str); 
    } 
    return $str; 
}

下面我接着看在转换字符编码的一些问题
用mb_detect_encoding($str);函数,使用该函数必须打开php的extension=php_mbstring.dll扩展
<?php
$str="测试ing";
$cha=mb_detect_encoding($str);
$s = iconv($cha,"UTF-8",$str);
var_dump($s);
?>

结果返回:
string(0) “”
真是奇怪,为什么会这样。
<?php
$str="测试ing";
$cha=mb_detect_encoding($str);
$s = iconv("GB2312","UTF-8",$str);
var_dump($s);
?>

返回结果正确。发现该函数mb_detect_encoding($str);判断还是不准确。不知是什么原因。
函数string mb_convert_encoding ( string $str , string $to_encoding [, mixed $from_encoding ] )
可以转换为指定编码的字符串,我写了例子
<pre lang="php" line="1">
<?php
$a="我很好";
echo mb_convert_encoding ($a,'UTF-8');
?>

可结果是:
??潞?潞?
现在的问题就是我如果把不同的字符串编码形式统一转换为utf-8,如果事先知道改变吗可以用iconv,但如果不知道该编码该怎么办呢?
问题3:iconv问题,如果转换的字符串,第一个字节的编码大于一定的数会返回空.
如:
<?php
$str=chr(254)."测试ing".chr(254);
$s = iconv("GB2312","UTF-8",$str);
var_dump($s);
?>

返回
string(0) “”

mb_convert_encoding的用法见官方:

http://cn.php.net/manual/en/function.mb-convert-encoding.php

PHP中的另外一个函数iconv也是用来转换字符串编码的,与上函数功能相似。

下面还有一些详细的例子:
iconv — Convert string to requested character encoding
(PHP 4 >= 4.0.5, PHP 5)
mb_convert_encoding — Convert character encoding
(PHP 4 >= 4.0.6, PHP 5)
用法:
string mb_convert_encoding ( string str, string to_encoding [, mixed from_encoding] )
需要先enable mbstring 扩展库,在 php.ini里将; extension=php_mbstring.dll 前面的 ; 去掉
mb_convert_encoding 可以指定多种输入编码,它会根据内容自动识别,但是执行效率比iconv差太多;
string iconv ( string in_charset, string out_charset, string str )
注意:第二个参数,除了可以指定要转化到的编码以外,还可以增加两个后缀://TRANSLIT 和 //IGNORE,其中 //TRANSLIT 会自动将不能直接转化的字符变成一个或多个近似的字符,//IGNORE 会忽略掉不能转化的字符,而默认效果是从第一个非法字符截断。
Returns the converted string or FALSE on failure.
使用:
发现iconv在转换字符”—”到gb2312时会出错,如果没有ignore参数,所有该字符后面的字符串都无法被保存。不管怎么样,这个”—”都无法转换成功,无法输出。 另外mb_convert_encoding没有这个bug.
一般情况下用 iconv,只有当遇到无法确定原编码是何种编码,或者iconv转化后无法正常显示时才用mb_convert_encoding 函数.
from_encoding is specified by character code name before conversion. it can be array or string ? comma separated enumerated list. If it is not specified, the internal encoding will be used.
/* Auto detect encoding from JIS, eucjp-win, sjis-win, then convert str to UCS-2LE */
$str = mb_convert_encoding($str, “UCS-2LE”, “JIS, eucjp-win, sjis-win”);
/* “auto” is expanded to “ASCII,JIS,UTF-8,EUC-JP,SJIS” */
$str = mb_convert_encoding($str, “EUC-JP”, “auto”);
例子:

<?php  
 $content = iconv("GBK", "UTF-8", $content);  
 $content = mb_convert_encoding($content, "UTF-8", "GBK");  
?>

这个可以根据输入输出的字符编码进行转换
<?php
function phpcharset($data, $to) {
 if(is_array($data)) {
  foreach($data as $key => $val) {
   $data[$key] = phpcharset($val, $to);
  }
 } else {
  $encode_array = array('ASCII', 'UTF-8', 'GBK', 'GB2312', 'BIG5');
  $encoded = mb_detect_encoding($data, $encode_array);
  $to = strtoupper($to);
  if($encoded != $to) {
   $data = mb_convert_encoding($data, $to, $encoded);
  }
 }
 return $data;
}
?>
PHP 相关文章推荐
PHP中GET变量的使用
Oct 09 PHP
PHP转换文件夹下所有文件编码的实现代码
Jun 06 PHP
PHP 伪静态技术原理以及突破原理实现介绍
Jul 12 PHP
php中Ctype函数用法详解
Dec 09 PHP
php中get_object_vars()方法用法实例
Feb 08 PHP
php中动态调用函数的方法
Mar 16 PHP
微信公众号支付之坑:调用支付jsapi缺少参数 timeStamp等错误解决方法
Jan 12 PHP
PHP实现的数独求解问题示例
Apr 18 PHP
Yii框架实现多数据库配置和操作的方法
May 25 PHP
php实现统计二进制中1的个数算法示例
Jan 23 PHP
PHP使用ActiveMQ实现消息队列的方法详解
May 31 PHP
使用tp框架和SQL语句查询数据表中的某字段包含某值
Oct 18 PHP
使用PHP curl模拟浏览器抓取网站信息
Oct 28 #PHP
php header功能的使用
Oct 28 #PHP
简单实用的.net DataTable导出Execl
Oct 28 #PHP
php json与xml序列化/反序列化
Oct 28 #PHP
php中的boolean(布尔)类型详解
Oct 28 #PHP
php中的比较运算符详解
Oct 28 #PHP
php float不四舍五入截取浮点型字符串方法总结
Oct 28 #PHP
You might like
php从右向左/从左向右截取字符串的实现方法
2011/11/28 PHP
Laravel5.5 手动分页和自定义分页样式的简单实现
2019/10/15 PHP
js类中获取外部函数名的方法与代码
2007/09/12 Javascript
为指定的元素添加遮罩层的示例代码
2014/01/15 Javascript
JavaScript中常见获取元素的方法汇总
2015/03/04 Javascript
JavaScript列表框listbox全选和反选的实现方法
2015/03/18 Javascript
在JavaScript应用中实现延迟加载的方法
2015/06/25 Javascript
JavaScript高级教程5.6之基本包装类型(详细)
2015/11/23 Javascript
jQuery弹层插件jquery.fancybox.js用法实例
2016/01/22 Javascript
BootstrapValidator不触发校验的实现代码
2016/09/28 Javascript
AngularJS出现$http异步后台无法获取请求参数问题的解决方法
2016/11/03 Javascript
js对字符串进行编码的方法总结(推荐)
2016/11/10 Javascript
限时抢购-倒计时的完整实例(分享)
2017/09/17 Javascript
vue中设置、获取、删除cookie的方法
2018/09/21 Javascript
详解如何在vscode里面调试js和node.js的方法步骤
2018/12/24 Javascript
vue使用svg文件补充-svg放大缩小操作(使用d3.js)
2020/09/22 Javascript
解决vue watch数据的方法被调用了两次的问题
2020/11/07 Javascript
vue 解决IOS10低版本白屏的问题
2020/11/17 Javascript
python实现批量转换文件编码(批转换编码示例)
2014/01/23 Python
Python操作MySQL简单实现方法
2015/01/26 Python
python获取文件扩展名的方法
2015/07/06 Python
Python 正则表达式入门(初级篇)
2016/12/07 Python
python实现自动发送邮件发送多人、群发、多附件的示例
2018/01/23 Python
python实现udp聊天窗口
2020/03/31 Python
Python+Appium实现自动化清理微信僵尸好友的方法
2021/02/04 Python
html5 迷宫游戏(碰撞检测)实例一
2013/07/25 HTML / CSS
德国大型的家具商店:Pharao24.de
2016/10/02 全球购物
Skyscanner波兰:廉价航班
2017/11/07 全球购物
机电专业个人自荐信格式模板
2013/09/23 职场文书
招商专员岗位职责
2014/02/08 职场文书
市场推广策划方案
2014/06/02 职场文书
2014客服代表实习自我鉴定
2014/09/18 职场文书
自习课吵闹检讨书范文
2014/09/26 职场文书
学生打架检讨书
2014/10/20 职场文书
入党转正介绍人意见
2015/06/03 职场文书
《雷雨》教学反思
2016/02/20 职场文书