我已经阅读了一段时间的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控制台查看输出。
答案 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工具输出窗口的属性:
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或类似的单字节字符集。