/**
* 加密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环节出了问题,可没有办法解决.求高人帮助
* 加密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环节出了问题,可没有办法解决.求高人帮助
你可以先试一下
$a = '你好';
$b = escape($a);
echo $b.'<br>';
$c = unescape($b);
echo $c; //是这里出现乱码吗?print_r(unpack('H*', $c));
帖出结果
是我把$b用js的unescape反解后输出的时候出现乱码.
unescape应该没有问题.
<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>
$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;
alert(unescape('%u4F60%u597D'));
对于 utf-8 页面
alert(unescape('%u6D63%u72B2%u30BD'));这样才能不乱码,而你的 escape 函数得不到 %u6D63%u72B2%u30BD