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脚本的10个技巧(1)
Oct 09 PHP
Optimizer与Debugger兼容性问题的解决方法
Dec 01 PHP
PHP设计模式 注册表模式(多个类的注册)
Feb 05 PHP
php中AES加密解密的例子小结
Feb 18 PHP
php中time()与$_SERVER[REQUEST_TIME]用法区别
Nov 19 PHP
Laravel中间件实现原理详解
Oct 09 PHP
PHP不使用递归的无限级分类简单实例
Nov 05 PHP
php readfile下载大文件失败的解决方法
May 22 PHP
PHP分页显示的方法分析【附PHP通用分页类】
May 10 PHP
利用PHP扩展Xhprof分析项目性能实践教程
Sep 05 PHP
php实现微信企业付款到个人零钱功能
Oct 09 PHP
laravel使用redis队列实例讲解
Mar 23 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
将RTF格式的文件转成HTML并在网页中显示的代码
2006/10/09 PHP
探讨如何把session存入数据库
2013/06/07 PHP
PHP静态文件生成类实例
2014/11/29 PHP
帝国cms常用标签汇总
2015/07/06 PHP
JavaScript DOM学习第六章 表单实例
2010/02/19 Javascript
封装的jquery翻页滚动(示例代码)
2013/11/18 Javascript
jQuery获取剪贴板内容的方法
2016/06/16 Javascript
jQuery的层级查找方式分析
2016/06/16 Javascript
AngularJS 指令的交互详解及实例代码
2016/09/14 Javascript
详解bootstrap的modal-remote两种加载方式【强化】
2017/01/27 Javascript
vue技术分享之你可能不知道的7个秘密
2018/04/09 Javascript
vue项目引入字体.ttf的方法
2018/09/28 Javascript
一些手写JavaScript常用的函数汇总
2019/04/16 Javascript
JavaScript实现选项卡效果的分析及步骤
2019/04/16 Javascript
解决Vue watch里调用方法的坑
2020/11/07 Javascript
qpython3 读取安卓lastpass Cookies
2016/06/19 Python
Python匿名函数及应用示例
2019/04/09 Python
python爬虫 爬取58同城上所有城市的租房信息详解
2019/07/30 Python
python3应用windows api对后台程序窗口及桌面截图并保存的方法
2019/08/27 Python
Python数据库小程序源代码
2019/09/15 Python
PyCharm更改字体和界面样式的方法步骤
2019/09/27 Python
python 使用while写猜年龄小游戏过程解析
2019/10/07 Python
python中return的返回和执行实例
2019/12/24 Python
python面向对象之类属性和类方法案例分析
2019/12/30 Python
pytorch sampler对数据进行采样的实现
2019/12/31 Python
Python网络爬虫信息提取mooc代码实例
2020/03/06 Python
基于pytorch中的Sequential用法说明
2020/06/24 Python
Python安装并操作redis实现流程详解
2020/10/13 Python
纯CSS3制作页面切换效果的实例代码
2019/05/30 HTML / CSS
美国汽车零部件和配件网站:CarParts
2019/03/13 全球购物
JD Sports丹麦:英国领先的运动时尚零售商
2020/11/24 全球购物
丑小鸭教学反思
2014/02/03 职场文书
乡镇综治宣传月活动总结
2014/07/02 职场文书
企业法人授权委托书
2014/09/25 职场文书
2015年小学实验室工作总结
2015/07/28 职场文书
纯CSS如何禁止用户复制网页的内容
2021/11/01 HTML / CSS