繁体   English   中英

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

[英]Reading any text file having strange encoding?

我有一个带有奇怪编码“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”对其进行解码,但如上例所示,它无法正确读取。

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

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

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

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

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

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

根据Charset说法:

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

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

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM