ISO 8859-1用Java程序打印的文件编码

use*_*767 5 java encoding printwriter

我编写了一个实现文件结构的程序,程序根据结构打印出一个产品文件.产品名称包括字母Æ,Ø和Å.这些字母在输出文件中无法正确显示.我用

PrintWriter printer = new PrintWriter(new FileOutputStream(new File("products.txt")));
Run Code Online (Sandbox Code Playgroud)

IS0 8859 - 1或Windows ANSI(CP 1252)是实现需要的字符集.

Ste*_*n C 5

有两种可能性:

  • 输出文件时,Java使用了错误的编码.
  • 该文件实际上是正确的,无论您使用什么来显示该文件使用错误的编码.

假设问题是第一个问题,根本原因是Java已经发现平台的默认编码不是您想要/期望的编码.有三种方法可以解决这个问题:

  • 弄清楚为什么 Java有默认的语言环境和编码"错误"并解决了这个问题.这将与您的操作系统的区域设置有关...

  • 有关如何在命令行覆盖默认语言环境设置的详细信息,请阅读此常见问题解答.

  • 使用PrintWriter明确指定编码的构造函数,以便您的应用程序不依赖于默认编码.例如:

    PrintWriter pw = new PrintWriter("filename", "ISO-8859-1");
    
    Run Code Online (Sandbox Code Playgroud)

回应此评论:

不要PrintWriters都有你不知道你有错误的错误吗?

  • 它不是一个bug,它是一个设计功能.
  • 你可以找出是否有错误.你只是无法找出它是什么.
  • 如果你不喜欢它,你可以改用它Writer.

如果您尝试将代码点推送到不符合指定编码的代码点,则它们不会引发异常甚至返回失败.

无论是将常规Writer.我相信,除非你明确构建它这样做.正常行为是用特定字符替换任何不可映射的代码点,尽管这在javadocs(IIRC)中没有指定.

他们甚至会告诉你文件系统是否填满; 我似乎记得他们没有.

那是真实的.然而:

  • 对于通常使用PrintWriter此文件编写的文件类型,这不是一个关键问题.

  • 如果这是一个关键问题并且您仍然想要使用PrintWriter,您可以随时致电checkError() (IIRC)以查明是否存在错误.

我总是最后用显式的Charset.forName("UTF-8").newEncoder()第二个参数编写我的OutputStreamWriter构造函数.这有点乏味,所以也许有更好的方法.

我不知道.

  • 有没有办法让Java输出正确的文件?母猪我们可以肯定! (2认同)