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 相关文章推荐
phpmyadmin 访问被拒绝的真实原因
Jun 15 PHP
php数组函数序列之in_array() 查找数组值是否存在
Oct 29 PHP
深入php常用函数的使用汇总
Jun 08 PHP
纯PHP生成的一个树叶图片画图例子
Apr 16 PHP
destoon实现底部添加你是第几位访问者的方法
Jul 15 PHP
PHP中的use关键字概述
Jul 23 PHP
php中的常用魔术方法汇总
Feb 14 PHP
利用PHP命令行模式采集股票趋势信息
Aug 09 PHP
php版阿里大于(阿里大鱼)短信发送实例详解
Nov 30 PHP
thinkPHP框架实现生成条形码的方法示例
Jun 06 PHP
php+mysql开发的最简单在线题库(在线做题系统)完整案例
Mar 30 PHP
Laravel等框架模型关联的可用性浅析
Dec 15 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
咖啡冲泡指南 咖啡有哪些制作方式 单品咖啡 意式咖啡
2021/03/06 冲泡冲煮
ThinkPHP中实例Model方法的区别说明
2010/08/21 PHP
php数组删除元素示例
2014/03/21 PHP
兼容多浏览器的字幕特效Marquee的通用js类
2008/07/20 Javascript
使用js 设置url参数
2013/07/08 Javascript
从零学jquery之如何使用回调函数
2014/05/16 Javascript
JavaScript电子时钟倒计时
2016/01/09 Javascript
浅谈javascript中的constructor
2016/06/08 Javascript
一个极为简单的requirejs实现方法
2016/10/20 Javascript
Move.js入门
2017/02/08 Javascript
js return返回多个值,通过对象的属性访问方法
2017/02/21 Javascript
详解微信小程序-扫一扫 wx.scanCode() 扫码大变身
2019/04/30 Javascript
Element 默认勾选表格 toggleRowSelection的实现
2019/09/04 Javascript
js实现提交前对列表数据的增删改查
2020/01/16 Javascript
详解vue组件之间的通信
2020/08/30 Javascript
[46:23]OG vs EG 2018国际邀请赛淘汰赛BO3 第一场 8.23
2018/08/24 DOTA
Python多线程编程(八):使用Event实现线程间通信
2015/04/05 Python
python opencv设置摄像头分辨率以及各个参数的方法
2018/04/02 Python
Django开发中的日志输出的方法
2018/07/02 Python
python安装requests库的实例代码
2019/06/25 Python
python命名空间(namespace)简单介绍
2019/08/10 Python
Python argparse模块应用实例解析
2019/11/15 Python
python GUI库图形界面开发之PyQt5单选按钮控件QRadioButton详细使用方法与实例
2020/02/28 Python
python如何删除文件、目录
2020/06/23 Python
css3实现针线缝合效果(图解步骤)
2013/02/04 HTML / CSS
通过Canvas及File API缩放并上传图片完整示例
2013/08/08 HTML / CSS
顶丰TOPPIK台湾官网:增发纤维假发,告别秃发困扰
2018/06/13 全球购物
企业管理专业个人求职信范文
2013/09/24 职场文书
《兰亭集序》教学反思
2014/02/11 职场文书
《三亚落日》教学反思
2014/04/26 职场文书
市级优秀班主任事迹材料
2014/05/13 职场文书
2019暑假学生安全口号
2019/06/27 职场文书
vue3中的组件间通信
2021/03/31 Vue.js
AJAX实现指定部分页面刷新效果
2021/10/16 Javascript
浅谈Redis跟MySQL的双写问题解决方案
2022/02/24 Redis
CentOS MySql8 远程连接实战
2022/04/19 MySQL