显示特殊字符

时间:2011-10-28 15:18:15

标签: java unicode

在Windows控制台上显示特殊字符时遇到问题。

我写了以下代码:

public static void main(String[] args) throws IOException {
    File newFile = new File("sampleInput.txt");
    File newOutFile = new File("sampleOutput.txt");

    FileReader read = new FileReader(newFile);
    FileWriter write = new FileWriter(newOutFile);
    PushbackReader reader = new PushbackReader(read);
    int c;

    while ((c = reader.read()) != -1)
    {
        write.write(c);
    }
    read.close();
    write.close();

}

输出文件看起来正是输入文件包含特殊字符的内容。即对于输入文件© Ø ŻƩ abcdefĦ中的内容,输出文件包含完全相同的内容。但是当我添加行System.out.printf("%c", (char) c)时,控制台上的内容为:ÿþ©(包含更多字符,但我无法在此处复制粘贴)。我确实读过这个问题可能与Windows控制台字符集有关,但无法找到解决方法。

考虑到输出媒体可以是未来的任何内容,我不希望遇到任何类型的out流的Unicode字符显示问题。

任何人都可以帮我理解这个问题,我该如何解决?

2 个答案:

答案 0 :(得分:5)

ReaderWriter将使用平台默认字符集将字符转换为字节。在您的环境中,显然不是像UTF-8那样的Unicode兼容字符集。

您需要InputStreamReaderOutputStreamWriter,其中您可以明确指定字符集。

Reader read = new InputStreamReader(new FileInputStream(newFile), "UTF-8"));
Writer write = new OutputStreamWriter(new FileOutputStream(newOutFile), "UTF-8"));
// ...

此外,控制台需要配置为使用UTF-8来显示字符。例如,Eclipse可以通过 Window>来实现。偏好>一般>工作区>文本文件编码

在命令提示符控制台中,由于缺少支持这些字符的字体,因此无法显示这些字符。您想要采用类似Swing的UI控制台方法。

另见:

答案 1 :(得分:1)

而不是FileWriter尝试使用OutputStreamWriter并指定输出的编码。