读取任何具有奇怪编码的文本文件?

7
我有一个包含奇怪编码“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"进行解码,但与上面的示例一样,它无法正确读取。是否有方法以正确的方式读取这些奇怪的文件?或者至少可以检测到我的代码将无法正确读取它吗?
3个回答

7
您在InputStreamReader构造函数中使用UTF-8作为编码,因此它将尝试将字节解释为UTF-8而不是UCS-LE。这里是文档:Charset
我认为根据它所述,您需要使用UTF-16LE编码。
以下是有关支持的字符集及其Java名称的更多信息:支持的编码

非常感谢。根据我的问题描述,主要问题是这不是唯一使用的文本文件。用户选择要读取的文件,并且它可以具有任何编码,那么"UTF-16LE"会读取任何具有任何编码的文本文件吗? - Brad
没有百分之百的保证,但你可以试试看:juniversalchardet - tempoc

1
您在InputStreamReader中提供了错误的编码方式。您是否尝试使用UTF-16LE代替UTF8?
BufferedReader reader = new BufferedReader( new InputStreamReader( new FileInputStream( filePath ), "UTF-16LE" ) );

根据字符集的说法:

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


1

如果你不知道字符集,你必须尝试检测它。ICU4J是另一个你可以尝试的库。 - james.garriss

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接