【问题标题】:The File Encoding Is utf8 but is in Windows-1256 readable文件编码为 utf8,但在 Windows-1256 中可读
【发布时间】:2015-06-12 16:01:56
【问题描述】:

我一开始正在处理编码未知的文件,但我在 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 时,所有字符都正确且可读。 我做错了吗?

【问题讨论】:

    标签: encoding utf-8


    【解决方案1】:

    Java 不会尝试检测文件的编码。 getEncoding 返回在 InputStreamReader 构造函数中选择的编码。根据 Oracle 的文档,如果您不使用采用字符集参数的构造函数之一,您将获得“平台默认字符集”。

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

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

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

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

    【讨论】:

      【解决方案2】:

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

      如果您知道所有文件都采用单一编码,那就太好了,您可以指定编码和生活是好的。

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

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

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

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2015-08-30
        • 1970-01-01
        • 1970-01-01
        • 2017-05-26
        • 2013-06-17
        相关资源
        最近更新 更多