【问题标题】:XML entity references with unicode paths带有 unicode 路径的 XML 实体引用
【发布时间】:2020-05-12 13:53:28
【问题描述】:

我正在缓存 XML 实体,因此我不必从服务器获取它们,从而导致 XML 标头标签像

<!ENTITY % xhtml-special-local SYSTEM "/Users/test/Library/Application Support/test/xhtml-special.ent" > %xhtml-special-local;

除非用户名包含 öäå 或类似的非 ascii 字符,否则此方法非常有用。有了这些,我得到以下解析器错误

java.net.MalformedURLException: no protocol: /Users/test/Library/Application Support/testööö/xhtml-special.ent

实体路径应该如何转义才能被解析器接受?

【问题讨论】:

    标签: java xml unicode


    【解决方案1】:

    这可以通过在路径前面加上 file:/// 来解决,就像这样

    <!ENTITY % xhtml-special-local SYSTEM "file:////Users/test/Library/Application Support/test/xhtml-special.ent" > %xhtml-special-local;
    

    【讨论】:

    • 应该是///而不是////,但大多数系统都可以容忍。关键是它应该是一个 URI,而不是文件名。
    • 简单地在前面加上“file://”并不是将文件名转换为 URI 的正确方法。您还需要处理特殊字符。看我的回答。
    【解决方案2】:

    它应该是一个 URI,而不是一个文件名。这意味着它应该以“file://”开头。

    其次,URI 只允许 ASCII 字符。一些系统更灵活并接受 IRI(允许非 ASCII 字符的 URI 的扩展),但规范中没有任何内容支持这一点。为了便于移植,您需要对非 ASCII 字符使用 %XX 转义。如果您使用 Java,最简单的方法是使用 File.toURI()。

        System.err.println(new File(
    "/Users/test/Library/Application Support/testööö/xhtml-special.ent"
    ).toURI().toASCIIString());
    

    输出

    file:/Users/test/Library/Application%20Support/test%C3%B6%C3%B6%C3%B6/xhtml-special.ent
    

    序列 %C3%B6 是组成 Unicode 字符 ö 的 UTF-8 编码的两个八位字节的十六进制表示。

    【讨论】:

      猜你喜欢
      • 2012-04-14
      • 2011-01-24
      • 1970-01-01
      • 2013-07-03
      • 1970-01-01
      • 2016-04-10
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多