【发布时间】:2012-11-22 17:08:50
【问题描述】:
我注意到 Java 的 UriBuilder 没有对包含在我的查询参数值(ISO 8601 格式的字符串)中的 : 字符进行编码。
根据维基百科,似乎应该对冒号进行编码。
特别是,编码查询字符串使用以下规则:
- 字母(A-Z 和 a-z)、数字 (0-9) 和字符 '.'、'-'、'~' 和 '_' 保持原样
- SPACE 编码为“+”或 %20[需要引用]
- 所有其他字符编码为 %FF 十六进制表示,任何非 ASCII 字符首先编码为 UTF-8(或其他指定的 编码)
那么,交易是什么?查询参数中的冒号是否应该编码?
更新:
我查看了 URI 语法规范 (RFC 3986),看起来确实不需要在查询参数中编码冒号。这是 URI 的 ABNF 的摘录:
URI = scheme ":" hier-part [ "?" query ] [ "#" fragment ]
query = *( pchar / "/" / "?" )
pchar = unreserved / pct-encoded / sub-delims / ":" / "@"
unreserved = ALPHA / DIGIT / "-" / "." / "_" / "~"
pct-encoded = "%" HEXDIG HEXDIG
sub-delims = "!" / "$" / "&" / "'" / "(" / ")" / "*" / "+" / "," / ";" / "=
【问题讨论】:
-
如果我错了,请纠正我,但根据您的链接“:”是保留的 gen-delim 并且“任何 [gen-delim] 也在保留集中被“保留”用作组件内的子组件分隔符”(即子分隔符)
-
我只是在解释 ABNF,它允许 ':' 作为查询字符串的一部分。这也与 Java 的 UriBuilder 的行为以及我在 .NET 上测试的一些代码相匹配。尽管如此,当您指出文本表明它应该以不同的方式执行时,这仍然令人困惑。
标签: http url web uri urlencode