如果我想用一个变量创建一个URL,我有两个选择来编码字符串。Urlencode()和rawurlencode()。

到底有什么不同,哪个更可取?


当前回答

简单的 * rawurlencode路径 - path是“?”之前的部分。 -空格必须编码为%20 * 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函数。

区别在于返回值,即:

urlencode ():

返回一个字符串,其中all 非字母数字字符,-_除外。 已替换为百分比(%) 符号后面跟着两个十六进制数字和 空格编码为加号(+)。它 的编码方式与 从WWW表单发布的数据是 编码,这和 应用程序/ x-www-form-urlencoded 媒体类型。这与»不同 RFC 1738编码(参见rawurlencode()) 因为历史原因,空间 编码为加号(+)。

rawurlencode ():

返回一个字符串,其中all 非字母数字字符,-_除外。 已替换为百分比(%) 符号后面跟着两个十六进制数字。这 编码是否在»RFC中描述 保护文字字符 避免被解释为特殊URL 分隔符,以及用于保护url 避免被传播破坏 具有字符转换的媒体(如 一些电子邮件系统)。

两者非常相似,但后者(rawurlencode)将用'%'和两个十六进制数字替换空格,这适用于编码密码等,其中'+'不是例如:

echo '<a href="ftp://user:', rawurlencode('foo @+%/'),
     '@ftp.example.com/x.txt">';
//Outputs <a href="ftp://user:foo%20%40%2B%25%2F@ftp.example.com/x.txt">

我认为空格必须被编码为:

%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 vs. +

在大多数情况下,我看到使用rawurlencode()的最大原因是因为urlencode将文本空格编码为+(加号),而rawurlencode将它们编码为常见的%20:

echo urlencode("red shirt");
// red+shirt

echo rawurlencode("red shirt");
// red%20shirt

我特别见过某些接受编码文本查询的API端点期望看到空格%20,因此,如果使用加号则失败。显然,这在不同的API实现之间是不同的,您的里程可能会有所不同。