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

2015-01-24信息快讯网

当我们在接受未知客户端提交的数据,由于各客户端的编码不统一,但在我们的服务器端最终只能以一种编码方式来处理,这种情况下就会涉及到编码转换问题

 
// 自动转换字符集 支持数组转换 
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字符串截取的简单方法
将IP地址转换为整型数字的PHP方法、Asp方法和MsSQL方法、MySQL方法
浅析php过滤html字符串,防止SQL注入的方法
浅析PHP中的字符串编码转换(自动识别原编码)
PHP文件去掉PHP注释空格的函数分析(PHP代码压缩)
计算php页面运行时间的函数介绍
关于php 接口问题(php接口主要也就是运用curl,curl函数)
浅析PHP中的UNICODE 编码与解码
php小经验:解析preg_match与preg_match_all 函数
关于url地址传参数时字符串有回车造成页面脚本赋值失败的解决方法
基于php常用函数总结(数组,字符串,时间,文件操作)
深入解析phpCB批量转换的代码示例
基于php导出到Excel或CSV的详解(附utf8、gbk 编码转换)
解析关于java,php以及html的所有文件编码与乱码的处理方法汇总
解析php获取字符串的编码格式的方法(函数)
解析PHP将对象转换成数组的方法(兼容多维数组类型)
ajax php传递和接收变量实现思路及代码
PHP获取http请求的头信息实现步骤
PHP 的异常处理、错误的抛出及回调函数等面向对象的错误处理方法
php自动给文章加关键词链接的函数代码
php中的注释、变量、数组、常量、函数应用介绍
thinkphp3.0 模板中函数的使用
PHP正确解析UTF-8字符串技巧应用
PHP编码转换
php eval函数用法 PHP中eval()函数小技巧
真正根据utf8编码的规律来进行截取字符串的函数(utf8版sub_str )
PHP explode()函数用法、切分字符串
PHP中空字符串介绍0、null、empty和false之间的关系
查找mysql字段中固定字符串并替换的几个方法
php中将汉字转换成拼音的函数代码
php日期转时间戳,指定日期转换成时间戳
PHP+Mysql日期时间如何转换(UNIX时间戳和格式化日期)
PHP 将逗号、空格、回车分隔的字符串转换为数组的函数
php和mysql中uft-8中文编码乱码的几种解决办法
php urlencode()与urldecode()函数字符编码原理详解
PHP学习散记_编码(json_encode 中文不显示)
©2014-2024 dbsqp.com