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

Twi*_*mes 12 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);
Run Code Online (Sandbox Code Playgroud)

输出显示CJK字符为'???'.一个is.getEncoding()确认它肯定使用UTF-8的电话.我错过了让角色正确显示的步骤?如果它有所不同,我正在使用Eclipse控制台查看输出.

McD*_*ell 16

System.out.println(sb);
Run Code Online (Sandbox Code Playgroud)

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

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

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

PrintStream stdout = new PrintStream(System.out, autoFlush, encoding);
Run Code Online (Sandbox Code Playgroud)

您可以通过" 运行"配置更改Eclipse控制台编码.

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

  • @Twicetimes - 这实际上更好,但这是它可以变得棘手的地方.在我的系统上,尽管使用了不支持中文字母的_Courier New_,但字体替换用于渲染中文字符串.我相信Windows上的SWT使用Uniscribe,因此您可能需要阅读Win32 API以了解这是如何发生的.您可能没有安装正确的字体组合.你可以[切换字体](http://help.eclipse.org/helios/topic/org.eclipse.platform.doc.user/reference/ref-fonts.htm)到[支持]代码点的地方( http://en.wikipedia.org/wiki/Character_Map). (2认同)

Ed *_*oor 5

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

  • 字体是Arial Unicode MS
  • 这个脚本是韩文

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);
    }
}
Run Code Online (Sandbox Code Playgroud)

工具输出是:

가다こんにちは