PHP下编码转换函数mb_convert_encoding与iconv的使用说明


Posted in PHP onDecember 16, 2009

不过英文一般不会存在编码问题,只有中文数据才会有这个问题。比如你用Zend Studio或Editplus写程序时,用的是gbk编码,如果数据需要入数据库,而数据库的编码为utf8时,这时就要把数据进行编码转换,不然进到数据库就会变成乱码。

mb_convert_encoding的用法见官方:
http://cn.php.net/manual/zh/function.mb-convert-encoding.php

做一个GBK To UTF-8

<?php 
header("content-Type: text/html; charset=Utf-8"); 
echo mb_convert_encoding("???S我的友仔", "UTF-8", "GBK"); 
?>

再来个GB2312 To Big5
<?php 
header("content-Type: text/html; charset=big5"); 
echo mb_convert_encoding("你是我的朋友", "big5", "GB2312"); 
?>
不过要使用上面的函数需要安装但是需要先enable mbstring 扩展库。

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”);

例子:

$content = iconv("GBK", "UTF-8", $content); 
$content = mb_convert_encoding($content, "UTF-8","GBK");

PHP中使用mb_convert_encoding转码的小陷阱
在php程序中使用mb_convert_encoding()方法进行字符编码转换大家都很熟悉了,平时也在大量的使用。而且在一般情况下该方法也表现的足够好,值得表扬。但在一个项目中我们需要使用它进行UTF8到GBK的转换,在转换一些特殊字符时发现了一个不大不小的问题。具体表现为mb把在utf8可编码的字符而在gbk中不可编码的字符都转成了\0x00\0x80,这样就导致转换后的gbk字符是有问题的。
在我们的意识中,在进行字符编码转换的过程中,如果遇到目标编码不可表现的字符,转码程序应该做的是舍弃这种字符,这样虽然丢失了部分数据,但不会导致转码的字符序列不可用。不清楚mb为什么要使用上述方式而不是舍弃方式。
临时的解决方式是对转码后的字符串序列进行过滤,过滤掉所有\x00\80的字符;又或者在转义之前对utf8的字符串进行过滤,过滤掉ut8可表示而gbk不可表示的所有字符,从实现难度上来讲,第一种过滤方式比较容易做到。
PHP 相关文章推荐
PHP file_get_contents 函数超时的几种解决方法
Jul 30 PHP
php中使用Curl、socket、file_get_contents三种方法POST提交数据
Aug 12 PHP
php缩放图片(根据宽高的等比例缩放)实例介绍
Jun 09 PHP
解析php下载远程图片函数 可伪造来路
Jun 25 PHP
PHP+Jquery与ajax相结合实现下拉淡出瀑布流效果【无需插件】
May 06 PHP
PHP面向对象程序设计类的定义与用法简单示例
Dec 27 PHP
ThinkPHP使用getlist方法实现数据搜索功能示例
May 08 PHP
利用laravel+ajax实现文件上传功能方法示例
Aug 13 PHP
Laravel框架中Blade模板的用法示例
Aug 30 PHP
PHP操作MySQL中BLOB字段的方法示例【存储文本与图片】
Sep 15 PHP
php实现简单的守护进程创建、开启与关闭操作
Aug 13 PHP
tp5框架无刷新分页实现方法分析
Sep 26 PHP
php生成xml简单实例代码
Dec 16 #PHP
PHP 基本语法格式
Dec 15 #PHP
php遍历目录viewDir函数
Dec 15 #PHP
php csv操作类代码
Dec 14 #PHP
PHP开发过程中常用函数收藏
Dec 14 #PHP
将文件夹压缩成zip文件的php代码
Dec 14 #PHP
php入门教程 精简版
Dec 13 #PHP
You might like
PHP中Fatal error session_start()错误解决步骤
2014/08/05 PHP
php实现的Timer页面运行时间监测类
2014/09/24 PHP
分享ThinkPHP3.2中关联查询解决思路
2015/09/20 PHP
php5与php7的区别点总结
2019/10/11 PHP
搭建PhpStorm+PhpStudy开发环境的超详细教程
2020/09/17 PHP
JS支持带x身份证号码验证函数
2008/08/10 Javascript
Ruffy javascript 学习笔记
2009/11/30 Javascript
JavaScript 拾漏补遗
2009/12/27 Javascript
基于jquery的lazy loader插件实现图片的延迟加载[简单使用]
2011/05/07 Javascript
Notify - 基于jquery的消息通知插件
2011/10/18 Javascript
JQuery 返回布尔值Is()条件判断方法代码
2012/05/14 Javascript
javascript操作JSON的要领总结
2012/12/09 Javascript
用jquery模仿的a的title属性(兼容ie6/7)
2013/01/21 Javascript
基于JavaScript实现 获取鼠标点击位置坐标的方法
2013/04/12 Javascript
javascript 获取函数形参个数
2014/07/31 Javascript
js拆分字符串并将分割的数据放到数组中的方法
2015/05/06 Javascript
javascript实现uploadify上传格式以及个数限制
2015/11/23 Javascript
详解handlebars+require基本使用方法
2016/12/21 Javascript
pm2 部署 node的三种方法示例
2017/10/20 Javascript
vue中使用axios post上传头像/图片并实时显示到页面的方法
2018/09/27 Javascript
VUE 实现动态给对象增加属性,并触发视图更新操作示例
2019/11/29 Javascript
Postman动态获取返回值过程详解
2020/06/30 Javascript
Vue 3.0中jsx语法的使用
2020/11/13 Javascript
浅析Python多线程下的变量问题
2015/04/28 Python
python下读取公私钥做加解密实例详解
2017/03/29 Python
python2与python3爬虫中get与post对比解析
2019/09/18 Python
pytorch查看模型weight与grad方式
2020/06/24 Python
澳大利亚吉他在线:Artist Guitars
2017/03/30 全球购物
初中校园广播稿
2014/02/02 职场文书
上帝也疯狂观后感
2015/06/09 职场文书
天气温馨提示语
2015/07/14 职场文书
小程序实现文字循环滚动动画
2021/06/14 Javascript
Spring Boot 实现敏感词及特殊字符过滤处理
2021/06/29 Java/Android
MySQL对数据表已有表进行分区表的实现
2021/11/01 MySQL
Python&Matlab实现灰狼优化算法的示例代码
2022/03/21 Python
SQL语句中EXISTS的详细用法大全
2022/06/25 MySQL