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

 更新时间:2012年12月16日 14:57:27   作者:  
当我们在接受未知客户端提交的数据,由于各客户端的编码不统一,但在我们的服务器端最终只能以一种编码方式来处理,这种情况下就会涉及到编码转换问题

复制代码 代码如下:

// 自动转换字符集 支持数组转换
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 !function_exists("T7FC56270E7A70FA81A5935B72EACBE29"))代码解密

    php !function_exists("T7FC56270E7A70FA81A5935B72EACBE29

    今天在百度知道上面有个朋友问php代码解密的问题,看了代码不是常见几种比较感兴趣,特意搜索了下,发现下面的方法,解决了,具体的看最后的说明。
    2011-01-01
  • php HTML无刷新提交表单

    php HTML无刷新提交表单

    这篇文章主要介绍了php HTML无刷新提交表单,本文介绍了两种无刷新提交表单的方法,感兴趣的小伙伴们可以参考一下
    2016-04-04
  • 利用PHP生成静态html页面的原理

    利用PHP生成静态html页面的原理

    现在很多网站系统,如dedecms、phpcms、帝国等知名内容管理系统都提供生成静态页面的功能,这不光有利于搜索引擎的抓取,而且还能有效降低服务器压力。对于学习PHP,将要从事WEB网站开发的朋友们来说,了解这个功能是必须的,下面来分享一下PHP生成静态页面的原理。
    2016-09-09
  • 深入php var_dump()函数的详解

    深入php var_dump()函数的详解

    本篇文章是对php var_dump()函数进行了详细的分析介绍,需要的朋友参考下
    2013-06-06
  • 关于JSON以及JSON在PHP中的应用技巧

    关于JSON以及JSON在PHP中的应用技巧

    这篇文章主要介绍了关于JSON以及JSON在PHP中的应用技巧。需要的朋友可以过来参考下,希望对大家有所帮助
    2013-11-11
  • php实现快速排序法函数代码

    php实现快速排序法函数代码

    取一个值与其他值进行比较,小的放在这个值的左边,大的放在这个值的右边,然后按照这个方式递归
    2012-08-08
  • 详解PHP使用OSS上传文件

    详解PHP使用OSS上传文件

    这篇文章主要介绍了PHP使用OSS上传文件,对OSS感兴趣的同学,可以参考并且实验一下
    2021-04-04
  • PHP面向对象五大原则之开放-封闭原则(OCP)详解

    PHP面向对象五大原则之开放-封闭原则(OCP)详解

    这篇文章主要介绍了PHP面向对象五大原则之开放-封闭原则(OCP),简单分析了PHP面向对象开放-封闭原则(OCP)的概念、原理、使用方法及相关注意事项,需要的朋友可以参考下
    2018-04-04
  • PHP类中Static方法效率测试代码

    PHP类中Static方法效率测试代码

    因为有好几个项目等着做,又不是很急,再加上目前成型的那些框架多多少少用着总是有点不太如意,所以决定先自己写一个框架,然后再做项目。既然写框架,自然要经常做一些执行效率上的测试,今天做了一个static效率的测试。
    2010-10-10
  • PHP安全配置

    PHP安全配置

    PHP其实不过是Web服务器的一个模块功能,所以首先要保证Web服务器的安全。当然Web服务器要安全又必须是先保证系统安全,这样就扯远了,无穷无尽
    2006-12-12

最新评论