Java程序无法打印西里尔字母,只能显示问号

3

我的代码(Qwe.java)

public class Qwe {
    public static void main(String[] args) {
        System.out.println("тест привет");
    }
}

在哪里

你好测试

是俄语单词 Qwe.java使用UTF-8编码 在我的机器上(ubuntu 14.04)的结果是

你好测试

在服务器上(ubuntu 12.04)我有:

???? ??????

$java Qwe > test.txt 在test.txt中看到

???? ??????


我最好的猜测是它无法中断单词,因此只会输出垃圾。 - jgr208
System.out.println("тест"); 的结果是一样的吗?- ???? - user1182583
3个回答

1

我解决了这个问题,只需使用export JAVA_TOOL_OPTIONS=-Dfile.encoding=UTF8


0

我不确定,但它可能只接受英语语言中的ASCII字符,除非你有一些扩展或其他东西。但像我说的,我的最佳猜测是它找不到字符,只是在它们的位置输出垃圾。

"Java,任何未知字符通过OutputStream的write()方法传递将被打印为普通问号“?”"

取自此处


0

Java源代码必须使用与javac编译器相同的编码。这似乎已经是这种情况了,UTF-8当然是理想的。

文件Qwe.class很好,内部使用Unicode进行字符串处理。控制台输出使用服务器平台编码。也就是说,Java将Unicode文本转换为字节,可能使用默认(平台)编码,而该编码无法处理西里尔文。

因此,您必须写入文件,永远不要使用FileWriter(仅用于本地文件的实用程序类),而要使用:

... new OutputStreamWriter(new FileOutputStream(file), "UTF-8")

你也可以在服务器上设置用户区域设置,但那不是我的事。

一般来说,我会切换到文件记录器。


@user1182583 在log4j中,必须将encoding参数设置为UTF-8。请参见http://rhythmcloud.blogspot.de/2009/10/set-character-encoding-to-log4js-file.html。 - Joop Eggen
是的,那是真的。我从来没有处理过Java Unicode。但我基本上知道输出是显示未知字符。 - jgr208
现在我使用新的PrintStream(System.out, true, "UTF-8").println,但我不明白为什么在我的Ubuntu上System.out正常工作,而在服务器Ubuntu上却看到问号。 - user1182583
@jgr208 很可能就像你所说的那样,Linux的语言环境是LC_POSIX或者类似的,而且编码只能表示ASCII。可以使用Linux shell命令locale -a来检查。 - Joop Eggen
@user1182583 我怀疑尝试使用不同的编码方式向System.out写入内容是无效的。操作系统必须正确地表示它。如果操作系统使用Latin-1编码,那么任何东西都无法正确地表示Cyrillic字符集。抱歉。 - Joop Eggen
显示剩余4条评论

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接