来自Java新手的简单问题。 我想编码一个url,以便非标准字符将被转换为它们的十六进制值(即%XX),而一个人希望在一个url中看到的字符 - 字母,数字,正斜杠,问号等等,将保持不变。
例如,编码
"hi/hello?who=moris\\boris"
应该以
结果"hi/hello?who=moris%5cboris"
想法?
答案 0 :(得分:1)
OWASP Enterprise Security API为此提供了解决方案。
答案 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