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 相关文章推荐
phpExcel导出大量数据出现内存溢出错误的解决方法
Feb 28 PHP
解析使用substr截取UTF-8中文字符串出现乱码的问题
Jun 20 PHP
ThinkPHP惯例配置文件详解
Jul 14 PHP
php上传文件并显示上传进度的方法
Mar 24 PHP
php结合ACCESS的跨库查询功能
Jun 12 PHP
学习php设计模式 php实现适配器模式
Dec 07 PHP
PHP在线书签系统分享
Jan 04 PHP
完美解决phpexcel导出到xls文件出现乱码的问题
Oct 29 PHP
Yii框架实现图片上传的方法详解
May 20 PHP
PHP+redis实现的购物车单例类示例
Feb 02 PHP
如何让PHP编码更加好看利于阅读
May 12 PHP
PHP7 windows支持
Mar 09 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与SQL注入攻击[一]
2007/04/17 PHP
基于PHP编程注意事项的小结
2013/04/27 PHP
PHP按行读取文件时删除换行符的3种方法
2014/05/04 PHP
使用PHP下载CSS文件中的所有图片【几行代码即可实现】
2016/12/14 PHP
PHP大文件分片上传的实现方法
2018/10/28 PHP
PDO::rollBack讲解
2019/01/29 PHP
PHP7原生MySQL数据库操作实现代码
2020/07/03 PHP
input的focus方法使用
2010/03/13 Javascript
iframe里的页面禁止右键事件的方法
2014/06/10 Javascript
jQuery大于号(&gt;)选择器的作用解释
2015/01/13 Javascript
jQuery图片渐变特效的简单实现
2016/06/25 Javascript
JS简单设置下拉选择框默认值的方法
2016/08/20 Javascript
js仿iphone秒表功能 计算平均数
2017/01/11 Javascript
JS判断Android、iOS或浏览器的多种方法(四种方法)
2017/06/29 Javascript
使用JS组件实现带ToolTip验证框的实例代码
2017/08/23 Javascript
JavaScript定义及输出螺旋矩阵的方法详解
2017/12/01 Javascript
nodejs实现的简单web服务器功能示例
2018/03/15 NodeJs
详解基于React.js和Node.js的SSR实现方案
2019/03/21 Javascript
小程序两种滚动公告栏的实现方法
2019/09/17 Javascript
vue-iview动态新增和删除的方法
2020/06/17 Javascript
微信小程序实现canvas分享朋友圈海报
2020/06/21 Javascript
vue实现滚动鼠标滚轮切换页面
2020/12/13 Vue.js
[00:39]DOTA2上海特级锦标赛 Liquid战队宣传片
2016/03/04 DOTA
Django中处理出错页面的方法
2015/07/15 Python
python GUI库图形界面开发之PyQt5输入对话框QInputDialog详细使用方法与实例
2020/02/27 Python
Python 操作 PostgreSQL 数据库示例【连接、增删改查等】
2020/04/21 Python
pycharm 多行批量缩进和反向缩进快捷键介绍
2021/01/15 Python
html5+svg学习指南之SVG基础知识
2014/12/17 HTML / CSS
秋季运动会广播稿
2014/02/22 职场文书
《金子》教学反思
2014/04/13 职场文书
专题组织生活会方案
2014/06/15 职场文书
2014年大学学生会工作总结
2014/12/02 职场文书
我们的节日中秋节活动总结
2015/03/23 职场文书
养成教育工作总结
2015/08/13 职场文书
Java Socket实现多人聊天系统
2021/07/15 Java/Android
Python 使用 Frame tkraise() 方法在 Tkinter 应用程序中的Frame之间切换
2022/04/24 Python