我需要使用java代码对URL进行编码,以避免使用空格和%和&等特殊字符。 ...等
答案 0 :(得分:65)
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
传递它是不正确的。这样做会导致问题(尤其是前面提到的关于空间和路径中的加号的问题)。
答案 1 :(得分:11)
这是以下问题的副本。您可以在以下问题中找到有关此问题的更多详细信息和讨论
HTTP URL Address Encoding in Java
public class URLParamEncoder {
public static String encode(String input) {
StringBuilder resultStr = new StringBuilder();
for (char ch : input.toCharArray()) {
if (isUnsafe(ch)) {
resultStr.append('%');
resultStr.append(toHex(ch / 16));
resultStr.append(toHex(ch % 16));
} else {
resultStr.append(ch);
}
}
return resultStr.toString();
}
private static char toHex(int ch) {
return (char) (ch < 10 ? '0' + ch : 'A' + ch - 10);
}
private static boolean isUnsafe(char ch) {
if (ch > 128 || ch < 0)
return true;
return " %$&+,/:;=?@<>#%".indexOf(ch) >= 0;
}
}
答案 2 :(得分:5)
如果您不想手动使用Apache Commons - Codec库。您正在查看的课程是:org.apache.commons.codec.net.URLCodec
String final url = "http://www.google.com?...."
String final urlSafe = org.apache.commons.codec.net.URLCodec.encode(url);
答案 3 :(得分:1)
我会回复Wyzard wrote,但补充一点:
URLEncoder
不应该使用我在一段时间后写了一篇关于这个主题的博客文章:Java: safe character handling and URL building
答案 4 :(得分:1)
我也花了很长时间来解决这个问题,所以这是我的解决方案:
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();
答案 5 :(得分:-1)
这是我的解决方案,非常简单:
我没有对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;