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)