2011-09-08 43 views
4

我编写一个实现文件结构的程序,该程序根据结构打印出一个产品文件。产品名称包括字母Æ,Ø和Å。这些字母在输出文件中没有正确显示。我使用ISO 8859-1在Java程序中打印的文件的编码

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

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

回答

5

有两种可能性:输出文件时

  • 的Java使用了错误的编码。
  • 该文件实际上是正确的,并且无论您用于显示该文件是使用错误的编码。

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

  • 图出来为什么 Java有得到默认的语言环境和编码“错误”和补救。这将与您的操作系统的区域设置有关...

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

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

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

在回应此评论:

不要PrintWriters都有,你可以不知道你有没有和他们一个错误的bug?

  • 这不是一个bug,它是一个设计特征。
  • 你可以看看是否有错误。你根本找不到它是什么。
  • 如果你不喜欢它,你可以使用Writer来代替。

他们不会引发异常或者即使你试图推他们一个码点可以不适合在指定的编码返回失败。

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

他们甚至告诉你,如果你的文件系统填满了;我似乎记得他们没有。

的确如此。但是:

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

  • 如果这是一个关键问题,并且您仍然想使用PrintWriter,则始终可以拨打checkError()(IIRC)以确定是否有错误。

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

我不知道。

+2

有什么办法让Java输出正确的文件?母猪我们可以肯定! – user265767

+0

@ user265767 - 阅读更新的答案 –

+0

不要'PrintWriter'都有错误,你不知道你有错误吗?他们不会引发异常甚至返回失败,如果您尝试在无法使用指定编码的情况下推送代码点。他们甚至会告诉你文件系统是否满了;我似乎记得他们没有。我总是用显式的'Charset.forName(“UTF-8”)。newEncoder()'第二个参数来写出我的'OutputStreamWriter'构造函数。这有点乏味,所以也许有更好的方法。 – tchrist