如果我想用一个变量创建一个URL,我有两个选择来编码字符串。Urlencode()和rawurlencode()。
到底有什么不同,哪个更可取?
如果我想用一个变量创建一个URL,我有两个选择来编码字符串。Urlencode()和rawurlencode()。
到底有什么不同,哪个更可取?
当前回答
选择其中一种而不是另一种的一个实际原因是,如果您将在另一种环境中使用结果,例如JavaScript。
在PHP中urlencode('test 1')返回'test+1',而rawurlencode('test 1')返回'test%201'作为结果。
但如果你需要在JavaScript中使用decodeURI()函数“解码”这个,那么decodeURI(“test+1”)会给你“test+1”,而decodeURI(“test%201”)会给你“test 1”作为结果。
换句话说,在PHP中由urlencode编码到加号("+")的空格(" ")将不会被JavaScript中的decodeURI正确解码。
在这种情况下,应该使用rawurlencode PHP函数。
其他回答
选择其中一种而不是另一种的一个实际原因是,如果您将在另一种环境中使用结果,例如JavaScript。
在PHP中urlencode('test 1')返回'test+1',而rawurlencode('test 1')返回'test%201'作为结果。
但如果你需要在JavaScript中使用decodeURI()函数“解码”这个,那么decodeURI(“test+1”)会给你“test+1”,而decodeURI(“test%201”)会给你“test 1”作为结果。
换句话说,在PHP中由urlencode编码到加号("+")的空格(" ")将不会被JavaScript中的decodeURI正确解码。
在这种情况下,应该使用rawurlencode PHP函数。
简单的 * rawurlencode路径 - path是“?”之前的部分。 -空格必须编码为%20 * 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
urlencode:这与 »RFC 1738编码(见 Rawurlencode())用于历史 原因是,空格被编码为加号 (+)的迹象。
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