不是这样的。查询编码是URI/URN标准的一部分,完全取决于服务器希望如何呈现结果。有些使用%编码以便在解析方面更加安全(可读性并不重要),有些使用+,有些使用-(例如stack overflow)。
编码的原因很简单,URI/URN不允许空格(和其他特殊字符)。然而,标准没有定义应该如何完成。
URI规范要求任何无效字符都必须使用百分号编码进行编码。由于空格在URI中是无效的,因此需要使用%20
进行编码。
除此之外,HTML 4为表单指定了特殊的编码application/x-www-form-urlencoded,它基于百分号编码,但将空格编码为+
而不是%20
。
PHP有两个不同的URI编码函数:
rawurlencode
按照URI规范进行编码(不考虑组件上下文),以及urlencode
按照application/x-www-form-urlencoded进行编码。urlencode 将空格编码为 +
,而 rawurlencode 则将其编码为 %20
。
urlencode
这与 » RFC 3986 编码(请参见 rawurlencode())不同,因为出于历史原因,空格被编码为加号(+)符号。
根据 rawurlencode
返回一个字符串,其中所有非字母数字字符(除了 -_.~)都被替换为百分号(%)后跟两个十六进制数字。这是 » RFC 3986 中描述的编码,用于保护文字字符不被解释为特殊的 URL 分隔符,并保护 URL 免受字符转换(例如某些电子邮件系统)的传输媒体破坏。
按照标准,'+' 是 URI 中的保留字符 (RFC 3986)。URI 有两个子空间:URL 和 URN。'http:' 是 URL 方案的一种实现,RFC 3986 保留字符的使用是特定于 http 的。'?' 是 URI 中的另一个保留字符,在 http URL 中用于标记查询字符串的开始。同样,'+' 保留字符用于编码空格。百分号编码 (%20) 是编码空格的标准方式,并且适用于任何 URI(不管其实现方式如何)。
HTML 中没有 urlencode
,因此它未被定义。
将空格转换为什么取决于设计和实现。
空格不是 URI 有效的,因此需要进行转换。 %20
是空格的 URI 有效编码。 +
是用于更好的可读性替换空格的字符。