【问题标题】:Java can't display Unicode characters despite properly configured terminal尽管正确配置了终端,Java 仍无法显示 Unicode 字符
【发布时间】:2023-04-05 20:55:01
【问题描述】:

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

【问题讨论】:

    标签: java unicode cygwin


    【解决方案1】:

    据我所知,没有办法让 java 尊重 Cygwin 的字符集,因为 Windows 上的 Java 不使用任何环境变量来确定默认编码。

    您可以使用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'
    

    这对于交互式使用来说效果很好。

    【讨论】:

    • iconv 无济于事,因为 █ 首先不能在 windows-1252 中编码(而 java 将打印 ? 代替)
    • @roeland 为什么它在 (windows-1252) cmd 提示符下正确显示?
    • 因为某些程序使用 Windows 特定的功能来打印文本。无论您的代码页如何,WriteConsoleW(...) 都可以在控制台上打印任何 Unicode 文本。
    猜你喜欢
    • 2015-08-30
    • 1970-01-01
    • 2013-06-05
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-11-12
    • 2021-08-27
    • 2021-12-06
    相关资源
    最近更新 更多