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

时间:2011-05-11 13:38:14

标签: java utf-8 cjk

我已经阅读了一段时间的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控制台查看输出。

4 个答案:

答案 0 :(得分:16)

System.out.println(sb);

问题在于以上几行。这将使用默认系统编码对字符数据进行编码,并将数据发送到STDOUT。在许多系统中,这是一个有损耗的过程。

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

唯一支持的更改默认系统编码的机制是通过操作系统。 (有些人建议使用file.encoding系统属性,但这是not supported,可能会产生意想不到的副作用。)您可以将setOut用于自己的自定义PrintStream

PrintStream stdout = new PrintStream(System.out, autoFlush, encoding);

您可以通过Run configuration更改Eclipse控制台编码。

您可以在我的博客上找到一些关于该主题的帖子 - 通过我的个人资料。

答案 1 :(得分:5)

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

  • 字体是Arial Unicode MS
  • 脚本是Hangul

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);
    }
}

工具输出是:

가다こんにちは

答案 2 :(得分:4)

是的,您需要按照how-to-display-chinese-character-in-eclipse-console文章

中的说明更改Eclipse控制台的编码

答案 3 :(得分:2)

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

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