我需要Java代码来编码URL,以避免特殊字符,如空格、%和&等。
我需要Java代码来编码URL,以避免特殊字符,如空格、%和&等。
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
传递它不正确。这样做会导致问题(特别是路径中的空格和加号问题)。
URI
类。 - WyzardURI
在查询字符串中似乎不会将空格转换为 '+'。我曾经发誓过它会这样做,因为我在解决自己代码中的空格/加号问题时学习了 URI 类,但那是几年前的事情,我已经记不清细节了。由于加号实际上是 application/x-www-form-urlencoded
MIME 类型的一部分,而不是 URI 语法本身,所以在将其放入 URI
之前,只需要通过 URLEncoder
运行(仅)查询字符串即可。虽然我需要重新考虑和可能重写我的答案。 - Wyzard我也花了很多时间研究这个问题,这是我的解决方案:
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();
"UTF-8"
转换为 StandardCharsets.UTF_8
并在代码重新格式化时自动执行。然后它会破坏代码 - 出现错误 java: incompatible types: java.nio.charset.Charset cannot be converted to java.lang.String
。我通过使用 StandardCharsets.UTF_8.name()
代替 "UTF-8"
来修复它。 - parsecerorg.apache.commons.codec.net.URLCodec
。String final url = "http://www.google.com?...."
String final urlSafe = org.apache.commons.codec.net.URLCodec.encode(url);
URLCodec urlCodec = new URLCodec();
System.out.println(urlCodec.encode("FOO BAR")); // FOO+BAR
System.out.println(URLEncoder.encode("FOO BAR", "UTF-8")); FOO+BAR
- Topera这是我相当简单的解决方案:
不要对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所写的内容,但是还要补充一点:
URLEncoder
是不正确的我之前写过一篇关于这个主题的博客文章:Java:安全字符处理和URL构建