/**
 * 加密escape
 *
 * <br>修改历史:
 * <br>修改日期    修改者     工单号+工单名称
 * <br>
 * @param string $str 要加密的字符串
 * @return string
 */
if(!function_exists('escape')) {
function escape($str) {
preg_match_all("/[\xc2-\xdf][\x80-\xbf]+|[\xe0-\xef][\x80-\xbf]{2}|[\xf0-\xff][\x80-\xbf]{3}|[\x01-\x7f]+/e",$str,$r);
//匹配utf-8字符,
$str = $r[0];
$l = count($str);
for($i=0; $i<$l; $i++){
$value = ord($str[$i][0]);
if($value < 223){
$str[$i] = rawurlencode(utf8_decode($str[$i]));
//先将utf8编码转换为ISO-8859-1编码的单字节字符,urlencode单字节字符.
//utf8_decode()的作用相当于iconv("UTF-8","CP1252",$v)。
}else{
$str[$i] = "%u".strtoupper(bin2hex(iconv("UTF-8","UCS-2",$str[$i])));
}
}
return join("",$str);
}

}/**
 * 解密escape
 *
 * <br>修改历史:
 * <br>修改日期    修改者     工单号+工单名称
 * <br>
 * @param string $str 要解密的字符串
 * @return string
 */
if(!function_exists('unescape')) {
function unescape($source) {
$decodedStr = "";
$pos = 0;
$len = strlen ( $source );
while ( $pos < $len ) {
$charAt = substr ( $source, $pos, 1 );
if ($charAt == '%') {
$pos ++;
$charAt = substr ( $source, $pos, 1 );
if ($charAt == 'u') {
// we got a unicode character
$pos ++;
$unicodeHexVal = substr ( $source, $pos, 4 );
$unicode = hexdec ( $unicodeHexVal );
$entity = "&#" . $unicode . ';';
$decodedStr .= decode_ascii(utf8_encode ( $entity ));
$pos += 4;

} else {
// we have an escaped ascii character
$hexVal = substr ( $source, $pos, 2 );
$decodedStr .= chr ( hexdec ( $hexVal ) );
$pos += 2;
}
} else {
$decodedStr .= $charAt;
$pos ++;
}
}
return $decodedStr;
}
}/**
 * 解密
 *
 * <br>修改历史:
 * <br>修改日期    修改者     工单号+工单名称
 * <br>
 * @param string $str 要解密的字符串
 * @return string
 */
if(!function_exists('decode_ascii')) {
function decode_ascii($str) {
preg_match_all ( "/(\d{2,5})/", $str, $a );
$a = $a [0];
foreach ( $a as $dec ) {
if ($dec < 128) {
$utf .= chr ( $dec );
} else if ($dec < 2048) {
$utf .= chr ( 192 + (($dec - ($dec % 64)) / 64) );
$utf .= chr ( 128 + ($dec % 64) );
} else {
$utf .= chr ( 224 + (($dec - ($dec % 4096)) / 4096) );
$utf .= chr ( 128 + ((($dec % 4096) - ($dec % 64)) / 64) );
$utf .= chr ( 128 + ($dec % 64) );
}
}
return $utf;
}
}
$a = '你好';
$b = escape($a);
echo $b.'<br>';
$c = unescape($b);
echo $c;
上面这段代码,在我本地win+apache上执行没有任何问题,可放在服务器上,lnmp环境,就会出现乱码,最终发现是escape环节出了问题,可没有办法解决.求高人帮助

解决方案 »

  1.   

    是不是 iconv("UTF-8","UCS-2",$str[$i]) 这里出了问题?
    你可以先试一下
      

  2.   

    因为是只在特定的环境中出问题,所以你应说明出问题时的现象
    $a = '你好';
    $b = escape($a);
    echo $b.'<br>';
    $c = unescape($b);
    echo $c; //是这里出现乱码吗?print_r(unpack('H*', $c));
    帖出结果
      

  3.   

    哦,版主不好意思.我没说太清楚.
    是我把$b用js的unescape反解后输出的时候出现乱码.
    unescape应该没有问题.
      

  4.   

    就是将$b复制下来,填充到这里<html xmlns="http://www.w3.org/1999/xhtml" >
    <head>
    <meta http-equiv="Content-Type" content="text/html; charset=UTF-8" />
    <meta equiv="X-UA-Compatible" content="IE=EmulateIE7" /> 
    <title>php</title>
    <script type="text/javascript">
    alert(unescape('$b的输出值'));
    </script>
    </head>
    <body></body>
    </html>
      

  5.   

    不对吧?你的代码在本地可以用么?
    $a = iconv('gbk', 'utf-8', '你好');
    $a1 = '你好';echo <<< HTML
    <script>
    document.write( escape('$a1')+'<br />' );//gbk %u4F60%u597D
    document.write( escape('$a') );//utf-8 %u6D63%u72B2%u30BD
    </script>
    HTML;
      

  6.   

    对于 gbk 页面
    alert(unescape('%u4F60%u597D'));
    对于 utf-8 页面
    alert(unescape('%u6D63%u72B2%u30BD'));这样才能不乱码,而你的 escape 函数得不到 %u6D63%u72B2%u30BD
      

  7.   

    哦. js的unescape也要分gbk和utf-8啊.版主给我个能得到的吧,我用了你博客里那个,也没有解决问题