Java中的自动检测字符编码

Posted

技术标签:

【中文标题】Java中的自动检测字符编码【英文标题】:Auto-Detect Character Encoding in Java 【发布时间】:2012-02-29 04:36:51 【问题描述】:

似乎是一个相当热门的问题,但我还没有找到解决方案;也许是因为它有这么多 种口味。不过就在这里。我正在尝试读取一些逗号分隔的文件(有时分隔符可能比逗号更独特,但现在逗号就足够了)。

这些文件应该是整个行业的标准化文件,但最近我们看到了许多不同类型的字符集文件。我希望能够设置一个 BufferedReader 来弥补这一点。

执行此操作并检测是否成功的标准方法是什么?

我对这种方法的第一个想法是循环遍历字符集 simple->complex,直到我可以毫无例外地读取文件。虽然不完全理想...

感谢您的关注。

【问题讨论】:

检测编码是一个非常困难的问题,对于某些编码,唯一知道其中一个是正确的方法是通过上下文分析(这是一项非常重要的任务)。如果您确切知道需要支持哪些编码(例如 UTF-16、UTF-8、ISO-8859-1),可能会变得更容易,但这取决于这些编码是什么。 如果没有得到异常并不一定代表成功 您提到的有关行业标准的事情,这是您唯一应该更严格地实施的事情。您可以使用 -Dfile.encoding 作为 jvm arg 以仅支持特定类型的编码 在我所在的行业中,我只有在创建数据时才拥有对标准的控制权。这很糟糕,但它就是这样。我不能做任何事情来执行标准。在一个理想的世界里,这将是不同的。 --- 无论如何,notepad++(据我所知不是 java)之类的程序似乎比我做得更好。我想支持 ANSI、UTF-8、UTF-16、USC-2(大小)字节序。除此之外的任何事情都超出了我目前的范围。 我会建议您在处理所有文件之前对所有文件运行 native2ascii 工具。那么你就不用担心java IO这个问题了 【参考方案1】:

Mozilla 的 universalchardet 应该是最有效的检测器。 juniversalchardet 是它的 java 端口。还有一个端口。阅读此 SO 以获取更多信息Character Encoding Detection Algorithm

【讨论】:

我看到它不是 apache 的许可证。与 apache 相比有何不同?

以上是关于Java中的自动检测字符编码的主要内容,如果未能解决你的问题,请参考以下文章

findstr 或 grab 自动检测字符编码 (UTF-16)

Java如何检测替换4个字节的utf-8编码(此范围编码包含emoji)

java中的编码字符串长度

如何检测文本文件的字符编码?

java中的字符都是以Unicode编码?那么这里的字符指的是啥

java判断字符串是不是超出utf8编码