我需要 java 代码来编码 URL 以避免特殊字符,例如空格和 % 和 & ...等
5 回答
URL 构造很棘手,因为 URL 的不同部分对于允许使用的字符有不同的规则:例如,加号在 URL 的查询组件中保留,因为它表示一个空格,但在 URL 的路径组件中,加号是加号没有特殊含义,空格编码为“%20”。
RFC 2396解释(在第 2.4.2 节中)完整的 URL 始终采用其编码形式:您获取各个组件(方案、权限、路径等)的字符串,根据自己的规则对每个组件进行编码,然后将它们组合成完整的 URL 字符串。尝试构建一个完整的未编码 URL 字符串然后对其进行单独编码会导致一些细微的错误,例如路径中的空格被错误地更改为加号(符合 RFC 的服务器将其解释为真正的加号,而不是编码的空格)。
在 Java 中,构建 URL 的正确方法是使用URI
类。使用将 URL 组件作为单独字符串的多参数构造函数之一,它将根据该组件的规则正确转义每个组件。该toASCIIString()
方法为您提供了一个正确转义和编码的字符串,您可以将其发送到服务器。要解码URL,URI
请使用单字符串构造函数构造一个对象,然后使用访问器方法(例如getPath()
)来检索解码的组件。
不要使用URLEncoder
类!尽管名称如此,但该类实际上是进行 HTML 表单编码,而不是 URL 编码。连接未编码的字符串以生成“未编码”的 URL,然后通过URLEncoder
. 这样做会导致问题(尤其是前面提到的关于路径中的空格和加号的问题)。
我也花了很多时间来解决这个问题,所以这就是我的解决方案:
String urlString2Decode = "http://www.test.com/äüö/path with blanks/";
String decodedURL = URLDecoder.decode(urlString2Decode, "UTF-8");
URL url = new URL(decodedURL);
URI uri = new URI(url.getProtocol(), url.getUserInfo(), url.getHost(), url.getPort(), url.getPath(), url.getQuery(), url.getRef());
String decodedURLAsString = uri.toASCIIString();
如果您不想手动使用 Apache Commons - Codec library。您正在查看的课程是:org.apache.commons.codec.net.URLCodec
String final url = "http://www.google.com?...."
String final urlSafe = org.apache.commons.codec.net.URLCodec.encode(url);
这是我的解决方案,非常简单:
我没有对url本身进行编码,而是对我传递的参数进行了编码,因为参数是用户输入,用户可以输入任何意外的特殊字符字符串,所以这对我来说很好:)
String review="User input"; /*USER INPUT AS STRING THAT WILL BE PASSED AS PARAMTER TO URL*/
try {
review = URLEncoder.encode(review,"utf-8");
review = review.replace(" " , "+");
} catch (UnsupportedEncodingException e) {
e.printStackTrace();
}
String URL = "www.test.com/test.php"+"?user_review="+review;
我会回应Wyzard 写的内容,但要补充一点:
- 对于查询参数,HTML 编码通常正是服务器所期望的;
URLEncoder
在这些之外,不应该使用是正确的 - 最新的 URI 规范是RFC 3986,因此您应该将其称为主要来源
不久前我写了一篇关于这个主题的博客文章:Java:安全字符处理和 URL 构建