PHP编码转换函数 自动转换字符集支持数组转换


Posted in PHP onDecember 16, 2012
// 自动转换字符集 支持数组转换 
function auto_charset($fContents, $from='gbk', $to='utf-8') { 
$from = strtoupper($from) == 'UTF8' ? 'utf-8' : $from; 
$to = strtoupper($to) == 'UTF8' ? 'utf-8' : $to; 
if (strtoupper($from) === strtoupper($to) || empty($fContents) || (is_scalar($fContents) && !is_string($fContents))) { 
//如果编码相同或者非字符串标量则不转换 
return $fContents; 
} 
if (is_string($fContents)) { 
if (function_exists('mb_convert_encoding')) { 
return mb_convert_encoding($fContents, $to, $from); 
} elseif (function_exists('iconv')) { 
return iconv($from, $to, $fContents); 
} else { 
return $fContents; 
} 
} elseif (is_array($fContents)) { 
foreach ($fContents as $key => $val) { 
$_key = auto_charset($key, $from, $to); 
$fContents[$_key] = auto_charset($val, $from, $to); 
if ($key != $_key) 
unset($fContents[$key]); 
} 
return $fContents; 
} 
else { 
return $fContents; 
} 
}

当我们在接受未知客户端提交的数据,由于各客户端的编码不统一,但在我们的服务器端最终只能以一种编码方式来处理,这种情况下就会涉及到一个将接受到的字符转换为特定编码的问题。
这时可能会想到直接用iconv来进行转码,但我们知道,iconv这个函数需要提供的两个参数为输入编码和输出编码,而我们现在根本不知道接受的字符串是什么编码,如果这个时候能得到接收字符是什么编码就好了。
对于这样的问题,一般会有两种解决方案。

方案一
要客户端提交数据时,指定所提交的编码,这时就需要多给一个用来指定编码的变量。
$string = $_GET['charset'] === 'gbk' ? iconv('gbk','utf-8',$_GET['str']) : $_GET['str'];
对于这种情况,如果在没有约定或者我们不能控制客户端的情况下,似乎这种方案使用不是很好。

方案二
直接由服务器端来检测所接收的数据编码。
这种方案当然是最理想了的了,现在问题是怎么检测一个字符的编码吗?对于这种情况,在php里,mb_string这个扩展中的mb_check_encoding提供了我们所需要的功能。
$str = mb_check_encoding($_GET['str'],'gbk') ? iconv('gbk','utf-8',$_GET['str']) : $_GET['str'];
但这需要打开mb_string这个扩展,有些时候可能我们的生产服务器中没有打开这个扩展。对于这种情况,需要自己借助如下函数来判断编码。
以下函数非本人所写

function isGb2312($string) { 
for($i=0; $i 127) { 
if( ($v >= 228) && ($v < = 233) ) 
{ 
if( ($i+2) >= (strlen($string) - 1)) return true; 
$v1 = ord( $string[$i+1] ); 
$v2 = ord( $string[$i+2] ); 
if( ($v1 >= 128) && ($v1 < =191) && ($v2 >=128) && ($v2 < = 191) ) 
return false; 
else 
return true; 
} 
} 
} 
return true; 
} 
function isUtf8($string) { 
return preg_match('%^(?: 
[\x09\x0A\x0D\x20-\x7E] # ASCII 
| [\xC2-\xDF][\x80-\xBF] # non-overlong 2-byte 
| \xE0[\xA0-\xBF][\x80-\xBF] # excluding overlongs 
| [\xE1-\xEC\xEE\xEF][\x80-\xBF]{2} # straight 3-byte 
| \xED[\x80-\x9F][\x80-\xBF] # excluding surrogates 
| \xF0[\x90-\xBF][\x80-\xBF]{2} # planes 1-3 
| [\xF1-\xF3][\x80-\xBF]{3} # planes 4-15 
| \xF4[\x80-\x8F][\x80-\xBF]{2} # plane 16 
)*$%xs', $string); 
}

