Java :如何确定流的正确字符集编码

参考以下线程: Java 应用程序 : 无法正确读取 iso-8859-1 编码文件

以编程方式确定输入流/文件的正确字符集编码的最佳方法是什么?

我尝试使用以下方法:

File in =  new File(args[0]);
InputStreamReader r = new InputStreamReader(new FileInputStream(in));
System.out.println(r.getEncoding());

但是在我知道要用ISO8859_1编码的文件上,上述代码会产生ASCII,这是不正确的,并且不允许我将文件的内容正确呈现回控制台。


答案 1

您无法确定任意字节流的编码。这就是编码的本质。编码表示字节值与其表示形式之间的映射。因此,每个编码“可能”都是正确的。

getEncoding() 方法将返回为流设置的编码(读取 JavaDoc)。它不会为您猜测编码。

有些流会告诉您使用哪种编码来创建它们:XML,HTML。但不是任意字节流。

无论如何,如果有必要,您可以尝试自己猜测编码。每种语言对每个字符都有一个共同的频率。在英语中,char e 经常出现,但 ê 很少出现。在 ISO-8859-1 流中,通常没有0x00字符。但是 UTF-16 流有很多。

或者:你可以问用户。我已经看到一些应用程序,它们以不同的编码向您显示文件的片段,并要求您选择“正确”的文件片段。


答案 2

我用了这个库,类似于jchardet来检测Java中的编码:https://github.com/albfernandez/juniversalchardet