未在Java中显示UTF-8 CJK字符

未在Java中显示UTF-8 CJK字符,java,utf-8,cjk,Java,Utf 8,Cjk,我阅读Unicode和UTF-8编码已经有一段时间了,我想我理解了,所以希望这不是一个愚蠢的问题: 我有一个文件,其中包含一些CJK字符,并已保存为UTF-8。我安装了各种亚洲语言包,其他应用程序可以正确地呈现字符,所以我知道很多东西都很有用 在我的Java应用程序中,我读取文件如下: // Create objects fis = new FileInputStream(new File("xyz.sgf")); InputStreamReader is = new InputStreamRe

我阅读Unicode和UTF-8编码已经有一段时间了,我想我理解了,所以希望这不是一个愚蠢的问题:

我有一个文件,其中包含一些CJK字符,并已保存为UTF-8。我安装了各种亚洲语言包,其他应用程序可以正确地呈现字符,所以我知道很多东西都很有用

在我的Java应用程序中,我读取文件如下:

// Create objects
fis = new FileInputStream(new File("xyz.sgf"));
InputStreamReader is = new InputStreamReader(fis, Charset.forName("UTF-8"));
BufferedReader br = new BufferedReader(is);

// Read and display file contents
StringBuffer sb = new StringBuffer();
String line;
while ((line = br.readLine()) != null) {
    sb.append(line);
}
System.out.println(sb);

输出将CJK字符显示为“??”。调用is.getEncoding()可以确认它确实在使用UTF-8。我缺少哪一步来正确显示角色?如果有区别,我将使用Eclipse控制台查看输出。

根据您的平台,您的控制台(或windows CMD)很可能不支持或使用UTF-8字符集,因此会将所有不可映射的字符转换为问号


例如,在Windows上,CMD几乎总是使用WIN1252或类似的单字节字符集

是的,您需要更改Eclipse控制台的编码,如本文所述

问题就在上面这一行。这将使用默认系统编码对字符数据进行编码,并将数据发送到标准输出。在许多系统上,这是一个有损过程

如果更改默认值,
System.out
使用的编码和控制台使用的编码必须匹配

唯一受支持的更改默认系统编码的机制是通过操作系统。(有些人会建议使用
file.encoding
系统属性,但这是并且可能会产生意外的副作用。)您可以使用自己的自定义
打印流

PrintStream stdout = new PrintStream(System.out, autoFlush, encoding);
您可以通过更改Eclipse控制台编码


您可以通过我的个人资料在我的博客上找到许多关于这个主题的帖子。

以下程序使用TextPad将CJK字符打印到控制台。要查看韩语韩语和日语平假名,我必须告诉Java将打印流的编码更改为EUC_KR,并设置TextPad的工具输出窗口的属性:

  • 字体为Arial Unicode MS
  • 剧本是韩文的


刀具输出为:


가다 こんにちは

是的,我不希望Windows cmd能正确显示它们,但我认为Eclipse会这样做。如果这确实是问题的根源,那么其他人是否可以验证Eclipse在其控制台中没有正确显示某些Unicode字符?我还能在哪里显示程序的输出以测试它是否正常工作?@Twicetimes:将输出导入一个文件,并用一个支持UTF-8的编辑器打开该文件。@Christoffer Hammarström-谢谢你的建议。我使用指定了UTF-8字符集的OutputStreamWriter将字符串直接写回一个文件,结果文件在另一个应用程序中正确显示了字符,所以我想一切都很好。一定是Eclipse控制台引发了我。您使用的IDE(Netbeans、Eclipse等)是什么?我以前用阿拉伯语字符尝试过,但我遇到了相同的问题。但当我放一个喙尖并检查绳子时,我看到绳子显示正确。我把它打印在一个文件里,还可以。谢谢你的确认。进一步的测试已经证实这只是我的Eclipse配置的问题。非常有用,谢谢。不幸的是,我还不能投票支持这个答案,因为我的声誉不够高。我已经将运行配置更改为使用UTF-8,并且我插入了一个定制的PrintStream,如下所示:“PrintStream utfout=new PrintStream(System.out,false,“UTF-8”);系统放样(utfout);',但是这些字符仍然不能在Eclipse控制台窗口中正确显示。奇怪的是,它们已经从显示为“?”变成了一个方形块,所以发生了一些事情。只是不确定是什么。@Twicetimes-这实际上更好,但这是它可能变得棘手的地方。在我的系统中,尽管使用了Courier New,它不支持中文字形,但字体替换用于呈现中文字符串。我相信Windows上的SWT使用Uniscribe,所以您可能需要阅读Win32 API来了解这是如何发生的。您可能只是没有安装正确的字体组合。你可以去一个有代码点的地方。谢谢。只是在控制台输出中尝试了几种不同的字体,“Lucida Sans Unicode”就成功了。我没有意识到某些字体不会包含某些表意文字——我认为这一切都和编码有关。考虑我受过教育。
PrintStream stdout = new PrintStream(System.out, autoFlush, encoding);
import java.io.PrintStream;
import java.io.UnsupportedEncodingException;

class Hangul {

    public static void main(String[] args)  throws Exception {

        // Change console encoding to Korean

        PrintStream out = new PrintStream(System.out, true, "EUC_KR");
        System.setOut(out);

        // Print sample to console

        String go_hello  = "가다 こんにちは";
        System.out.println(go_hello);
    }
}