【问题标题】:URL encoding for latin characters in JavaJava中拉丁字符的URL编码
【发布时间】:2011-01-27 10:16:27
【问题描述】:

我正在尝试读取图像 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();

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

我做错了什么以及编码此 URL 的正确方法是什么?

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

【问题讨论】:

  • @sammichy:要消除 .java 源文件编码问题,请在创建字符串时使用 ASCII escapin:"...://www.shefinds.com /files/Christian-Louboutin-D\u00e9collet\u00e9-100-pumps.jpg"。请注意,您的 .java 源文件中的 'é' 变为 '\u00e9'。
  • @sammichy:您显示的也不是错误消息。你从哪里得到这个,你是怎么打印出来才知道它是 "...//www.shefinds.com/files/Christian-Louboutin-Décolleté-100-pumps.jpg" ?
  • @sammichy:值得一提的是:.java 文件没有与之关联的元数据,因此检测它们的编码并使其在混合环境中完美地工作是一个主要的痛苦Linux、OS X、Windows、各种IDEs环境。因此,在我编写指南的公司,.java 文件必须 只能是 ASCII,并且在构建时由脚本强制执行。
  • @WizardOfOdds - 抛出的异常是 java.io.filenotfound 异常。

标签: java url encoding character latin


【解决方案1】:

在这里工作正常(返回 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:根据 cmets,简而言之,如果用于保存源文件的编码与运行时平台的默认 -Dfile.encoding 匹配(以及字符编码有问题支持é)。为了避免在您希望分发代码时出现这些无法预料的冲突,最好用 unicode 转义符替换硬编码的非 ASCII 字符。

【讨论】:

  • 小补充:如果你真的需要从URI到URL的转换,你可能要使用:url = new URI(url.getProtocol(), url.getHost(), url.getPath() , url.getQuery(), null).toURL();否则,查询参数将不起作用。
  • 需要转换。鉴于此代码,URL 将包含 ? s,而不是非 us-ascii 字符。
  • URL 到 URI 的转换对我有用;来自 Javadoc:请注意,{@link java.net.URI} 类在某些情况下会执行其组件字段的转义。管理 URL 编码和解码的推荐方法是使用 {@link java.net.URI},并使用 {@link #toURI()} 和 {@link URI#toURL()} 在这两个类之间进行转换.
  • @axtavt:我想我看到了问题所在。我已将编辑器配置为将源文件保存为 UTF-8。您(可能还有 OP)显然已将编辑器配置为使用另一种编码保存文件。我正在使用 Eclipse: Window > Preferences > General > Workspace > Text File Encoding > Other > UTF-8 应该这样做。这也会影响 Java 代码中的“普通”字符串。
  • @BalusC:不,源编码没问题。问题是您的解决方案取决于系统编码。使用-Dfile.encoding=UTF-8,它将é 编码为0xC3 0xA9,并且可以正常工作。使用-Dfile.encoding=latin1 会产生0xE9,但会失败。在其他编码中,它会产生?,它也会失败。
【解决方案2】:

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

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

【讨论】:

  • @Sean Owen: "其中 XX 是字符的 ASCII 值" 不正确:不存在 0x7F 以上的 ASCII 字符(ASCII 从 0 到127).
  • 不确定我是否理解 - ASCII 值范围从 0x00 到 0x7F,是的。它们的编码从 %00 到 %7F。 0x80 不是 ASCII 字符值这一事实与它有什么关系?
【解决方案3】:

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

【讨论】:

    猜你喜欢
    • 2015-11-29
    • 1970-01-01
    • 2013-08-28
    • 1970-01-01
    • 2011-09-12
    • 1970-01-01
    • 1970-01-01
    • 2015-03-24
    • 2021-03-19
    相关资源
    最近更新 更多