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 相关文章推荐
从零开始学YII2框架(三)扩展插件yii2-gird
Aug 20 PHP
php实现的IMEI限制的短信验证码发送类
May 05 PHP
PHP使用PHPexcel导入导出数据的方法
Nov 14 PHP
php自动加载方式集合
Apr 04 PHP
制作个性化的WordPress登陆界面的实例教程
May 21 PHP
PHP简单判断iPhone、iPad、Android及PC设备的方法
Oct 11 PHP
PHP使用curl制作简易百度搜索
Nov 03 PHP
php基于dom实现读取图书xml格式数据的方法
Feb 03 PHP
PHP实现QQ、微信和支付宝三合一收款码实例代码
Feb 19 PHP
php实现往pdf中加数字签名操作示例【附源码下载】
Aug 07 PHP
PHP+Ajax简单get验证操作示例
Mar 02 PHP
php实现多站点共用session实现单点登录的方法详解
Sep 18 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
晶体管来复再生式二管收音机
2021/03/02 无线电
JS中encodeURIComponent函数用php解码的代码
2012/03/01 PHP
php中通过eval实现字符串格式的计算公式
2017/03/18 PHP
php post json参数的传递和接收处理方法
2018/05/31 PHP
ThinkPHP3.2框架自定义配置和加载用法示例
2018/06/14 PHP
Windows上php5.6操作mongodb数据库示例【配置、连接、获取实例】
2019/02/13 PHP
070823更新的一个[消息提示框]组件 兼容ie7
2007/08/29 Javascript
js 为label标签和div标签赋值的方法
2013/08/08 Javascript
node.js中的fs.futimes方法使用说明
2014/12/17 Javascript
JS+CSS实现的竖向简洁折叠菜单效果代码
2015/10/22 Javascript
JavaScript基于原型链的继承
2016/06/22 Javascript
多种方式实现js图片预览
2016/12/12 Javascript
JS实现微信弹出搜索框 多条件查询功能
2016/12/13 Javascript
将input框中输入内容显示在相应的div中【三种方法可选】
2017/05/08 Javascript
使用Fullpage插件快速开发整屏翻页的页面
2017/09/13 Javascript
Jquery+AJAX实现无刷新上传并重命名文件操作示例【PHP后台接收】
2020/05/29 jQuery
浅谈javascript事件环微任务和宏任务队列原理
2020/09/12 Javascript
[47:03]完美世界DOTA2联赛PWL S3 Galaxy Racer vs Phoenix 第二场 12.10
2020/12/13 DOTA
python实现下载文件的三种方法
2017/02/09 Python
Python使用defaultdict读取文件各列的方法
2017/05/11 Python
浅谈numpy中linspace的用法 (等差数列创建函数)
2017/06/07 Python
对Python random模块打乱数组顺序的实例讲解
2018/11/08 Python
python对矩阵进行转置的2种处理方法
2019/07/17 Python
如何用OpenCV -python3实现视频物体追踪
2019/12/04 Python
Pycharm的Available Packages为空的解决方法
2020/09/18 Python
input元素的url类型和email类型简介
2012/07/11 HTML / CSS
HTML5使用drawImage()方法绘制图像
2014/06/23 HTML / CSS
Brasty波兰:香水、化妆品、手表网上商店
2019/04/15 全球购物
Microsoft Advertising美国:微软搜索广告
2019/05/01 全球购物
小学语文国培感言
2014/03/04 职场文书
酒店辞职信怎么写
2015/02/27 职场文书
推荐信范文大全
2015/03/27 职场文书
淘宝文案策划岗位职责
2015/04/14 职场文书
2015年基层党支部工作总结
2015/05/21 职场文书
安全生产感想
2015/08/07 职场文书
2019学生会干事辞职信
2019/06/27 职场文书