【问题标题】:Displaying special characters显示特殊字符
【发布时间】:2011-10-28 15:18:15
【问题描述】:

在 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 字符显示问题。

谁能帮我理解这个问题,我该如何解决?

【问题讨论】:

    标签: java unicode


    【解决方案1】:

    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 > Preferences > General > Workspace > Text File Encoding 来做到这一点。

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

    另见:

    【讨论】:

    • 感谢 BalusC,但是您的更改也会将我的内容弄乱到写入的输出文件中。我在 Eclipse 中更改了字符集,但输入文件中的内容仍然不一样。我错过了什么?
    • 那么原始文件显然没有以UTF-8保存。
    • 嗯,我以前做过。也许,这就是为什么它显示完全相同的内容而不会弄乱它的原因。
    • 对不起,你是对的。输入文件是 Unicode 格式,而不是 UTF-8。
    • UTF-8 是一种 种类 的 unicode 格式。你的意思是输入文件保存为UTF-16?
    【解决方案2】:

    尝试使用 OutputStreamWriter 代替 FileWriter 并指定输出的编码。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-12-27
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多