如何使用 Java 将 Unicode 符号 U+2610 和 U+2612 打印到 Windows 控制台?
How to print Unicode symbols U+2610 and U+2612 to Windows console with Java?
我的工作:
public class Main {
public static void main(String[] args) {
char i = 0x25A0;
System.out.println(i);
i = 0x2612;
System.out.println(i);
i = 0x2610;
System.out.println(i);
}
}
我在 IDE 中得到了什么:
What I get in IDE
我在 Windows 控制台中得到了什么:
What I get in Windows console
我有 Windows 10(俄罗斯语言环境),控制台默认编码为 Cp866,IDE 中为 UTF-8 编码。
如何让控制台中的字符看起来正确?
您确定您使用的字体具有显示 Unicode 的字符吗?没有字体支持所有可能的 Unicode 字符。例如,U+9744、9632 和 9746 不受支持。 Arial 字体。您可以更改 IDE 控制台和 Windows 控制台的字体。
实际上这里有两个问题:
Java 将输出转换为其默认编码,通常与控制台编码没有任何关系。这显然只能在 VM 启动时被覆盖,例如
java -Dfile.encoding=UTF-8 MyClass
控制台 window 必须使用 TrueType 字体才能显示 Unicode。但是,Consolas 和 Lucida Console 都没有 ☐ 或 ☒。所以它们显示为带有 Lucida Console 的方框和带有 Consolas 的问号方框(即 missing glyph glyph)。输出仍然很好,你可以很容易地 copy/paste 它,只是看起来不对,而且由于 Windows 控制台不使用字体替换(无论如何用字符网格很难做到这一点) ,您几乎无能为力让它们出现。
我可能只会使用 [█]
、[ ]
和 [X]
。
Cp866 default coding in console
嗯,是的。代码页 866 不包含字符 U+25A0、U+2610 或 U+2612。因此,即使 Java 为控制台使用了正确的编码(要么是因为您设置了类似 -Dfile.encoding=cp866
的内容,要么是它猜测了正确的编码,但它几乎从不管理),您也无法获取字符出。
How to make characters in console look correct?
你不能。
理论上您可以使用 -Dfile.encoding=utf-8
,并将控制台编码设置为 UTF-8(或足够接近,代码页 65001)。不幸的是,Windows 控制台因多字节编码而损坏(除了传统的区域设置默认支持的编码,UTF-8 不支持);你会得到乱码输出并挂在输入上。这种方法通常是行不通的。
让 Unicode 进入 Windows 控制台的唯一可靠方法是跳过 Java 使用的基于字节的 C 标准库 I/O 函数,直接进入Win32 本机 WriteConsoleW 接口,它接受 Unicode 字符(嗯,UTF-16 代码单元,与 Java 字符串相同),因此避免了字节转换中的控制台错误。您可以使用 JNA 访问此 API——请参阅此问题中的示例代码:Java, UTF-8, and Windows console 尽管如果您想让它在命令管道的控制台字符输出和常规字节输出之间切换,则需要一些额外的繁琐工作.
然后然后你必须希望用户有非光栅字体(正如@Joey提到的),然后然后你必须希望字体有你想要的字符的字形(Consolas 不支持 U+2610 或 U+22612)。除非您真的必须这样做,否则让 Windows 控制台执行 Unicode 很大程度上是在浪费您的时间。
我的工作:
public class Main {
public static void main(String[] args) {
char i = 0x25A0;
System.out.println(i);
i = 0x2612;
System.out.println(i);
i = 0x2610;
System.out.println(i);
}
}
我在 IDE 中得到了什么: What I get in IDE
我在 Windows 控制台中得到了什么: What I get in Windows console
我有 Windows 10(俄罗斯语言环境),控制台默认编码为 Cp866,IDE 中为 UTF-8 编码。 如何让控制台中的字符看起来正确?
您确定您使用的字体具有显示 Unicode 的字符吗?没有字体支持所有可能的 Unicode 字符。例如,U+9744、9632 和 9746 不受支持。 Arial 字体。您可以更改 IDE 控制台和 Windows 控制台的字体。
实际上这里有两个问题:
Java 将输出转换为其默认编码,通常与控制台编码没有任何关系。这显然只能在 VM 启动时被覆盖,例如
java -Dfile.encoding=UTF-8 MyClass
控制台 window 必须使用 TrueType 字体才能显示 Unicode。但是,Consolas 和 Lucida Console 都没有 ☐ 或 ☒。所以它们显示为带有 Lucida Console 的方框和带有 Consolas 的问号方框(即 missing glyph glyph)。输出仍然很好,你可以很容易地 copy/paste 它,只是看起来不对,而且由于 Windows 控制台不使用字体替换(无论如何用字符网格很难做到这一点) ,您几乎无能为力让它们出现。
我可能只会使用 [█]
、[ ]
和 [X]
。
Cp866 default coding in console
嗯,是的。代码页 866 不包含字符 U+25A0、U+2610 或 U+2612。因此,即使 Java 为控制台使用了正确的编码(要么是因为您设置了类似 -Dfile.encoding=cp866
的内容,要么是它猜测了正确的编码,但它几乎从不管理),您也无法获取字符出。
How to make characters in console look correct?
你不能。
理论上您可以使用 -Dfile.encoding=utf-8
,并将控制台编码设置为 UTF-8(或足够接近,代码页 65001)。不幸的是,Windows 控制台因多字节编码而损坏(除了传统的区域设置默认支持的编码,UTF-8 不支持);你会得到乱码输出并挂在输入上。这种方法通常是行不通的。
让 Unicode 进入 Windows 控制台的唯一可靠方法是跳过 Java 使用的基于字节的 C 标准库 I/O 函数,直接进入Win32 本机 WriteConsoleW 接口,它接受 Unicode 字符(嗯,UTF-16 代码单元,与 Java 字符串相同),因此避免了字节转换中的控制台错误。您可以使用 JNA 访问此 API——请参阅此问题中的示例代码:Java, UTF-8, and Windows console 尽管如果您想让它在命令管道的控制台字符输出和常规字节输出之间切换,则需要一些额外的繁琐工作.
然后然后你必须希望用户有非光栅字体(正如@Joey提到的),然后然后你必须希望字体有你想要的字符的字形(Consolas 不支持 U+2610 或 U+22612)。除非您真的必须这样做,否则让 Windows 控制台执行 Unicode 很大程度上是在浪费您的时间。