这里我们就可以使以上任何一个函数来实现编码的检测。并将其转换成指定的编码。
$str = isGb2312($_GET['str'],'gbk') ? iconv('gbk','utf-8',$_GET['str']) : $_GET['str'];
PHP 相关文章推荐
提升PHP执行速度全攻略(下)
Oct 09 PHP
编写漂亮的代码 - 将后台程序与前端程序分开
Apr 23 PHP
php中将地址生成迅雷快车旋风链接的代码[测试通过]
Apr 20 PHP
PHP函数篇详解十进制、二进制、八进制和十六进制转换函数说明
Dec 05 PHP
PHP 基于文件头的文件类型验证类函数
May 01 PHP
解析PHP 使用curl提交json格式数据
Jun 29 PHP
PHP三元运算的2种写法代码实例
May 12 PHP
PHPer 需要了解的 5 个 Composer 小技巧
Aug 18 PHP
个人写的PHP验证码生成类分享
Aug 21 PHP
PHP查询并删除数据库多列重复数据的方法(利用数组函数实现)
Feb 23 PHP
CodeIgniter 完美解决URL含有中文字符串
May 13 PHP
使用laravel和ECharts实现折线图效果的例子
Oct 09 PHP
PHP获取http请求的头信息实现步骤
Dec 16 #PHP
php获取通过http协议post提交过来xml数据及解析xml
Dec 16 #PHP
mysql 查询指定日期时间内sql语句实现原理与代码
Dec 16 #PHP
非常精妙的PHP递归调用与静态变量使用
Dec 16 #PHP
PHP--用万网的接口实现域名查询功能
Dec 13 #PHP
phpexcel导出excel的颜色和网页中的颜色显示不一致
Dec 11 #PHP
PHP5.3的垃圾回收机制(动态存储分配方案)深入理解
Dec 10 #PHP
You might like
laravel 5 实现模板主题功能
2015/03/02 PHP
php阿拉伯数字转中文人民币大写
2015/12/21 PHP
PHP多维数组元素操作类的方法
2016/11/14 PHP
php实现基于pdo的事务处理方法示例
2017/07/21 PHP
PHP ADODB生成HTML表格函数rs2html功能【附错误处理函数用法】
2018/05/29 PHP
使用jQuery UI的tooltip函数修饰title属性的气泡悬浮框
2013/06/24 Javascript
js获取html页面节点方法(递归方式)
2013/12/13 Javascript
js实现连个数字相加而不是拼接的方法
2014/02/23 Javascript
JS函数的几种定义方式分析
2015/12/17 Javascript
vue实现树形菜单效果
2018/03/19 Javascript
js中el表达式的使用和非空判断方法
2018/03/28 Javascript
浅析JavaScript异步代码优化
2019/03/18 Javascript
从0到1搭建Element的后台框架的方法步骤
2019/04/10 Javascript
angularjs请求数据的方法示例
2019/08/06 Javascript
layui table动态表头 改变表格头部 重新加载表格的方法
2019/09/21 Javascript
layui(1.0.9)文件上传upload,前后端的实例代码
2019/09/26 Javascript
跟老齐学Python之玩转字符串(2)更新篇
2014/09/28 Python
用Python实现KNN分类算法
2017/12/22 Python
浅谈python中字典append 到list 后值的改变问题
2018/05/04 Python
Pycharm连接远程服务器并实现远程调试的实现
2019/08/02 Python
详解python播放音频的三种方法
2019/09/23 Python
python GUI库图形界面开发之PyQt5简单绘图板实例与代码分析
2020/03/08 Python
使用已经得到的keras模型识别自己手写的数字方式
2020/06/29 Python
Win10下配置tensorflow-gpu的详细教程(无VS2015/2017)
2020/07/14 Python
CSS3过渡transition效果实例介绍
2016/05/03 HTML / CSS
使用Html5 Stream开发实时监控系统
2020/06/02 HTML / CSS
小学体育教学反思
2014/01/31 职场文书
《影子》教学反思
2014/02/21 职场文书
国旗下演讲稿
2014/05/08 职场文书
党员公开承诺书内容
2014/05/20 职场文书
大学活动总结模板
2014/07/10 职场文书
开服装店计划书
2014/08/15 职场文书
公司新人试用期自我评价
2014/09/17 职场文书
项目转让协议书
2014/10/27 职场文书
2015年校长新年寄语
2014/12/08 职场文书
Lombok的详细使用及优缺点总结
2021/07/15 Java/Android