使用Jena在I / O中编码问题

时间:2012-10-01 18:43:57

标签: file-io encoding rdf jena utf

我正在使用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似乎无法解决此问题。

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

3 个答案:

答案 0 :(得分:1)

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

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

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

此外,在Firefox中,转到“视图”菜单,然后转到“字符编码”。选择了什么编码?如果它不是UTF-8,那么选择UTF-8会发生什么?在选择其他编码时,您是否能够正确显示内容?

修改:您在帖子中显示的代码段看起来很好,应该可以使用。我最好的猜测是将源字符串读入Jena模型的代码被破坏,并将UTF-8源读取为ISO-8859-1或类似内容。您应该能够通过检查其中一个违规字符串的length()来确认或断言:如果é这样的每个麻烦字符都计为两个,那么错误就在读取;如果它被正确地算作一个,那就是写作。

答案 1 :(得分:1)

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

  1. 数据源。使用hex editor,确认源数据中的é字符由预期的utf-8十六进制序列0xc3a8表示。
  2. 在记忆中。在调用printStringFromModel之后,放入一个断点并检查字符串中的字节(或convert to hex and print them out
  3. 输出文件。再次,使用十六进制编辑器检查字节序列是0xc3a8。
  4. 这将准确说明字节沿着程序路径行进时发生的情况,以及它们偏离预期的0xc3a8的位置。

答案 2 :(得分:1)

解决此问题的最佳方法是打包代表您可以演示问题的最小代码单元,并在Jena Jira上提交一个完整的,可运行的测试用例作为故障单。