如何编码查询参数以在Java中的URL上进行编码?我知道,这似乎是一个明显的问题.
我不确定有两个细微之处:
笔记:
java.net.URLEncoder.encode似乎没有用,它似乎是为了提交表单的编码数据.例如,它+代替空间编码空间%20,并编码不必要的冒号.java.net.URI 不编码查询参数Buh*_*ndi 121
java.net.URLEncoder.encode(String s, String encoding)也可以帮忙.它遵循HTML表单编码application/x-www-form-urlencoded.
URLEncoder.encode(query, "UTF-8");
Run Code Online (Sandbox Code Playgroud)
另一方面,百分比编码(也称为URL编码)用空间编码%20.冒号是一个保留字符,因此:编码后仍然会保留冒号.
Kos*_*sta 11
遗憾的是,URLEncoder.encode()不会生成有效的百分比编码(如http://tools.ietf.org/html/rfc3986#section-2.1中所述).
URLEncoder.encode()编码一切都很好,除了空格被编码为"+".我能找到的所有Java URI编码器只公开公共方法来编码查询,片段,路径部分等 - 但不要公开"原始"编码.这是不幸的,因为允许片段和查询将空间编码为+,因此我们不想使用它们.路径编码正确,但首先是"规范化",因此我们也不能将它用于"通用"编码.
我能提出的最佳解决方案:
return URLEncoder.encode(raw, "UTF-8").replaceAll("\\+", "%20");
Run Code Online (Sandbox Code Playgroud)
如果replaceAll()对你来说太慢了,我想替代方法就是推出自己的编码器......
编辑:我首先在这里有这个代码,不编码"?","&","="正确:
//don't use - doesn't properly encode "?", "&", "="
new URI(null, null, null, raw, null).toString().substring(1);
Run Code Online (Sandbox Code Playgroud)
没有必要在查询中将冒号编码为%3B,尽管这样做并非违法.
URI = scheme ":" hier-part [ "?" query ] [ "#" fragment ]
query = *( pchar / "/" / "?" )
pchar = unreserved / pct-encoded / sub-delims / ":" / "@"
unreserved = ALPHA / DIGIT / "-" / "." / "_" / "~"
pct-encoded = "%" HEXDIG HEXDIG
sub-delims = "!" / "$" / "&" / "'" / "(" / ")" / "*" / "+" / "," / ";" / "="
Run Code Online (Sandbox Code Playgroud)
似乎只有百分比编码的空格是有效的,因为我怀疑空间是ALPHA还是DIGIT
请查看URI规范以获取更多详细信息.
内置的Java URLEncoder正在做它应该做的事情,你应该使用它.
A"+"或"%20" 都在一个URL一个空格字符替换有效.任何一个都可以工作.
应编码":" ,因为它是分隔符.即http:// foo或ftp:// bar.特定浏览器在未编码时可以处理它的事实并不能使其正确.你应该编码它们.
作为一个好的做法,请务必使用带有字符编码参数的方法.通常在那里使用UTF-8,但是你应该明确地提供它.
URLEncoder.encode(yourUrl, "UTF-8");
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
184447 次 |
| 最近记录: |