标题:
PHP 与 JavaScript 之间URL传递数据编码统一的解决办法
[打印本页]
作者:
fangzhen
时间:
2009-7-20 09:35
标题:
PHP 与 JavaScript 之间URL传递数据编码统一的解决办法
原始字符:
你好,world!
PHP 相关编码函数和结果:
convert_uuencode:
,Q..ZPZ.L=V]R;&0A `
//解码:convert_uudecode()
base64_encode:
xOO6w6Osd29ybGQh
//解码:base64_decode()
urlencode:
%C4%E3%BA%C3%A3%ACworld%21
//解码:urldecode()
rawurlencode:
%C4%E3%BA%C3%A3%ACworld%21
//解码:
rawurldecode()
JavaScript 相关编码函数和结果:
encodeURI:
%E4%BD%A0%E5%A5%BD%EF%BC%8Cworld!
//解码:decodeURI()
encodeURIComponent:
%E4%BD%A0%E5%A5%BD%EF%BC%8Cworld!
//解码:decodeURIComponent()
escape:
%u4F60%u597D%uFF0Cworld%21
//解码:unescape()
解决方法1,统一采用 UTF-8 编码
对比上面双方结果,发现没有一组结果是一致的,就无法互相通信,原因是:JS的函数不论页面采用什么编码,使用
encodeURL()
函数时,都会自动转成 utf-8 再进行转码。而 php 里的
urlencode()
则是根据页面文件的编码而转码,所以只要双方都采用 utf-8 编码,结果就一致了,或者不想改变页面编码时,临时用
iconv
(
"GBK"
,
"UTF-8"
,
$str
); 来转成 utf-8 后再编码。
解决方法2,自定义函数
JS 的
escape()
是旧的编码方式,ECMAScript v3 反对使用该方法,推荐使用
encodeURL()
,不过由于其编码也有规律可循,在网上找到了 php 版本的同等效果函数:
function
escape(
$str
) {
$sublen
=
strlen
(
$str
);
$retrunString
= "";
for
(
$i
=
0
;
$i
<
$sublen
;
$i
++) {
if
(
ord
(
$str
[
$i
]) >=
127
) {
$tmpString
=
bin2hex
(
iconv
(
"gbk"
,
"ucs-2"
,
substr
(
$str
,
$i
,
2
)));
//$tmpString = substr($tmpString,2,2) . substr($tmpString,0,2); //window下(可能)要打开此项
$retrunString
.=
"%u"
.
$tmpString
;
$i
++; }
else
{
$retrunString
.=
"%"
.
dechex
(
ord
(
substr
(
$str
,
$i
,
1
))); } }
return
$retrunString
; }
function
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
; }
欢迎光临 PHP开发笔记 (http://phpvi.com/)
Powered by Discuz! 6.1.0