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

时间:2011-09-08 00:05:15

标签: java encoding printwriter

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

PrintWriter printer = new PrintWriter(new FileOutputStream(new File("products.txt")));

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

1 个答案:

答案 0 :(得分:5)

有两种可能性:

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

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

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

  • 阅读this FAQ,了解有关如何在命令行覆盖默认语言环境设置的详细信息。

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

    PrintWriter pw = new PrintWriter("filename", "ISO-8859-1");
    

回应此评论:

  

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

  • 这不是一个错误,它是一个设计功能。
  • 您可以查看是否有错误。你无法弄清楚它是什么。
  • 如果您不喜欢,可以改用Writer
  

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

我认为不会定期Writer ......除非你专门构建它以做到这一点。正常行为是用特定字符替换任何不可映射的代码点,尽管在javadocs(IIRC)中没有指定。

  

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

这是事实。但是:

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

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

    < / LI>
  

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

我不知道。