之前一直没有用到过urlencode()函数,知道有人问我,为什么urlencode()函数将url地址进行编码处理之后,空格变成了“+”号字符,一致认为这是urlencode()函数规定的,其实不然:
urlencode() 是指针对网页url中的中文字符的一种编码转化方式,最常见的就是Baidu、Google等搜索引擎中输入中文查询时候,生成经过Encode过的网页URL。
urlencode() 的方式一般有两种,一种是传统的基于GB2312的Encode(Baidu、Yisou等使用),另一种是基于UTF-8的Encode(Google、Yahoo等使用)
urldecode() 就是将url编码后的字符串还原成未编码的样子。
<?php
//GB2312的Encode
echo urlencode("中文-_. ")."\n"; //%D6%D0%CE%C4-_.+ (这里将空格变成了 “+”号)
echo urldecode("%D6%D0%CE%C4-_. ")."\n"; //中文-_.
echo rawurlencode("中文-_. ")."\n"; //%D6%D0%CE%C4-_.%20 (这里将空格变成了“%20”字符)
echo rawurldecode("%D6%D0%CE%C4-_. ")."\n"; //中文-_.
?>
urlencode和rawurlencode的区别:urlencode将空格编码为加号“+”,rawurlencode将空格编码为加号“%20”。
如果要使用UTF-8的Encode,有两种方法:
一、将文件存为UTF-8文件,直接使用urlencode、rawurlencode即可。
二、使用mb_convert_encoding函数:
<?php
$url = 'http://s.jb51.net/中文.rar';
echo urlencode(mb_convert_encoding($url, 'utf-8', 'gb2312'))."\n";
echo rawurlencode(mb_convert_encoding($url, 'utf-8', 'gb2312'))."\n";
//http%3A%2F%2Fs.jb51.net%2F%E4%B8%AD%E6%96%87.rar
?>
那么:
http_build_query()就是将一个数组转换成url 问号?后面的参数字符串,并且会自动进行urlencode处理。
http_build_query()函数如何将空格编码为“%20”字符?
解决方案如图:
<?php
$arr = [
"Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/73.0.3683.103 Safari/537.36"
];
echo http_build_query($arr,'','',PHP_QUERY_RFC3986);
echo http_build_query($arr, '', '&');
echo http_build_query($data,'',ini_get('arg_separator.output'),PHP_QUERY_RFC3986);
?>
总结如下:
- 数字、大小写字母都不编码。
- 减号、点号、下划线 三个不编码。
- rawurlencode比urlencode多编码一个加号("+")。