Encoding 文件编码为utf8,但在Windows-1256中可读

Encoding 文件编码为utf8,但在Windows-1256中可读,encoding,utf-8,Encoding,Utf 8,起初我正在处理编码未知的文件,但我在JAVA中得到了以下代码行: InputStream in = new FileInputStream(new File("D:\\lbl2\\1 (26).LBL")); InputStreamReader inputStreamReader = new InputStreamReader(in); System.out.print(inputStreamReader.getEncoding()); 我们在输出中得到UTF8。 但问题是,当

起初我正在处理编码未知的文件,但我在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
返回在
InputStreamReader
构造函数中选择的编码。根据Oracle的文档,如果您不使用一个接受字符集参数的构造函数,您将获得“平台默认字符集”

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

如果您事先知道此文件是Windows-1256,则可以使用:

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

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

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

如果你知道所有的文件都在一个编码中,那就太好了,你可以指定编码和生活是好的

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

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

*我相信要在Java中获得严格解码,首先需要获得“Charset”,然后获得“CharsetDecoder”,然后使用“onMalformedInput”方法将其设置为严格模式