BufferedWriter 保存到新文件时输出奇怪的字符

Posted

技术标签:

【中文标题】BufferedWriter 保存到新文件时输出奇怪的字符【英文标题】:BufferedWriter outputting strange characters when saved to new file 【发布时间】:2018-05-31 08:17:26 【问题描述】:

我正在使用以下代码逐行处理一个大文本文件。问题是我使用的是英语以外的语言,准确地说是克罗地亚语。许多字符在输出文件中显示为 �。我该如何解决这个问题?

该文件采用 ANSI 格式,但这似乎不是与 InputStreamReader 兼容的编码类型。我应该将原始文件保存为哪种编码类型?

try (BufferedWriter bw = new BufferedWriter(new FileWriter(FILENAME))) 

 String line;
 try 
  try (
   InputStream fis = new FileInputStream("C:\\Users\\marti\\Documents\\Software Projects\\Java Projects\\TwitterAutoBot\\src\\main\\resources\\EH.Txt"); InputStreamReader isr = new InputStreamReader(fis, Charset.forName("UTF-8")); BufferedReader br = new BufferedReader(isr);
  ) 
   while ((line = br.readLine()) != null) 
    // Deal with the line

    String content = line.substring(line.lastIndexOf("  ") + 1);
    System.out.println(content);

    bw.write("\n\n" + content);

   
  
  catch (IOException e) 
  e.printStackTrace();
 

 // bw.close();

 catch (IOException e) 

 e.printStackTrace();


【问题讨论】:

您的输入文件使用什么编码? @GregKopff 它在 ANSI 中。 @MartinErlic 如果是ANSI为什么你在代码中指定了UTF-8? --- 如果是ANSI,那是extended ANSI的哪个味道? 因为我没有事先检查文件的字符编码! 但是,ANSI 不是 InputStreamReader 中可识别的编码类型。有人建议使用US-ASCII,但这也不起作用,会产生同样奇怪的字符。也没有将文件保存为 UTF-8,因为我丢失了翻译。 【参考方案1】:

我通过使用Cp1252 而不是UTF-8 进行编码解决了这个问题,因为文件是在ANSI 中编码的。

【讨论】:

【参考方案2】:

您需要使用带有CharsetInputStreamReader/OutputStreamWriter 构造函数。您正在使用的构造函数使用您平台的默认字符集,这显然不是您所需要的。

如果您使用的是 Java 8 或更高版本,您可以使用Files 中的一种便捷方法:

Files.newBufferedReader

Files.newBufferedWriter

您需要确保使用正确的字符集读取输入文件,并以支持您尝试写入的字符的字符集写入文件。 UTF-8 是一种合适的输出文件格式。

【讨论】:

以上是关于BufferedWriter 保存到新文件时输出奇怪的字符的主要内容,如果未能解决你的问题,请参考以下文章

JDK源码:BufferedWriter

Java 输出文件通过 BufferedWriter.newline() 方法换行

如何将变量保存到新的文本文件中,以便下次程序运行时加载这些变量?

C++ 排序奇升偶降链表

从文件夹中读取所有图像并检测人脸,裁剪并保存到新文件夹

Java - 使用 BufferedWriter 和 BufferedReader,[重复]