2010-01-03 52 views
2

我的Java程序使用RTFEditorKit在RTF文件上進行文本提取。某些RTF文件包含西里爾字符(俄語),並且取決於RTF版本,提取的文本可以是好的或包含亂碼。當它的胡言亂語,我可以用它來得到正常的文字:在Java中檢測RTF文檔的編碼

String text = ... // extracted text

String decodedText = new String(text.getBytes("ISO-8859-1"), "cp1251");

現在的問題是,我無法找到一個方法來自動檢測文件的編碼,即是否提取的文本必須解碼或不解碼。有人知道怎麼做這個嗎?提前致謝!

編輯:在RTF文件的第一行我看到的東西,看起來像一個編碼:

  • 文件在那裏我得到亂碼:{\ RTF1 \ ANSI \ ansicpg1251 \ deff0 \ deflang1049
  • 帶好文本的文件:{\ rtf1 \ ansi \ ansicpg1251 \ deff0

回答

1

我不相信Java在標準庫中有任何內容來執行此操作。

查看ICU component。它有一個Java變體,您可以使用CharsetDetector來獲取文檔編碼。

2

我不相信文件本身有一個編碼。來自Wikipedia page

RTF是一種8位格式。這將 限制爲ASCII,但RTF可以通過轉義 序列編碼 字符超出ASCII。字符轉義字符有 兩種類型:代碼頁轉義字符和 Unicode轉義字符。在代碼頁 轉義中,使用撇號後的兩個十六進制數字 用於表示從 Windows代碼頁取得的字符的 。例如,如果存在指定Windows-1256, 的控制代碼 ,則序列\'c8將 編碼阿拉伯字母beh(ب)。

如果需要Unicode轉義,所述 控制字\用於U,接着是 16位有符號十進制整數給出 Unicode的碼點數目。

所以我懷疑你必須自己提取文本,然後使用上述規則進一步解析。

1

Internet Explorer使用字符頻率計數來猜測所使用的語言和編碼。它有點作品。做類似的事情。

3

RTF文件以兩個控制序列開始,其中第一個指定RTF版本(不是標準,但幾乎總是cs \rtf1),第二個指定字符集,這是\ansi(通常),\mac\pcpca(幾乎從未遇到過)。在此之後,可以指定修改由\ansicpg給出的字符默認解釋的Unicode代碼頁。

這裏沒有很多文檔可以找到。試着看看http://msdn.microsoft.com/en-us/library/aa140301(office.10).aspx,AbiWord開發者郵件列表上的好人花了很多時間來破譯各種RTF規範。