在PHP中URL编码函数基本有两个:
urlencode():返回字符串,此字符串中除了 -_. 之外的所有非字母数字字符都将被替换成百分号(%)后跟两位十六进制数,空格则编码为加号(+)。此编码与 WWW 表单 POST 数据的编码方式是一样的,同时与 application/x-www-form-urlencoded 的媒体类型编码方式一样。
rawurlencode():返回字符串,此字符串中除了 -_. 之外的所有非字母数字字符都将被替换成百分号(%)后跟两位十六进制数。这是在 RFC 1738 中描述的编码,是为了保护原义字符以免其被解释为特殊的 URL 定界符,同时保护 URL 格式以免其被传输媒体(像一些邮件系统)使用字符转换时弄乱。
基本上两个函数的用法相似(没有进一步阅读源码比较),只是处理空格的方式不同:
<?php echo '<pre>'; $a = ' '; echo urlencode($a)."\n".rawurlencode($a);string
output:
+ %20
echo var_dump(urldecode('%20'));
echo var_dump(rawurldecode('%20'));
echo var_dump(urldecode('+'));
echo var_dump(rawurldecode('+'));
输出:
' ' (length=1)
string
' ' (length=1)
string
' ' (length=1)
string
'+' (length=1)
但是奇怪的是,urldecode可以将"%20" 解码为空格,rawurldecode 对+ 的解码却没有什么效果。基本上可以认为只有出现%20 就是rawurlencode 编码。
base64_encode() returns 使用 base64 对 data 进行编码。设计此种编码是为了使二进制数据可以通过非纯 8-bit 的传输层传输,例如电子邮件的主体。 数据要比原始数据多占用 33% 左右的空间。
$str = 'This is an encoded string';
echo base64_encode($str);
VGhpcyBpcyBhbiBlbmNvZGVkIHN0cmluZw==
铭记看到这样格式的编码,脑中蹦出的是base64.
测试:
$a = 'testid=qa&user=zoro';
echo urlencode($a)."\n".rawurlencode($a)."\n".base64_encode($a);
testid%3Dqa%26user%3Dzoro
testid%3Dqa%26user%3Dzoro
dGVzdGlkPXFhJnVzZXI9em9ybw==
在javascript 中,常用的url编码函数有:
>>> console.log(escape('testid=qa&user=zoro'))
testid%3Dqa%26user%3Dzoro
>>> console.log(encodeURIComponent('testid=qa&user=zoro'))
testid%3Dqa%26user%3Dzoro
>>> console.log(encodeURI('testid=qa&user=zoro'))
testid=qa&user=zoro
测试可以看出,用ANSI编码的都可以直接相互转换使用。
接着:
$a = 'testid=测试&user=索罗';
echo urlencode($a)."\n".rawurlencode($a)."\n".base64_encode($a);
testid%3D%B2%E2%CA%D4%26user%3D%CB%F7%C2%DE
testid%3D%B2%E2%CA%D4%26user%3D%CB%F7%C2%DE
dGVzdGlkPbLiytQmdXNlcj3L98Le
javascript:
>>> console.log(escape('testid=测试&user=索罗'))
testid%3D%u6D4B%u8BD5%26user%3D%u7D22%u7F57
>>> console.log(encodeURIComponent('testid=测试&user=索罗'))
testid%3D%E6%B5%8B%E8%AF%95%26user%3D%E7%B4%A2%E7%BD%97
>>> console.log(encodeURI('testid=测试&user=索罗'))
testid=%E6%B5%8B%E8%AF%95&user=%E7%B4%A2%E7%BD%97
换成GBK编码,没有一组PHP和javascript之间交互。因为,JS的函数不论页面采用什么编码,都会自动转成 utf-8 再进行转码。
解决办法,统一转码为UTF-8
将PHP代码转换为UTF-8之后:
testid%3D%E6%B5%8B%E8%AF%95%26user%3D%E7%B4%A2%E7%BD%97 testid%3D%E6%B5%8B%E8%AF%95%26user%3D%E7%B4%A2%E7%BD%97 dGVzdGlkPea1i+ivlSZ1c2VyPee0oue9lw==
这样一来就可以用encodeURIComponent和PHP的函数来交互。