如何编码URL以避免Java中的特殊字符?

时间:2010-12-31 17:12:34

标签: java url-encoding

我需要使用java代码对URL进行编码,以避免使用空格和%和&等特殊字符。 ...等

6 个答案:

答案 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,但补充一点:

  • 对于查询参数,HTML编码通常正是服务器所期望的;在这些之外,URLEncoder不应该使用
  • 是正确的
  • 最新的URI规范是RFC 3986,因此您应该将其称为主要来源

我在一段时间后写了一篇关于这个主题的博客文章: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;