gpt4 book ai didi

java - 使用 Java 解析 URL 时,URL 中的编码字符错误

转载 作者:行者123 更新时间:2023-12-01 19:18:22 24 4
gpt4 key购买 nike

当我执行以下操作时:

try {
URL url = new URL(urlAsString);
//using proxy may increase latency
HttpURLConnection hConn = (HttpURLConnection) url.openConnection(Proxy.NO_PROXY);
// force no follow
hConn.setInstanceFollowRedirects(false);
// the program doesn't care what the content actually is
hConn.setRequestMethod("HEAD");
// default is 0 => infinity waiting
hConn.setConnectTimeout(timeout);
hConn.setReadTimeout(timeout);
hConn.connect();
int responseCode = hConn.getResponseCode();
hConn.getInputStream().close();
if (responseCode == HttpURLConnection.HTTP_OK)
return urlAsString;

String loc = hConn.getHeaderField("Location");
if (responseCode == HttpURLConnection.HTTP_MOVED_PERM && loc != null)
return loc.replaceAll(" ", "+");

} catch (Exception ex) {
}
return "";

该网址:http://bit.ly/gek1qK我得到了

http://blog.tweetsmarter.com/twitter-downtime/twitter -重新设计,然后一切都中断/

这是错误的。 Firefox 决定

http://blog.tweetsmarter.com/twitter-downtime/twitter-redesigns%E2%80%94then-everything-breaks/

代码有什么问题吗?

最佳答案

根据 RFC 2616, section 2.2 ,HTTP header 值通常应使用 ISO-8859-1 进行编码。

此处,bit.ly 发送了错误响应 - Location: header 使用 UTF-8 进行编码,因此破折号字符由三个单独的字节(0xe2、0x80、0x94)表示。

HttpURLConnection 使用 ISO-8859-1 解码字节,因此它们变成三个字符(â 和两个未定义的字符),但看起来好像您是- 在应用 URL 编码之前,使用 UTF-8 对它们进行编码(每个字符生成 2 个字节,因为所有三个字符的值 >= 0x80)。

Firefox 很可能始终将数据视为 ISO-8859-1;当稍后应用 URL 编码时,问题就会自行消失。

您可以通过对 getHeaderField() 返回的值进行 URL 编码来执行相同的操作;由于 Unicode 范围 U+0080 到 U+00FF 与 ISO-8859-1 字节范围 0x80-0xFF 相同,因此可以通过将非 ASCII 字符转换为 int 值来对其进行编码:

/**
* Takes a URI that was decoded as ISO-8859-1 and applies percent-encoding
* to non-ASCII characters. Workaround for broken origin servers that send
* UTF-8 in the Location: header.
*/
static String encodeUriFromHeader(String uri) {
StringBuilder sb = new StringBuilder();

for(char ch : badLocation.toCharArray()) {
if(ch < (char)128) {
sb.append(ch);
} else {
// this is ONLY valid if the uri was decoded using ISO-8859-1
sb.append(String.format("%%%02X", (int)ch));
}
}

return sb.toString();
}

关于java - 使用 Java 解析 URL 时,URL 中的编码字符错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5605219/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com