为什么在构建查询字符串时http_build_query
函数,它对方括号进行urlencode[]
外部价值观以及如何摆脱它?
$query = array("var" => array("foo" => "value", "bar" => "encodedBracket["));
$queryString = http_build_query($query, "", "&");
var_dump($queryString);
var_dump("urldecoded: " . urldecode($queryString));
outputs:
var%5Bfoo%5D=value&var%5Bbar%5D=encodedBracket%5B
urldecoded: var[foo]=value&var[bar]=encodedBracket[
该函数正确地编码了[
in encodedBracket[
在输出的第一行,但是在中编码方括号的原因是什么var[foo]=
and var[bar]=
?正如您所看到的,对字符串进行 url 编码还对值中的保留字符进行了解码,encodedBracket%5B
应该保持原样,以使查询字符串正确,而不是变成encodedBracket[
.
根据2.2 统一资源标识符(URI)的保留字符:通用语法 http://www.apps.ietf.org/rfc/rfc3986.html#sec-2.2
URI 包括由以下分隔的组件和子组件
“保留”集中的字符。这些字符被称为
“保留”,因为它们可能(或可能不)被定义为分隔符
通用语法,通过每个特定于方案的语法,或通过
URI 解除引用算法的特定于实现的语法。如果
URI 组件的数据将与保留字符的冲突
目的作为分隔符,那么冲突的数据必须是
在形成 URI 之前进行百分比编码。
保留= gen-delims / sub-delims
gen-delims =“:”/“/”/“?” /“#”/“[”/“]”/“@”
子分隔符=“!” / "$" / "&" / "'" / "(" / ")" / "*" / "+" / "," /
“;” /“=”
所以不应该http_build_query
确实可以使用类似字符产生更具可读性的输出[]
仅在需要的地方进行 urlencoded?我如何让它产生这样的输出?