编码(和重定向)到Java中具有特殊字符的URL

时间:2011-03-27 21:40:30

标签: java unicode redirect url-encoding

我在String对象中有一个URL,如下所示:

  

http://bhorowitz.com/2011/03/24/bubble-trouble-i-don“叔认为那么/

URL可能包含也可能不包含需要编码的unicode字符。例如,上面的链接应转换为:

  

http://bhorowitz.com/2011/03/24/bubble-trouble-i-don%e2%80%99t-think-so/

在我重定向到它之前

如何在保持URL结构的其余部分完整的同时正确转义所有特殊字符(例如unicode)?有什么东西可以做到这一点,还是我需要自己滚动?

编辑:棘手的部分是我只需要转义无效字符,同时保持URL的其余部分不变(例如http://应该保持http://并且不应该被转义)。据我所知,URLEncoder不允许我这样做。

4 个答案:

答案 0 :(得分:1)

答案 1 :(得分:1)

JDK附带了足够的工具来处理您想要的内容。 请提供文件: http://download.oracle.com/javase/6/docs/api/java/net/URLEncoder.htmlhttp://download.oracle.com/javase/6/docs/api/java/net/URLDecoder.html

用法非常简单。

String decoded = URLDecoder.decode("url%20to%20decode", "UTF-8");
String encoded = URLEncoder.encode("url to decode", "UTF-8");

请注意,应提供正确的字符编码。这两个类都具有这些方法的单个参数版本,但它们被视为已弃用。

答案 2 :(得分:0)

我相信这可以做你想要的。它会编码路径中不是/的任何东西。它可能不是最优雅的解决方案,但它应该是安全的。

    // make sure url is valid before parsing it
    try {
        new URL(url);
    } catch (MalformedURLException e) {
        return;
    }

    StringBuilder sb = new StringBuilder();
    Scanner scanner = new Scanner(url).useDelimiter("/");

    // append the protocol part, e.g. http://
    sb.append(scanner.next());
    sb.append('/');

    // append the hostname part
    sb.append(scanner.next());
    sb.append('/');

    // encode each part of path
    while (scanner.hasNext()) {
        String part = scanner.next();
        sb.append(URLEncoder.encode(part, "UTF-8"));
        sb.append('/');
    }

    // remove trailing slash if original doesn't have one
    if (!url.endsWith("/")) {
        sb.deleteCharAt(sb.length() - 1);
    }

    String encoded = sb.toString();

答案 3 :(得分:0)

我认为这就是你真正想要的:

new URL(yourURLString).toURI().toASCIIString();

它只会对所需的字符进行编码,同时保持其他所有字符不受影响。