【问题标题】:Encoding issue in I/O with JenaJena 的 I/O 编码问题
【发布时间】:2012-09-22 15:30:43
【问题描述】:

我正在生成一些带有Jena 的RDF 文件。整个应用程序使用 utf-8 文本。源代码也存储在 utf-8 中。

当我在控制台上打印一个包含非英文字符的字符串时,我得到了正确的格式,例如Est un lieu généralement officielle assis....

然后,我使用 RDF 编写器来输出文件:

Model m = loadMyModelWithMultipleLanguages()
log.info( getSomeStringFromModel(m) ) // log4j, correct output
RDFWriter w = m.getWriter( "RDF/XML" ) // default enc: utf-8
w.setProperty("showXmlDeclaration","true") // optional  
OutputStream out = new FileOutputStream(pathToFile)
w.write( m, out, "http://someurl.org/base/" )
// file contains garbled text

RDF 文件以:<?xml version="1.0"?> 开头。如果我添加 utf-8,则没有任何变化。

默认情况下,文本应编码为 utf-8。 生成的 RDF 文件验证正常,但是当我使用任何编辑器/可视化器(vim、Firefox 等)打开它时,非英文文本都被弄乱了:Est un lieu g√©n√©ralement officielle assis ...Est un lieu g\u221A\u00A9n\u221A\u00A9ralement officielle assis...。 (无论哪种方式,从用户的角度来看,这显然是不可接受的)。 Jena 支持的任何输出格式(RDF、NT 等)都会出现同样的问题。

我真的找不到一个合乎逻辑的解释。 official documentation 似乎没有解决这个问题。

我可以运行任何提示或测试来弄清楚吗?

【问题讨论】:

标签: file-io encoding rdf jena utf


【解决方案1】:

我的猜测是你的字符串搞砸了,而你的 printStringFromModel() 方法恰好以一种意外使它们正确显示的方式输出它们,但如果没有更多信息,很难说。

您正在指示 Jena 在 RDF/XML 文件中包含 XML 声明,但不要说明 Jena 在 XML 声明中声明的编码(如果有)。这将有助于了解。

您也没有展示如何在 printStringFromModel() 方法中打印字符串。

此外,在 Firefox 中,转到查看菜单,然后转到字符编码。选择什么编码?如果不是 UTF-8,那么当你选择 UTF-8 时会发生什么?选择其他编码时,您是否可以正确显示内容?

编辑:您在帖子中显示的 sn-p 看起来不错,应该可以工作。我最好的猜测是,将源字符串读入 Jena 模型的代码已损坏,并将 UTF-8 源读取为 ISO-8859-1 或类似的东西。您应该能够通过检查其中一个有问题的字符串的length() 来确认或取消确认:如果像é 这样的每个麻烦字符都算作两个,那么错误就在阅读中;如果它被正确计算为一个,那么它正在写入。

【讨论】:

  • 我正在使用 log4j 打印。源字符串都存储在 utf-8 中,我可以在任何编辑器上正确地可视化它们。当我在 Firefox/vim 中将编码从 utf-8 更改为其他编码时,没有任何变化。
【解决方案2】:

我的提示/答案是在 3 个地方检查字节序列:

  1. 数据源。使用 hex editor,确认源数据中的 é 字符由预期的 utf-8 十六进制序列 0xc3a8 表示。
  2. 在内存中。在调用 printStringFromModel 之后,立即设置断点并检查字符串中的字节(或 convert to hex and print them out
  3. 输出文件。同样,使用十六进制编辑器检查字节序列是否为 0xc3a8。

这将准确说明字节在您的程序路径中传输时发生的情况,以及它们偏离预期 0xc3a8 的位置。

【讨论】:

    【解决方案3】:

    解决此问题的最佳方法是打包您能证明问题的最小代码单元,并在Jena Jira 上提交完整的、可运行的测试用例作为票证。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-02-05
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多