如果我想用一个变量创建一个URL,我有两个选择来编码字符串。Urlencode()和rawurlencode()。
到底有什么不同,哪个更可取?
如果我想用一个变量创建一个URL,我有两个选择来编码字符串。Urlencode()和rawurlencode()。
到底有什么不同,哪个更可取?
当前回答
我认为空格必须被编码为:
%20当在URL路径组件中使用 +在URL查询字符串组件或表单数据中使用(参见17.13.4表单内容类型)
下面的例子展示了rawurlencode和urlencode的正确用法:
echo "http://example.com"
. "/category/" . rawurlencode("latest songs")
. "/search?q=" . urlencode("lady gaga");
输出:
http://example.com/category/latest%20songs/search?q=lady+gaga
如果以另一种方式编码路径和查询字符串组件会发生什么?示例如下:
http://example.com/category/latest+songs/search?q=lady%20gaga
web服务器将查找目录latest+songs,而不是最新的歌曲 查询字符串参数q将包含lady gaga
其他回答
echo rawurlencode('http://www.google.com/index.html?id=asd asd');
收益率
http%3A%2F%2Fwww.google.com%2Findex.html%3Fid%3Dasd%20asd
而
echo urlencode('http://www.google.com/index.html?id=asd asd');
收益率
http%3A%2F%2Fwww.google.com%2Findex.html%3Fid%3Dasd+asd
区别是asd%20asd vs asd+asd
urlencode与RFC 1738的区别在于将空格编码为+而不是%20
我认为空格必须被编码为:
%20当在URL路径组件中使用 +在URL查询字符串组件或表单数据中使用(参见17.13.4表单内容类型)
下面的例子展示了rawurlencode和urlencode的正确用法:
echo "http://example.com"
. "/category/" . rawurlencode("latest songs")
. "/search?q=" . urlencode("lady gaga");
输出:
http://example.com/category/latest%20songs/search?q=lady+gaga
如果以另一种方式编码路径和查询字符串组件会发生什么?示例如下:
http://example.com/category/latest+songs/search?q=lady%20gaga
web服务器将查找目录latest+songs,而不是最新的歌曲 查询字符串参数q将包含lady gaga
我相信urlencode用于查询参数,而rawurlencode用于路径段。这主要是因为路径段使用%20,而查询参数使用+。看看这个关于空格的答案:什么时候将空格编码为加号(+)或%20?
然而,%20现在也适用于查询参数,这就是rawurlencode总是更安全的原因。然而,加号往往用于用户编辑经验和查询参数的可读性很重要的地方。
注意,这意味着rawurldecode不会将+解码为空格(http://au2.php.net/manual/en/function.rawurldecode.php)。这就是为什么$_GET总是自动通过urldecode传递,这意味着+和%20都被解码为空格。
如果您希望输入和输出之间的编码和解码保持一致,并且您已经选择对查询参数始终使用+而不是%20,那么urlencode适用于查询参数(键和值)。
结论是:
路径段-总是使用rawurlencode/rawurldecode
查询参数-解码时总是使用urldecode(自动完成),编码时,rawurlencode或urlencode都可以,只是选择一个一致,特别是在比较url时。
urlencode:这与 »RFC 1738编码(见 Rawurlencode())用于历史 原因是,空格被编码为加号 (+)的迹象。
空格编码为%20 vs. +
在大多数情况下,我看到使用rawurlencode()的最大原因是因为urlencode将文本空格编码为+(加号),而rawurlencode将它们编码为常见的%20:
echo urlencode("red shirt");
// red+shirt
echo rawurlencode("red shirt");
// red%20shirt
我特别见过某些接受编码文本查询的API端点期望看到空格%20,因此,如果使用加号则失败。显然,这在不同的API实现之间是不同的,您的里程可能会有所不同。