尽管已正确配置终端

时间:2016-06-26 19:52:19

标签: java unicode cygwin

我试图在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
?

1 个答案:

答案 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'

适用于交互式使用。