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怎样调用MSSQL的存储过程
Oct 09 PHP
php环境配置 php5 mysql5 apache2 phpmyadmin安装与配置
Nov 17 PHP
php在线生成ico文件的代码
Oct 09 PHP
php.ini 配置文件的深入解析
Jun 17 PHP
解析phpstorm + xdebug 远程断点调试
Jun 20 PHP
php将textarea数据提交到mysql出现很多空格的解决方法
Dec 19 PHP
微信公众平台开发之天气预报功能
Aug 31 PHP
PHP实现表单提交时去除斜杠的方法
Dec 26 PHP
PDO::setAttribute讲解
Jan 29 PHP
laravel框架查询数据集转为数组的两种方法
Oct 10 PHP
laravel 自定义常量的两种方案
Oct 14 PHP
七种PHP开发环境搭建工具
Jun 28 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
如何在WIN2K下安装PHP4.04
2006/10/09 PHP
可定制的PHP缩略图生成程式(需要GD库支持)
2007/03/06 PHP
探讨PHP JSON中文乱码的解决方法详解
2013/06/06 PHP
浅析PHP substr,mb_substr以及mb_strcut的区别和用法
2013/06/21 PHP
PHP实现图片不变型裁剪及图片按比例裁剪的方法
2016/01/14 PHP
php 根据自增id创建唯一编号类
2017/04/06 PHP
laravel自定义分页效果
2017/07/23 PHP
分享20多个很棒的jQuery 文件上传插件或教程
2011/09/04 Javascript
js Object2String方便查看js对象内容
2014/11/24 Javascript
JS实现选项卡实例详解
2015/11/17 Javascript
JS 通过系统时间限定动态添加 select option的实例代码
2016/06/09 Javascript
javaScript如何跳出多重循环break、continue
2016/09/01 Javascript
jQuery.parseHTML() 函数详解
2017/01/09 Javascript
解析jquery easyui tree异步加载子节点问题
2017/03/08 Javascript
微信小程序 实现动态显示和隐藏某个控件
2017/04/27 Javascript
无限循环轮播图之运动框架(原生JS实现)
2017/10/01 Javascript
vue2手机APP项目添加开屏广告或者闪屏广告
2017/11/28 Javascript
详解性能更优越的小程序图片懒加载方式
2018/07/18 Javascript
vue+springboot实现项目的CORS跨域请求
2018/09/05 Javascript
关于微信小程序登录的那些事
2019/01/08 Javascript
jQuery实现动态加载(按需加载)javascript文件的方法分析
2019/05/31 jQuery
js+audio实现音乐播放器
2020/09/13 Javascript
Python获取单个程序CPU使用情况趋势图
2015/03/10 Python
对Python 文件夹遍历和文件查找的实例讲解
2018/04/26 Python
为什么从Python 3.6开始字典有序并效率更高
2019/07/15 Python
模具专业自荐信
2014/05/29 职场文书
租房协议书范例
2014/10/14 职场文书
遗嘱继承权公证书
2015/01/26 职场文书
销售员岗位职责范本
2015/04/11 职场文书
教师创先争优承诺书
2015/04/27 职场文书
2015年政务公开工作总结
2015/05/19 职场文书
护理培训心得体会
2016/01/22 职场文书
《鸡兔同笼》教学反思
2016/02/19 职场文书
浅谈Python实现opencv之图片色素的数值运算和逻辑运算
2021/06/23 Python
Python 类,对象,数据分类,函数参数传递详解
2021/09/25 Python
HTML静态页面获取url参数和UserAgent的实现
2022/08/05 HTML / CSS