1

我正在使用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 等)都会出现同样的问题。

我真的找不到一个合乎逻辑的解释。官方文档似乎没有解决这个问题。

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

4

3 回答 3

1

我的猜测是你的字符串搞砸了,你的printStringFromModel()方法只是碰巧以一种不小心使它们正确显示的方式输出它们,但是如果没有更多信息就很难说。

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

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

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

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

于 2012-10-01T19:50:20.590 回答
1

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

  1. 数据源。使用十六进制编辑器,确认源数据中的 é 字符由预期的 utf-8 十六进制序列 0xc3a8 表示。
  2. 在记忆中。在调用 printStringFromModel 之后,立即设置断点并检查字符串中的字节(或转换为十六进制并打印出来
  3. 输出文件。同样,使用十六进制编辑器检查字节序列是 0xc3a8。

这将准确地告诉字节在程序路径上发生了什么,以及它们偏离预期的 0xc3a8 的位置。

于 2012-10-01T19:52:27.657 回答
1

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

于 2012-10-01T21:33:56.293 回答