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静态类
Nov 25 PHP
PHP 地址栏信息的获取代码
Jan 07 PHP
php多文件上传功能实现原理及代码
Apr 18 PHP
discuz免激活同步登入代码修改方法(discuz同步登录)
Dec 24 PHP
php中file_get_contents与curl性能比较分析
Nov 08 PHP
调试WordPress中定时任务的相关PHP脚本示例
Dec 10 PHP
PHP接收App端发送文件流的方法
Sep 23 PHP
如何使用PHP给图片加水印
Oct 12 PHP
php 判断过去离现在几年的函数(实例代码)
Nov 15 PHP
PHP 实现人民币小写转换成大写的方法及大小写转换函数
Nov 17 PHP
Laravel利用gulp如何构建前端资源详解
Jun 03 PHP
PHP7创建销毁session的实例方法
Feb 03 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 FOR MYSQL 代码生成助手(根据Mysql里的字段自动生成类文件的)
2011/07/23 PHP
php打印输出棋盘的实现方法
2014/12/23 PHP
PHP rsa加密解密使用方法
2015/04/27 PHP
PHP实现的无限分类类库定义与用法示例【基于thinkPHP】
2018/08/06 PHP
jquery 中多条件选择器,相对选择器,层次选择器的区别
2012/07/03 Javascript
jquery打开直接跳到网页最下面、最低端实现代码
2013/04/22 Javascript
判断JS对象是否拥有某种属性的两种方式
2013/12/02 Javascript
jquery选择器之属性过滤选择器详解
2014/01/27 Javascript
JavaScript中的toDateString()方法使用详解
2015/06/12 Javascript
js如何判断输入字符串长度
2015/12/16 Javascript
jQuery弹出窗口简单实现代码
2017/03/09 Javascript
jquery实现异步加载图片(懒加载图片一种方式)
2017/04/24 jQuery
layer弹窗插件操作方法详解
2017/05/19 Javascript
javascript中神奇的 Date对象小结
2017/10/12 Javascript
Angular利用trackBy提升性能的方法
2018/01/26 Javascript
详解在vue-cli中使用graphql即vue-apollo的用法
2018/09/08 Javascript
jQuery+Datatables实现表格批量删除功能【推荐】
2018/10/24 jQuery
JS算法题之查找数字在数组中的索引位置
2019/05/15 Javascript
仿iPhone通讯录制作小程序自定义选择组件的实现
2019/05/23 Javascript
微信小程序图片左右摆动效果详解
2019/07/13 Javascript
Vue时间轴 vue-light-timeline的用法说明
2020/10/29 Javascript
node.js文件的复制、创建文件夹等相关操作
2021/02/05 Javascript
[01:11:10]2014 DOTA2华西杯精英邀请赛 5 24 iG VS VG加赛
2014/05/26 DOTA
[01:31:03]DOTA2完美盛典全回顾 见证十五项大奖花落谁家
2017/11/28 DOTA
python内存管理分析
2015/04/08 Python
python中assert用法实例分析
2015/04/30 Python
bpython 功能强大的Python shell
2016/02/16 Python
说一说Python logging
2016/04/15 Python
Python tornado队列示例-一个并发web爬虫代码分享
2018/01/09 Python
python如何拆分含有多种分隔符的字符串
2018/03/20 Python
python+pandas分析nginx日志的实例
2018/04/28 Python
解决pandas中读取中文名称的csv文件报错的问题
2018/07/04 Python
python3学生名片管理v2.0版
2018/11/29 Python
基于python+selenium的二次封装的实现
2020/01/06 Python
Python连接Hadoop数据中遇到的各种坑(汇总)
2020/04/14 Python
Django实现drf搜索过滤和排序过滤
2021/06/21 Python