2013-03-19 100 views
4

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

Opening the text file using 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”对其进行解码,但是如上例所示,它无法正确读取。

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

回答

5

您使用UTF-8作为您的编码InputStreamReader构造函数,所以它会尝试将字节解释为UTF-8而不是UCS-LE。这里是文档:Charset

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

这里是所支持的字符集及其Java名称的详细信息: Supported Encodings

+0

非常感谢。正如我的问题所述,主要问题是这不是唯一使用的文本文件。用户选择要读取的文件,并且它可以有任何编码,那么“UTF-16LE”会读取任何具有任何编码的文本文件吗? – Brad 2013-03-19 22:41:11

+0

有没有一个绝对的方式,但给这个镜头:[juniversalchardet](https://code.google.com/p/juniversalchardet/) – tempoc 2013-03-19 22:51:38

0

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

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

根据Charset

UTF-16LE十六位UCS转换格式,小尾数字节 为了