参考以下线程: Java App:无法正确读取iso-8859-1编码文件
以编程方式确定输入流/文件的正确字符集编码的最佳方法是什么?
我尝试过使用以下内容:
File in = new File(args[0]);
InputStreamReader r = new InputStreamReader(new FileInputStream(in));
System.out.println(r.getEncoding());
Run Code Online (Sandbox Code Playgroud)
但是在我知道用ISO8859_1编码的文件中,上面的代码产生了ASCII,这是不正确的,并且不允许我正确地将文件的内容呈现回控制台.
经过一定的调查,我发现java世界中有一些编码检测项目,如果getEncodingin InputStreamReader不起作用:
但是,我真的不知道哪一个是最好的.任何有实践经验的人都可以告诉我哪一个是最好的Java?
各种字符编码的问题在于包含文件并不总是清楚地标记.使用"字节顺序标记"或BOM标记一些不一致的约定.但实质上,你必须被告知文件编码是什么,准确地读取它.
我们构建了读取源文件的编程工具,这让我们感到悲伤.我们有办法指定默认值,并嗅探BOM等.我们在常规和默认值方面做得很好.但是我们(我假设其他所有人)被挂起的地方是没有BOM标记的UTF-8文件.
最近的MS IDE(例如,VS Studio 2010)显然会"嗅探"文件以确定它是否是没有BOM的UTF-8编码.(从事工具业务,我们希望与MS兼容,因为他们的市场份额,即使这意味着必须与他们一起超越"愚蠢"的悬崖.)我特别感兴趣的是他们用作什么启发式(虽然启发式的讨论很好)?怎么会"正确"?(考虑以这种方式解释的ISO8859-x编码字符串).
编辑:关于检测字符编码/集的这篇论文非常有趣:http: //www-archive.mozilla.org/projects/intl/UniversalCharsetDetection.html
编辑2012年12月:我们结束扫描整个文件,看它是否包含任何违反UTF-8序列的行为......如果没有,我们称之为UTF-8.这个解决方案的不好的部分是你必须处理两次字符,如果它是UTF-8.(如果它不是UTF-8,这个测试可能会相当快地确定,除非文件发生在所有7位ASCII上,此时读取像UTF-8一样不会受到伤害).