如何让eclipse在unicode中打印出奇怪的字符?

时间:2011-06-04 00:05:48

标签: java eclipse unicode special-characters

所以我试图让我的程序输出一个带有名单列表的文本文件。有些名字有奇怪的字符,例如Åström。

我已经从以“UTF-8”编码的网页中抓取了这些名称列表,或者至少我很确定它的确如此,因为页面来源说

  

“meta http-equiv =”Content-Type“content =”text / html; charset = UTF-8“/”

这是我到目前为止所尝试的:

public static void write(List<String> list) throws IOException  {
        Writer out = new OutputStreamWriter(new FileOutputStream("test.txt"), "UTF-8");
        try {
            for (int i=0;i<list.size();i++) {
                try {
                    byte[] utf8Bytes = list.get(i).getBytes("UTF-8");
                    out.write(new String(utf8Bytes, "UTF-8"));
                } catch (UnsupportedEncodingException e) {
                    e.printStackTrace();
                }

                out.write(System.getProperty("line.separator"));

            }
        }
        finally {
        out.close();
        }
    }

我有点困惑为什么它不起作用。我得到的输出是“Ã...ström”,这非常奇怪。

有人可以指出我正确的方向吗?谢谢!

在另一个不相关的说明中,除了笨重之外,是否有更简单的方法将新行写入文本文件

  

out.write(System.getProperty( “line.separator”));

我有吗?我在某个地方看到了网络并且它有效,但我只是想知道是否有更清洁的方式。

3 个答案:

答案 0 :(得分:19)

Eclipse > Preferences > General > Workspace > Text file encoding设置为UTF-8。

答案 1 :(得分:4)

内容确实是UTF-8,如果打印到控制台,它似乎没问题。可能导致该问题的是字符串的解码和编码,这是不必要的。而不是OutputStreamWriter尝试使用java.io.PrintWriter。它具有 println 方法,可以在最后用系统行分隔符打印出字符串。它看起来像是:

printStream.println(list.get(i));

此外,打开文件以查看它时尝试使用浏览器。它们允许您在打开后选择编码,以便您可以快速尝试多种编码以查看实际使用的内容。

答案 2 :(得分:1)

记事本不是一个功能特别丰富的编辑器。它将尝试猜测文档编码,有时使用unexpected results。 “纯文本”文档不带有关于其编码的任何元数据,这给它们带来了某些限制。 Windows应用程序(包括记事本)通常依赖于字节顺序标记(Java字符串中的U + FEFF或"\uFEFF")来确定编码是否为Unicode格式。这可能有助于记事本;它会对你的网页问题毫无用处。

HTML 4规范定义了how output encoding should be set。除了指定元编码外,还应设置Content-Type HTTP标头。

您没有在网络应用中提及您正在使用的内容。 servlet应设置内容类型setContentType("text/html; charset=UTF-8"); JSP应该使用page指令来做同样的事情。其他视图技术将提供类似的机制。


byte[] utf8Bytes = list.get(i).getBytes("UTF-8");
out.write(new String(utf8Bytes, "UTF-8"));

此代码执行一些无用的操作;它将字符数据从UTF-16转码为UTF-8,然后从UTF-8转换回UTF-16,然后将数据写入Writer(这将再次将UTF-16转码为UTF-8)。此代码是等效的:

String str = list.get(i);
out.write(str);

使用PrintWriter获取换行支持。


您可以在Java hereherehere中详细了解字符编码。