繁体   English   中英

Java中拉丁字符的URL编码

[英]URL encoding for latin characters in Java

我正在尝试读取图片网址。 如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。

在这里工作正常(返回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时错误地读取了它。

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

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

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

如果有的话,您可以使用'%E9'转义'é',但这取决于服务器将其解释为根据ISO-8859-1的字符编码。 尽管从技术上来讲这是不允许的,但我相信许多服务器都可以做到。

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM