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

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


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

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

1个回答

5

有两种可能性:

  • Java在输出文件时使用了错误的编码。
  • 文件实际上是正确的,而您用来显示文件的工具正在使用错误的编码。

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

  • Figure out why Java has the got default locale and encoding "wrong" and remedy that. It will be something to do with your operating system's locale settings ...

  • Read this FAQ for details on how you can override the default locale settings at the command line.

  • Use a PrintWriter constructor that specifies the encoding explicitly so that your application doesn't rely on the default encoding. For example:

    PrintWriter pw = new PrintWriter("filename", "ISO-8859-1");
    
针对这条评论的回复:
Don't PrintWriters all have the bug that you can't know you had an error with them?
  • 这不是一个错误,而是一种设计特性。
  • 你可以知道是否有错误发生,只是无法知道具体是什么错误。
  • 如果你不喜欢这个特性,可以使用 Writer
他们不会因为你试图向它们传递无法适应指定编码的代码点而引发异常或返回失败。我认为普通的Writer也不会......除非你专门构造它来执行此操作。正常行为是用特定字符替换任何未映射的代码点,虽然这在JavaDocs中没有说明(如果我记得清楚的话)。
它们甚至告诉你文件系统是否已满吗?我记得他们没有。
这是真的。但是:
  • 对于你通常使用PrintWriter写入的文件类型,这不是一个关键问题。

  • 如果这是一个关键问题,并且你仍然想使用PrintWriter,你可以随时调用checkError()(如果我记得正确)来查看是否有错误发生。

我总是以明确的Charset.forName("UTF-8").newEncoder()作为第二个参数编写我的OutputStreamWriter构造函数。这有点繁琐,也许有更好的方法。
我不知道。

2
有没有办法让Java输出正确的文件?这样我们就可以确信了! - user265767
所有的 PrintWriter 都有一个 bug,你无法知道它们是否出错。如果你试图将一个无法适应指定编码的代码点推送到它们那里,它们不会引发异常或返回失败。它们甚至不会告诉你文件系统是否已满;我似乎记得它们不会。我总是以显式的 Charset.forName("UTF-8").newEncoder() 作为第二个参数编写我的输出 OutputStreamWriter 构造函数。这有点繁琐,也许有更好的方法。 - tchrist

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接