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 相关文章推荐
支持数组的ADDSLASHES的php函数
Feb 16 PHP
php ajax 静态分页过程形式
Sep 02 PHP
php提示Call-time pass-by-reference has been deprecated in的解决方法[已测]
May 06 PHP
PHP中extract()函数的妙用分析
Jul 11 PHP
基于AppServ,XAMPP,WAMP配置php.ini去掉警告信息(NOTICE)的方法详解
May 07 PHP
基于linnux+phantomjs实现生成图片格式的网页快照
Apr 15 PHP
举例详解PHP脚本的测试方法
Aug 05 PHP
PHP随机数 C扩展随机数
May 04 PHP
php+MySQL实现登录时验证登录名和密码是否正确
May 10 PHP
php实现文件管理与基础功能操作
Mar 21 PHP
laravel + vue实现的数据统计绘图(今天、7天、30天数据)
Jul 31 PHP
TP5(thinkPHP5)框架使用ajax实现与后台数据交互的方法小结
Feb 10 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
PhpMyAdmin中无法导入sql文件的解决办法
2010/01/08 PHP
php数组的概述及分类与声明代码演示
2013/02/26 PHP
php使用pclzip类实现文件压缩的方法(附pclzip类下载地址)
2016/04/30 PHP
php生成Android客户端扫描可登录的二维码
2016/05/13 PHP
php-msf源码详解
2017/12/25 PHP
PHP验证类的封装与使用方法详解
2019/01/10 PHP
PHP数组对象与Json转换操作实例分析
2019/10/22 PHP
对google个性主页的拖拽效果的js的完整注释[转]
2007/04/10 Javascript
JQuery Dialog的内存泄露问题解决方法
2010/06/18 Javascript
JS防止用户多次提交的简单代码
2013/08/01 Javascript
批量修改标签css样式以input标签为例
2014/07/31 Javascript
json与jsonp知识小结(推荐)
2016/08/16 Javascript
微信小程序 HTTPS报错整理常见问题及解决方案
2016/12/14 Javascript
javascript函数的四种调用模式
2017/01/08 Javascript
vue.js分页中单击页码更换页面内容的方法(配合spring springmvc)
2018/02/10 Javascript
vue实现修改图片后实时更新
2019/11/14 Javascript
Javascript实现html转pdf高清版(提高分辨率)
2020/02/19 Javascript
详解React 条件渲染
2020/07/08 Javascript
Vant 在vue-cli 4.x中按需加载操作
2020/11/05 Javascript
[00:27]DOTA2荣耀之路2:Patience from zhou!
2018/05/24 DOTA
python在windows下实现备份程序实例
2014/07/04 Python
python爬虫 模拟登录人人网过程解析
2019/07/31 Python
Python 一键获取百度网盘提取码的方法
2019/08/01 Python
Python多线程及其基本使用方法实例分析
2019/10/29 Python
解决Tensorflow占用GPU显存问题
2020/02/03 Python
python 异步async库的使用说明
2020/05/04 Python
浅谈CSS3中display属性的Flex布局的方法
2017/08/14 HTML / CSS
GAP欧盟网上商店:GAP EU
2016/09/13 全球购物
西班牙语在线票务市场:SuperBoletería
2019/06/10 全球购物
意大利在线药房:Saninforma
2021/02/11 全球购物
班主任寄语大全
2014/04/04 职场文书
大学学习计划书范文
2014/05/02 职场文书
钓鱼岛事件感想
2015/08/11 职场文书
超详细教你怎么升级Mysql的版本
2021/05/19 MySQL
使用react+redux实现计数器功能及遇到问题
2021/06/02 Javascript
一文搞清楚MySQL count(*)、count(1)、count(col)区别
2022/03/03 MySQL