在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字符显示问题。
任何人都可以帮我理解这个问题,我该如何解决?
答案 0 :(得分:5)
Reader
和Writer
将使用平台默认字符集将字符转换为字节。在您的环境中,显然不是像UTF-8那样的Unicode兼容字符集。
您需要InputStreamReader
和OutputStreamWriter
,其中您可以明确指定字符集。
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并指定输出的编码。