我正在尝试阅读图片网址。正如java文档中提到的,我尝试通过
将URL转换为URIString 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();
我得到了一个文件的Java.io.FileNotFound异常 http://www.shefinds.com/files/Christian-Louboutin-Décolleté©-100-pumps.jpg
我做错了什么以及对此网址进行编码的正确方法是什么?
更新:
我正在使用罗马阅读RSS源。从BalusC那里得到建议我已经打印出来自不同阶段的原始输入,看起来ROME rss解析器使用的是ISO-8859-1而不是UTF-8。
答案 0 :(得分: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时错误地读取了它。
更新:或者您实际上已经在Java源代码中硬编码并使用错误的编码保存源文件本身。我已经将我的编辑器(Eclipse)配置为使用UTF-8保存文件,而-Dfile.encoding
也默认为UTF-8,这可以解释为什么它可以在我的机器上运行;)< / p>
更新2 :根据评论,简而言之,如果用于保存源文件的编码与运行时平台的默认-Dfile.encoding
匹配,那么一切都应该正常工作有问题的字符编码支持é
)。为了避免在您希望分发代码时发生无法预料的冲突,通过unicode转义替换硬编码的非ASCII字符确实更好。
答案 1 :(得分:0)
我认为技术答案是“你做不到”。根据标准,不能在URL中使用非ASCII字符,甚至某些ASCII字符必须使用“%XX”语法进行转义,其中XX是字符的ASCII值。
如果有的话,您可以使用'%E9'转义'é',但这依赖于服务器根据ISO-8859-1将其解释为字符的编码。虽然这在技术上是不允许的,但我相信很多服务器都会这样做。
答案 2 :(得分:0)
源文件的编码应该受到责备。使用IDE,将其设置为UTF-8,然后重新调整URL。