Apache Tika会进行字符集转换吗?

时间:2014-03-19 18:38:23

标签: unicode character-encoding apache-tika

我正在使用org.apache.tika.Tika.parseToString()将文档转换为纯文本(即无格式文本)文件。我的应用程序可能需要转换不使用Unicode字符集的文档。例如,某些文档可能以Chinese GB2312字符集编码。如果Tika将输出重新编码为UTF-8,那将是很好的。这将要求Tika引用许多不同字符集和Unicode之间的映射,以便转换字符。

Tika是否将非Unicode字符集文本转换为Unicode作为parseToString()的输出?那里有很多字符集,所以如果Tika为多个字符集做这件事我会留下深刻的印象。

更新:我能够使用一些非拉丁字符集(GB2312(中文)和KOI8-R(俄语))创建几个不同的文件。 Tika.parseToString()甚至无法检测到字符集或编码。我在Tika bug跟踪器上打开了一个问题:https://issues.apache.org/jira/browse/TIKA-1262

2 个答案:

答案 0 :(得分:1)

在谈论Apache Tika中的字符集时,您需要以不同的方式考虑两种文件。一种是基本上只是纯文本,另一种是更复杂的类型(包括二进制)

对于更复杂的文件,Tika主要使用第三方库,这些库负责返回Java Strings。这样做的确切方式取决于所讨论的文件格式 - 有时文件格式将包括编码信息,有时它将在其支持的内容中修复。无论哪种方式,Tika都会获得Java Strings,并向您返回一个Java String。您如何选择对输出进行编码取决于您。 (特别是对于Windows用户,请检查终端的编码和使用的字体。还有很多" Tika编码问题"实际上是人们未能在输出上正确设置默认的Java编码,或者没有支持Unicode的终端!)

使用纯文本文件,文件中没有编码信息,我们只有一堆字节。在这里,Apache Tika使用许多EncodingDetector个实例中的一个来进行检测。这些使用提示,n-gram,语言检测等,尝试根据给定的信息,文件中的字节模式等计算出最可能的文件编码。

EncodingDetector的定义保存在Tika-Core jar中,但大多数实现都保存在Tika-Parsers jar中(并由服务加载器方法加载,就像Detectors和Parsers一样)。主要是here in SVN。如果您在那里查看,您将看到Tika可以检测到的主要编码列表。

最后一件事 - 编码检测仅对文本文件执行,不对二进制类型文件执行。根据您调用Tika的方式,您可能需要调整它并/或提示它是一个文本文件,以便触发EncodingDetector逻辑。

答案 1 :(得分:0)

这个答案实际上来自Tika项目的JIRA用户。 https://issues.apache.org/jira/browse/TIKA-1262

事实证明,如果你告诉Tika文件扩展名是' .txt'它会将文件视为纯文本,尝试检测编码,并将其转换为UTF。

一种简单的方法是将空的Metadata对象传递给 TikaInputStream.get()。这将填写Metadata对象的 resourceName 字段。然后将此对象传递给 parseToString()。将 resourceName 字段设置为以.txt结尾的文件名,解析器知道将此文件视为纯文本,并将执行编码检测以尝试发现如何解码文件。从 parseToString()返回的字符串是Java UTF-16 String 对象。写入文件时,您可以看到它是Unicode并使用UCS字符集。

Tika tika = new Tika();
Metadata metadata = new Metadata();
TikaInputStream reader = TikaInputStream.get(new File(filepath), metadata);
String contents = tika.parseToString(reader, metadata);

到目前为止,这适用于使用GB2312 / GB18030和KOI8-R的文本文件。这是预期的行为,它是完美的!我不知道其他字符集/编码可以处理什么。