文件编码是 utf8 但在 Windows-1256 可读

The File Encoding Is utf8 but is in Windows-1256 readable

我一开始正在处理编码未知的文件,但我在 JAVA:

中得到了这些行的编码
InputStream in = new FileInputStream(new File("D:\lbl2\1 (26).LBL"));
    InputStreamReader inputStreamReader = new InputStreamReader(in);
    System.out.print(inputStreamReader.getEncoding());

我们在输出中得到 UTF8。 但问题是,当我尝试使用浏览器或 Notpad++ 等文本编辑器查看文件内容时,我无法正确查看字符。相反,当我将编码更改为 Windows-1256 时,所有字符都正确且可读。 我做错了吗?

Java 不会尝试检测文件的编码。 getEncoding returns 在 InputStreamReader 构造函数中选择的编码。根据 Oracle 的文档,如果您不使用采用字符集参数的构造函数之一,您将得到 'platform default charset'。

This question 讨论什么是平台默认字符集,以及如何更改它。

如果你事先知道这个文件是Windows-1256,你可以使用:

InputStreamReader inputStreamReader = new InputStreamReader(in, "Windows-1256");

尝试检测文件的编码通常会失败 - 例如,请参阅 Windows 记事本中的 Bush hid the facts 问题。

不幸的是,没有 100% 可靠的方法来检测文件的编码,正如其他答案指出的那样,Java 默认情况下不会尝试。它只是假定平台的默认编码。

如果您知道所有文件都采用单一编码,那就太好了,您只需指定该编码即可。

如果您知道某些文件采用 UTF-8 而某些文件采用单一旧编码,那么您通常可以先尝试严格* UTF-8 解码。如果严格的 UTF-8 解码出错,那么您将继续使用旧编码。

如果你有更广泛的编码组合,事情就会变得相当困难,你可能不得不求助于一些非常复杂的语言处理来解决它们。

* 我相信要在 Java 中进行严格解码,您需要先获取 "Charset",然后获取 "CharsetDecoder",然后使用 "onMalformedInput" 方法来将其设置为严格模式。