我有一个带有奇怪编码“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”对其进行解码,但如上例所示,它无法读得对。
有没有以正确的方式阅读这些奇怪的文件?或者至少可以检测出我的代码是否无法正确阅读?
答案 0 :(得分:7)
您在InputStreamReader构造函数中使用UTF-8作为编码,因此它会尝试将字节解释为UTF-8而不是UCS-LE。以下是文档:Charset
我想你需要根据它使用UTF-16LE。
以下是有关受支持的字符集及其Java名称的更多信息: Supported Encodings
答案 1 :(得分:1)
您在InputStreamReader
中提供了错误的编码。您是否尝试使用UTF-16LE而不是UTF8?
BufferedReader reader = new BufferedReader( new InputStreamReader( new FileInputStream( filePath ), "UTF-16LE" ) );
根据Charset
:
UTF-16LE 16位UCS转换格式,little-endian字节 为了
答案 2 :(得分:1)
您不能对所有文件使用UTF-8编码,尤其是在您不知道期望哪种文件编码的情况下。在您阅读文件之前使用可以检测文件编码的库,例如:juniversalchardet或jChardet
有关详细信息,请参阅Java : How to determine the correct charset encoding of a stream