7

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

使用 NotePad++ 打开文本文件

正如您在上面的屏幕截图中看到的,文件内容在 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”对其进行解码,但如上例所示,它无法正确读取.

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

4

3 回答 3

7

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

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

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

于 2013-03-19T22:34:59.200 回答
1

您在InputStreamReader. 如果 UTF8,您是否尝试过使用 UTF-16LE 代替?

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

根据Charset

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

于 2013-03-19T22:34:28.673 回答
1

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

有关更多信息,请参阅Java:如何确定流的正确字符集编码

于 2013-03-19T22:52:21.343 回答