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 相关文章推荐
收集的DedeCMS一些使用经验
Mar 17 PHP
PHP cron中的批处理
Sep 16 PHP
PHP 冒泡排序算法的实现代码
Aug 08 PHP
ThinkPHP自动验证失败的解决方法
Jun 09 PHP
PHP冒泡排序算法代码详细解读
Jul 17 PHP
PHP 正则表达式之正则处理函数小结(preg_match,preg_match_all,preg_replace,preg_split)
Oct 05 PHP
基于php权限分配的实现代码
Apr 28 PHP
浅谈使用 PHP 进行手机 APP 开发(API 接口开发)
Aug 11 PHP
ThinkPHP实现带验证码的文件上传功能实例
Nov 01 PHP
PHP处理postfix邮件内容的方法
Jun 16 PHP
PHP定时执行任务的3种方法详解
Dec 21 PHP
thinkPHP框架实现图像裁剪、缩放、加水印的方法
Mar 14 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+SqlServer实现分页显示
2006/10/09 PHP
浅析php数据类型转换
2014/01/09 PHP
php实现图形显示Ip地址的代码及注释
2014/01/20 PHP
ThinkPHP调用common/common.php函数提示错误function undefined的解决方法
2014/08/25 PHP
PHP基础之输出缓冲区基本概念、原理分析
2019/06/19 PHP
PHP数组访问常用方法解析
2020/09/05 PHP
javascript web对话框与弹出窗口
2009/02/22 Javascript
javascript获取鼠标位置部分的实例代码(兼容IE,FF)
2013/08/05 Javascript
转换字符串为json对象的方法详解
2013/11/29 Javascript
AngularJS HTML编译器介绍
2014/12/06 Javascript
jQuery中scrollLeft()方法用法实例
2015/01/16 Javascript
JQUERY的AJAX请求缓存里的数据问题处理
2016/02/23 Javascript
教你用javascript实现随机标签云效果_附代码
2016/03/16 Javascript
JS延时器提示框的应用实例代码解析
2016/04/27 Javascript
JavaScript学习笔记--常用的互动方法
2016/12/07 Javascript
js实现数字递增特效【仿支付宝我的财富】
2017/05/05 Javascript
Node.js中的cluster模块深入解读
2018/06/11 Javascript
ionic3双击返回退出应用的方法
2019/09/17 Javascript
vue中使用element组件时事件想要传递其他参数的问题
2019/09/18 Javascript
Vue 3.0中jsx语法的使用
2020/11/13 Javascript
Python下Fabric的简单部署方法
2015/07/14 Python
Python模拟登录验证码(代码简单)
2016/02/06 Python
java中两个byte数组实现合并的示例
2018/05/09 Python
python中p-value的实现方式
2019/12/16 Python
python中有关时间日期格式转换问题
2019/12/25 Python
python中四舍五入的正确打开方式
2021/01/18 Python
澳大利亚吉他在线:Artist Guitars
2017/03/30 全球购物
西班牙床垫网上商店:Colchones.es
2018/05/06 全球购物
学校经典推荐信
2013/10/30 职场文书
工程资料员岗位职责
2014/03/10 职场文书
双语教学实施方案
2014/03/23 职场文书
家长通知书家长意见
2015/06/03 职场文书
电影地道战观后感
2015/06/04 职场文书
战友聚会致辞
2015/07/28 职场文书
启迪人心的励志语录:脾气永远不要大于本事
2020/01/02 职场文书
SQL Server基本使用和简单的CRUD操作
2021/04/05 SQL Server