5

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

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

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

4

1 回答 1

5

有两种可能:

  • Java 在输出文件时使用了错误的编码。
  • 该文件实际上是正确的,并且您用来显示该文件的任何内容都使用了错误的编码。

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

  • 找出为什么Java 有默认的语言环境和编码“错误”并纠正它。这将与您的操作系统的语言环境设置有关...

  • 阅读此常见问题解答以了解有关如何在命令行覆盖默认区域设置的详细信息。

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

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

针对此评论:

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

  • 这不是错误,而是设计功能。
  • 您可以找出是否有错误。你只是无法找出它是什么。
  • 如果你不喜欢它,你可以用它Writer来代替。

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

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

他们甚至会告诉您文件系统是否已满?我似乎记得他们没有。

那是真实的。然而:

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

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

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

我不知道。

于 2011-09-08T00:12:13.573 回答