0

我正在尝试读取图像 URL。正如java文档中提到的,我尝试将URL转换为URI

String imageURL = "http://www.shefinds.com/files/Christian-Louboutin-Décolleté-100-pumps.jpg";
URL url = new URL(imageURL);
url = new URI(url.getProtocol(), url.getHost(), url.getFile(), null).toURL();  
URLConnection conn = url.openConnection();
InputStream is = conn.getInputStream();

我得到了文件 http://www.shefinds.com/files/Christian-Louboutin-Dà ©colleté-100-pumps.jpg 的 Java.io.FileNotFound 异常

我做错了什么,编码这个 URL 的正确方法是什么?

更新:
我正在使用罗马阅读 RSS 提要。接受 BalusC 的建议,我打印了来自不同阶段的原始输入,看起来 ROME rss 解析器使用的是 ISO-8859-1 而不是 UTF-8。

4

3 回答 3

3

在这里工作正常(返回 403,至少不是 404):

URL url = new URL("http://www.shefinds.com/files/Christian-Louboutin-Décolleté-100-pumps.jpg");
URLConnection connection = url.openConnection();
InputStream input = connection.getInputStream();

当我修复它以使其不返回 403 时,图片已正确退出:

URL url = new URL("http://www.shefinds.com/files/Christian-Louboutin-Décolleté-100-pumps.jpg");
URLConnection connection = url.openConnection();
connection.setRequestProperty("User-Agent", "Mozilla/4.0");
InputStream input = connection.getInputStream();
OutputStream output = new FileOutputStream("/pic.jpg");
for (int data = 0; (data = input.read()) != -1;) {
    output.write(data));
}

所以你的问题出在其他地方。实际上不需要转换。初始 URL 有效。

也许您使用错误的字符编码从某些二进制源获取实际 URL?转换为é表示é原始源是 UTF-8 编码的,并且代码在使用 ISO-8859-1 而不是 UTF-8 时错误地读入了它。

更新:或者您实际上已经在 J​​ava 源代码中对其进行了硬编码,并使用错误的编码保存了源文件本身。我已经将我的编辑器(Eclipse)配置为使用 UTF-8 保存文件,并且-Dfile.encoding默认为 UTF-8,这可以解释为什么它可以在我的机器上工作;)

更新 2:根据评论,简而言之,如果用于保存源文件的编码与-Dfile.encoding运行时平台的默认值匹配(并且所讨论的字符编码支持é),那么一切都应该正常工作。为了避免在您希望分发代码时出现这些不可预见的冲突,最好用 unicode 转义符替换硬编码的非 ASCII 字符。

于 2010-03-14T17:16:32.890 回答
0

源文件的编码是罪魁祸首。使用您的 IDE,将其设置为 UTF-8,然后重新粘贴 URL。

于 2010-03-15T21:26:31.740 回答
0

我认为技术上的答案是“你不能”。根据标准,非 ASCII 字符不能在 URL 中使用,甚至某些 ASCII 字符必须使用 "%XX" 语法进行转义,其中 XX 是字符的 ASCII 值。

如果有的话,您可以使用 '%E9' 转义 'é' 但这依赖于服务器将其解释为根据 ISO-8859-1 的字符编码。虽然这在技术上是不允许的,但我相信很多服务器都会这样做。

于 2010-03-14T17:19:53.337 回答