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
这是以下问题的副本.您可以在以下问题中找到有关此问题的更多详细信息和讨论
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)
| 归档时间: |
|
| 查看次数: |
112971 次 |
| 最近记录: |