php对js传递来的escape中文编码进行读取

/ 0评 / 0

原地址:www.laohucheng.com/blog/post/279/

据说js escape后的编码默认是utf-8 【所以如果你的页面是gb2312的,解码成功后记得iconv进行编码转换,不然中文还是乱码】。有些人可能会说了,那我直接不编码就传到目标页总可以 吧。如果是js拼凑地址后进行的访问,我测试了还是不行的,如果是表单提交或许可以,我没试。这里在页面编码保持一致的情况下,我们只能利用php写一个 功能恰似js中unescape的方法来进行处理了,方法如下:

//处理JS escape 过来的中文
function js_unescape($str)
{
$ret = '';
$len = strlen($str); for ($i = 0; $i < $len; $i++)
{
if ($str[$i] == '%' && $str[$i+1] == 'u')
{
$val = hexdec(substr($str, $i+2, 4));     if ($val < 0x7f) $ret .= chr($val);
else if($val < 0x800) $ret .= chr(0xc0|($val>>6)).chr(0x80|($val&0x3f));
else $ret .= chr(0xe0|($val>>12)).chr(0x80|(($val>>6)&0x3f)).chr(0x80|($val&0x3f));     $i += 5;
}
else if ($str[$i] == '%')
{
$ret .= urldecode(substr($str, $i, 3));
$i += 2;
}
else $ret .= $str[$i];
}
return $ret;
}
// 这个函数就处理了js escape过来的中文编码,但是如果你是utf-8编码的,那么还是乱码,需要再进行下一步操作 $str=iconv('utf-8','gb2312',$str)到这里才正真处理完成。现在你就可以试下了,效果绝对OK ,顺便提一下的几个方法,依次为中英文混合截字符串,判断是否中文,php模拟js escape方法。

// start 开始位置,从0开始
// long = 0 则从start 一直取到字符串尾
// ltor = true 时从左到右取字符,false 时到右到左取字符
// $cn_len 中文字符按字节取还是字数取,如果按字数取,则一个中文当一个字节计算

function csubstr(&$str, $start=0, $long=0, $ltor=true, $cn_len=2) {
if($long == 0) $long = strlen($str);
if($ltor == false) $str = cstrrev($str);
if($cn_len == 1) {
for($i=0, $fs=0; $i<$start; $fs++)
$i += (ord($str[$fs]) <= 0xa0) ? 1 : 0.5;
for($i=0, $fe=$fs; $i<$long; $fe++)
$i += (ord($str[$fe]) <= 0xa0) ? 1 : 0.5;
$long = $fe - $fs;
}
else {
$fs = (is_chinese($str, $start) == 1) ? $start - 1 : $start;
$fe = $long + $start - 1;
$end = ( is_chinese($str, $fe) == -1 ) ? $fe -1 : $fe;
$long = $end - $fs + 1;
}
$f_str = substr($str, $fs, $long);
if($ltor == false) $f_str = cstrrev($f_str);
return $f_str;
}

function is_chinese(&$str, $location) {
$ch = true;
$i = $location;
while(ord($str[$i])>0xa0 && $i >= 0) {
$ch = !$ch;
$i --;
}
if($i != $location) {
$f_str = $ch ? 1: -1;
}
else {
$f_str = false;
}
return $f_str;
}

//php模拟js的escape
function phpescape($str)
{
$sublen=strlen($str);
$retrunString="";
for ($i=0;$i<$sublen;$i++)
{
if(ord($str[$i])>=127)
{
$tmpString=bin2hex(iconv("gb2312","ucs-2",substr($str,$i,2)));
//$tmpString=substr($tmpString,2,2).substr($tmpString,0,2);window下可能要打开此项
$retrunString.="%u".$tmpString;
$i++;
} else {
$retrunString.="%".dechex(ord($str[$i]));
}
}
return $retrunString;
}

发表评论

您的电子邮箱地址不会被公开。

*