PHP 与 javascript URL编码后相互交互的问题

  在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);
output:
+ %20

echo var_dump(urldecode('%20'));
echo var_dump(rawurldecode('%20'));
echo var_dump(urldecode('+'));
echo var_dump(rawurldecode('+'));
输出:
string
 ' ' (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的函数来交互。
posted @ 2011-11-14 23:07  站在巨人肩上  阅读(1233)  评论(0编辑  收藏  举报