Java:url编码使“允许”字符保持不变

时间:2011-02-16 16:34:31

标签: java url encoding urlencode

来自Java新手的简单问题。 我想编码一个url,以便非标准字符将被转换为它们的十六进制值(即%XX),而一个人希望在一个url中看到的字符 - 字母,数字,正斜杠,问号等等,将保持不变。

例如,编码

"hi/hello?who=moris\\boris"

应该以

结果
"hi/hello?who=moris%5cboris"

想法?

6 个答案:

答案 0 :(得分:1)

答案 1 :(得分:1)

您可以使用以下内容来转义网址中的特殊字符。但是,您需要传递的值不是整个网址

public static String escapeSpecialCharacters(String input) {
        StringBuilder resultStr = new StringBuilder();
        for (char ch : input.toCharArray()) {
            if (isSafe(ch)) {
                resultStr.append(ch);
            } else{
                resultStr.append('%');
                resultStr.append(toHex(ch / 16));
                resultStr.append(toHex(ch % 16));                   
            }
        }

        return resultStr.toString();
    }

    private static char toHex(int ch) {
        return (char) (ch < 10 ? '0' + ch : 'A' + ch - 10);
    }

    private static boolean isSafe(char ch) {
    return ((ch>='A' && ch<='Z') || (ch>='a' && ch<='z') || (ch>='0' && ch<='9') || "-_.~".indexOf(ch)>=0); 
}

答案 2 :(得分:0)

使用URLEncoder.encode(url, "UTF-8"),请参阅the Javadoc

答案 3 :(得分:0)

实际上,这是一个相当棘手的问题。而且它很棘手的原因是URL的不同部分需要以不同的方式处理(编码)。

根据我的经验,最好的方法是使用URL或URI类从其组件中组装url,让他们正确地处理组件的编码。


事实上,现在我考虑一下,你必须在组装之前对组件进行编码。一旦部件组装完成,不可能判断是否(例如)“?”用于查询分隔符(不要转义它)或路径名组件中的字符(转义它)。

答案 4 :(得分:0)

org.apache.commons.codec.net.URLCodec将对特殊字符进行编码(例如,如您所示)。但是,您可能需要拆分URL,因为您不希望编码路径中的字符。此外,您需要拆分参数名称和值,因为? &安培;和=需要保持原样以单独传递参数,而不是作为一个巨大的参数名称。

答案 5 :(得分:0)

您可以尝试使用Spring UriUtils.This似乎正在为URL的相应​​部分正确处理URL编码/解码。

http://docs.spring.io/spring/docs/current/javadoc-api/org/springframework/web/util/UriUtils.html