【问题标题】:Reading any text file having strange encoding?读取任何具有奇怪编码的文本文件?
【发布时间】:2013-03-19 22:26:36
【问题描述】:

我有一个带有奇怪编码“UCS-2 Little Endian”的文本文件,我想使用 Java 读取它的内容。

正如您在上面的屏幕截图中看到的,文件内容在 Notepad++ 中看起来很好,但是当我使用此代码阅读它时,控制台中只会打印垃圾:

String textFilePath = "c:\strange_file_encoding.txt"
BufferedReader reader = new BufferedReader( new InputStreamReader( new FileInputStream( filePath ), "UTF8" ) );
String line = "";

while ( ( line = reader.readLine() ) != null ) {
    System.out.println( line );  // Prints garbage characters 
}

重点是用户选择要读取的文件,因此它可以是任何编码,并且由于我无法检测到文件编码,我使用“UTF8”对其进行解码,但如上例所示,它无法没看错。

有没有办法以正确的方式读取这些奇怪的文件?或者至少我可以检测我的代码是否无法正确读取?

【问题讨论】:

    标签: java text-files bufferedreader fileinputstream


    【解决方案1】:

    您在 InputStreamReader 构造函数中使用 UTF-8 作为编码,因此它将尝试将字节解释为 UTF-8 而不是 UCS-LE。这是文档:Charset

    我想你需要根据它使用UTF-16LE。

    以下是有关支持的字符集及其 Java 名称的更多信息: Supported Encodings

    【讨论】:

    • 非常感谢。如我的问题所述,主要问题是这不是唯一使用的文本文件。用户选择要读取的文件,它可以有任何编码,那么“UTF-16LE”会读取任何编码的文本文件吗?
    • 没有万无一失的方法,但试一试:juniversalchardet
    【解决方案2】:

    您在 InputStreamReader 中提供了错误的编码。如果 UTF8,您是否尝试过使用 UTF-16LE 代替?

    BufferedReader reader = new BufferedReader( new InputStreamReader( new FileInputStream( filePath ), "UTF-16LE" ) );
    

    根据Charset

    UTF-16LE 十六位 UCS 转换格式,小端字节 顺序

    【讨论】:

      【解决方案3】:

      您不能对所有文件都使用 UTF-8 编码,尤其是在您不知道应该采用哪种文件编码的情况下。使用可以在读取文件之前检测文件编码的库,例如:juniversalchardetjChardet

      欲了解更多信息,请参阅Java : How to determine the correct charset encoding of a stream

      【讨论】:

      • 这个。如果您不知道字符集,则必须尝试检测它。 ICU4J 是另一个您可以尝试的库。
      猜你喜欢
      • 2016-04-07
      • 1970-01-01
      • 2014-04-19
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-08-21
      相关资源
      最近更新 更多