我试图在Cygwin中运行的Java应用程序中打印Unicode block character。尽管终端设置为UTF-8,尽管Bash和Python能够打印字符,但Java只打印?
。
$ echo $LANG
en_US.UTF-8
$ echo -e "\xe2\x96\x88"
█
$ python3 -c 'print("\u2588")'
█
$ cat Block.java
public class Block {
public static void main(String[] args) {
System.out.println('\u2588');
}
}
$ javac Block.java
$ java -cp . Block
?
这似乎是Cygwin特有的,因为从cmd运行时会显示字符:
>java -cp . Block
█
我能做些什么来让Cygwin / mintty正确呈现Java的输出吗?
更新:
看来Windows / Cygwin上的Java实际上并没有使用LANG
环境变量,因此实际上仍在使用cp1252:
$ cat Block.java
public class Block {
public static void main(String[] args) {
System.out.println("Default Charset=" + java.nio.charset.Charset.defaultCharset());
System.out.println("\u2588");
}
}
$ java -cp . Block
Default Charset=windows-1252
?
但奇怪的是我无法让iconv
工作:
$ java -cp . Block | iconv -f WINDOWS-1252 -t UTF8
Default Charset=windows-1252
?
答案 0 :(得分:0)
据我所知,由于Windows上的Java不使用任何环境变量来确定默认编码,因此无法让java
尊重Cygwin的字符集。
您可以使用JAVA_TOOL_OPTIONS
动态地向java
调用添加标志,但这会导致java
打印我不想拥有的调试信息。
$ JAVA_TOOL_OPTIONS='-Dfile.encoding=UTF-8' java -cp . Block
Picked up JAVA_TOOL_OPTIONS: -Dfile.encoding=UTF-8
Default Charset=UTF-8
█
另一种选择是使用别名:
alias javac='javac -encoding UTF-8'
alias java='java -Dfile.encoding=UTF-8'
适用于交互式使用。