PHP编码转换函数自动转换字符集以支持数组转换。
自动转换字符集支持数组转换
功能auto_charset(fcontents美元,美元= 'gbk,美元= 'utf-8){
strtoupper美元=(= = 'utf8美元的'utf-8美元);
美元= strtoupper($ = = 'utf8)'utf-8:美元;
如果(strtoupper(美元)= strtoupper(美元)| |空(美元fcontents)(is_scalar($ fcontents)| |!is_string($ fcontents))){
如果相同或非字符串编码不是标量转换。
返回的fcontents;
}
如果(is_string($ fcontents)){
如果(function_exists('mb_convert_encoding ')){
返回mb_convert_encoding(fcontents美元,美元,美元);
} elseif(function_exists('iconv ')){
返回iconv($,$,$ fcontents);
{人}
返回的fcontents;
}
} elseif(is_array($ fcontents)){
foreach(fcontents美元美元美元关键= val){
_key = auto_charset美元(美元关键,美元,美元);
fcontents美元_key } = { $(美元价值,auto_charset美元,美元);
如果(键)!= $ _key)
撤消($ fcontents { $关键});
}
返回的fcontents;
}
{其他
返回的fcontents;
}
}
当我们处于客户端提交的未知数据时,由于客户端编码不统一,但在我们的服务器端只能以编码的方式处理,本例将涉及到一个转换程序接受特定编码问题的字符。
这可能是想直接使用iconv转码,但我们知道iconv函数有两个参数作为输入和输出编码的编码,而现在我们不知道接受字符串的编码是什么,如果这个时候能收到什么好的字符编码。
总的来说,有两个解决这个问题的办法。
方案I
当客户端提交数据时,它指定了编码的提交,这需要一个变量来指定编码。
$字符串_get美元{ 'charset} 'gbk ' = iconv('gbk ','utf-8,_get美元{ 'str ' }):_get美元'str'} {;
在这种情况下,如果没有协议,或者我们不能控制客户,看来这个方案的使用不是很好。
方案二
直接从服务器端检测到接收到的数据编码。
这个方案当然是理想的。现在,你如何检测一个字符的编码在这种情况下,在PHP中,在mb_string延伸mb_check_encoding提供我们需要的功能。
$str = mb_check_encoding($ _get { 'str},'gbk)('gbk iconv,'utf-8,_get美元{ 'str ' }):_get美元'str'} {;
但这需要开放的mb_string的延伸,在某些情况下,我们可能没有打开这个扩展我们的生产服务器。在这种情况下,我们需要使用下面的函数来判断编码。
以下功能不是我自己写的
复制代码代码如下所示:
功能isgb2312($string){
($ i = 0;$ i 127){
如果(($ = 228))($ < = 233)
{
如果(($我+ 2)=(strlen($字符串)- 1))返回true;
V1 =美元ORD($字符串{ $我+ 1 });
V2 =美元ORD($字符串{ $我+ 2 });
如果(($ = 128))($ = 128)($ V2 = 191)
返回false;
其他的
返回true;
}
}
}
返回true;
}
功能isutf8($string){
返回preg_match(% ^(:
{ x09 x0a x0d X20 - x7e ASCII # }
{ XC2 - XDF } { X80 - XBF }非超长字节| #
xe0 { xA0 - XBF } { X80 - XBF }不包括overlongs | #
{ XE1 - XeF XEC夕} { X80 - XBF } { 2 }直| # 3字节
固定{ X9F } { X80 - X80 - XBF }不包括代理人| #
| # xf0 { X90 - XBF } { X80 - XBF } { 2 }面1-3
{ XF1 - xf3 } { X80 - XBF } { 3 }面4-15 | #
| # 幅国土{ X80 - x8f } { X80 - XBF } { 2 }平面16
)* $ % XS,为字符串);
}
在这里,我们可以使上述函数中的任何一个实现代码检测,并将其转换为指定的代码。
$str = isgb2312($ _get { 'str},'gbk)('gbk iconv,'utf-8,_get美元{ 'str ' }):_get美元'str'} {;