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

Adh*_*ham 34 java url-encoding

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

Wyz*_*a-- 67

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.这样做会导致问题(特别是前面提到的关于空间和路径中的加号的问题).


fmu*_*car 11

这是以下问题的副本.您可以在以下问题中找到有关此问题的更多详细信息和讨论

Java中的HTTP URL地址编码

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;
    }

}
Run Code Online (Sandbox Code Playgroud)


Tom*_*Tom 11

我也花了很多时间解决这个问题,所以这就是我的解决方案:

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();
Run Code Online (Sandbox Code Playgroud)


小智 6

如果您不想手动使用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);
Run Code Online (Sandbox Code Playgroud)

  • 为什么这个答案会被低估? (4认同)
  • 只是一张纸条.URLCodec意味着替代URLEncoder/URLDecoder.编码整个网址并不重要,这就是示例所示.意思是甚至http://变成http%3A%2F%2F.除非那是你想要做的. (3认同)
  • 两者都给了我相同的“错误”结果 URLCodec urlCodec = new URLCodec(); System.out.println(urlCodec.encode("FOO BAR")); // FOO+BAR System.out.println(URLEncoder.encode("FOO BAR", "UTF-8")); 福+酒吧 (2认同)