PHP URL函数 于 URL编码问题疑惑

PHP对URL的处理函数列表:

base64_decode — 对使用 MIME base64 编码的数据进行解码
base64_encode — 使用 MIME base64 对数据进行编码
get_headers — 取得服务器响应一个 HTTP 请求所发送的所有标头
get_meta_tags — 从一个文件中提取所有的 meta 标签 content 属性,返回一个数组
http_build_query — 生成 URL-encode 之后的请求字符串
parse_url — 解析 URL,返回其组成部分
rawurldecode — 对已编码的 URL 字符串进行解码
rawurlencode — 按照 RFC 1738 对 URL 进行编码
urldecode — 解码已编码的 URL 字符串
urlencode — 编码 URL 字符串

1 base64_decode 和 base64_encode这对函数实现base64算法。

2 get_headers()方法就是获取HTTP响应的头信息,例子:

1
2
3
4
5
6
7
8
9
10
11
12
13
14

print_r(get_headers("http://blog.ifeeline.com"));

//输出
Array
(
[0] => HTTP/1.1 200 OK
[1] => Server: nginx
[2] => Date: Sun, 30 Jun 2013 15:26:47 GMT
[3] => Content-Type: text/html; charset=UTF-8
[4] => Connection: close
[5] => Vary: Accept-Encoding
[6] => X-Pingback: http://blog.ifeeline.com/xmlrpc.php
)

2 get_meta_tags()函数提取meta标签的content 属性值。

3 http_bulid_query()函数生成 URL-encode 之后的请求字符串,具体可参考http://www.php.net/manual/zh/function.http-build-query.php
string http_build_query ( mixed $query_data [, string $numeric_prefix [, string $arg_separator [, int $enc_type = PHP_QUERY_RFC1738 ]]] )
这个函数需要注意,$query_data可以是数组或对象,$numeric_prefix作为变量前缀,它主要为了辅助生成合法的下标,$arg_separator就是查询字符串中分隔符,没有指定就是配置文件中的arg_separator.output,$enc_type表示编码类型,默认是PHP_QUERY_RFC1738,它跟表单提交数组时使用的编码一致(空格变成加号,如果是PHP_QUERY_RFC3986,空格会被编码成%20),这个是PHP5.4加入的。
例子:

1
2
3
4
5
6
7
8
9
10
11
12
13

$data = array('foo'=>'bar',
'baz'=>'boom',
'cow'=>'milk',
'php'=>'hypertext processor');

echo http_build_query($data) . "\n";
echo http_build_query($data, '', '&');
echo http_build_query($data, '', '&','PHP_QUERY_RFC3986');//PHP5.4可用
//输出
foo=bar&baz=boom&cow=milk&php=hypertext+processor
foo=bar&baz=boom&cow=milk&php=hypertext+processor
注意空格变成了+号。

4 parse_url()解析 URL,返回关联数组

5 rawurlencode() rawurlencode()和urldecode() urlencode()
这两对函数基本一致,只是在对待空格问题上有差别,rawurlencode()把空格变成加号(%20),urldecode()把空格变成加号。需要注意的是,urldecode()把空格变成加号与 WWW 表单 POST 数据的编码方式是一样的,同时与 application/x-www-form-urlencoded 的媒体类型编码方式一样。

注释:
实际上,PHP5.3之前,rawurlencode和urldecode都采用RFC 1738标准来编码,只是urlencode在对待空格问题上把它换成加号以兼容POST表单的数据编码,PHP5.3以后,rawurlencode完全遵循RFC 3986编码方案,空格还是变成%20(raw表示未加工的)。注意到http_bulid_query()在生成查询字符串时,还是跟urlencode函数一致将空格换成了+号,就没有什么奇怪的了,因为它需要兼容POST表单的编码方式。

当以POST方式提交表单时,HTTP头的Content-type默认是application/x-www-form-urlencoded,表示表单的数据时经过urlencode的,这样Web服务器在获取到数据后就知道需要先urldecode了,如果采用HTML表单提交数据到服务器,这个过程是自动完成的,如果是采用sock或curl方式POST数据,那么这些数据就需要自己进行urlencode,否则如果传输的数据带有加号(没有转换),Web服务器收到后把加号变成空格,显然,这个不是你期望的结果。

另外,在jQuery中的ajax函数,使用data传递参数时,默认也是采用了urlencode的,兼容HTML表单的POST提交。

坚持原创技术分享,您的支持将鼓励我继续创作!