为什么我们不编码=和&在查询字符串?我正在引用RFC 3986,但无法找到我们不应该编码这些字符的位置。使用Guzzle,它们似乎并没有真正编码。
以query string: key1='1'&key2='2'
为例,不应将其编码为key1%3D%271%27%26key2%3D%272%27
吗?如果我将key1='1'&key2='2'
作为查询字符串插入Chrome(例如www.google.com?key1='1'&key2='2'
),则会显示为key1=%271%27&key2=%272%27
,与guzzle不匹配。 Guzzle输出key1='1'&key2='2'
。 Guzzle的编码算法如下:
private static $charUnreserved = 'a-zA-Z0-9_\-\.~';
private static $charSubDelims = '!\$&\'\(\)\*\+,;=';
public function encode()
{
return preg_replace_callback(
'/(?:[^' . self::$charUnreserved . self::$charSubDelims . '%:@\/\?]++|%(?![A-Fa-f0-9]{2}))/',
function ($match) {
return urlencode($match[0]);
},
$str
);
}
答案 0 :(得分:1)
=
和&
没有任何特殊含义作为网址语法的一部分。就URL语法而言,它们只是普通的字符。
但是,在查询字符串中使用时,大多数应用程序框架都实现了一种约定,用它来分隔参数和值。如果要在参数名称或值中使用这些字符,则需要对它们进行编码。见escaping ampersand in url