【问题标题】:Reading lines of text in unknown encoding读取未知编码的文本行
【发布时间】:2011-09-29 07:20:03
【问题描述】:

我需要逐行读取一个文本文件,并按顺序对每个文件应用几个 CharsetDecoder。实际上,我首先尝试将行解码为 UTF8 编码的行,如果 UTF8 CharsetDecoder 引发 MalformedInputException,则回退到单字节字符集。

但是,如果我使用带有默认或指定字符集的 InputStreamReader,readLine 函数会默默地替换为“?”它认为对指定字符集无效的所有字节。

我最终编写了自己的函数来读取行,它逐字节地从流中读取,寻找行终止符并构造行。但是这种方式看起来非常慢。

有没有什么方法可以让 Java 在不接触字节的情况下读取行?

更新: 我发现有所有 256 个字节都有效的字符集,其中两个是行终止符。 因此可以读取原始字节流line by line。 此类字符集的示例如下:

IBM00858 IBM437 IBM775 IBM850 IBM852 IBM855 IBM860 IBM861 IBM862 IBM863 IBM865 IBM866 ISO-8859-1 ISO-8859-13 ISO-8859-15 ISO-8859-2 ISO-8859-4 ISO-8859-5 ISO-8859-9 KOI8-R KOI8-U windows-1256

问题现已结束。

【问题讨论】:

  • 看起来很慢” - 你的意思是“看起来会是……”还是“我测量了它并且它是……”?
  • 我认为可以公平地假设逐字节读取流以确定编码比使用 InputStreamReader 读取要慢得多。
  • 确实不是。我不问如何确定字符集编码,因为我有办法做到这一点。我需要一种读取行而不弄乱字节的方法。
  • @Software Monkey 我运行 readLine 版本和逐字节版本,我感觉第二个版本明显慢。

标签: java character-encoding decoding


【解决方案1】:

您不能使用阅读器类而不期望它解码底层字节流。如果您有一个文件,其中每一行都以不同的字符集(?)编码,那么您最好设计一种检测底层字符编码的方法。也许您可以使用编码检测器,例如juniversalchardet

【讨论】:

  • 如果存在单字节编码,所有字节都被 InputStreamReader 认为是有效的,因此不替换为“?”,我可以将其用于我的目的。
  • 而且我不能使用外部库,只能使用核心 java.* 类。
  • 幸运的是,存在这样的字符集!我会更新问题。是否可以在此处将问题标记为已关闭?
猜你喜欢
  • 2015-03-20
  • 2016-04-09
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-09-03
  • 2016-08-02
相关资源
最近更新 更多