我的所作所为:
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默认编码在控制台,UTF-8编码在IDE中。 如何让控制台中的字符看起来正确?
答案 0 :(得分:2)
实际上有两个问题:
Java将输出转换为默认编码,通常与控制台编码无关。这显然只能在VM启动时被覆盖,例如
java -Dfile.encoding=UTF-8 MyClass
控制台窗口必须使用TrueType字体才能显示Unicode。但是,Consolas和Lucida Console都没有☐或☒。因此,它们显示为带有Lucida控制台的框和带有Consolas问号的框(即缺少字形字形)。输出仍然很好,您可以轻松地复制/粘贴它,它看起来不正确,并且由于Windows控制台不使用字体替换(无论如何都很难用字符网格),那么& #39;你可以做的很少让他们出现。
我可能只是使用[█]
,[ ]
和[X]
。
答案 1 :(得分:1)
好吧,是的。代码页866不包括字符U + 25A0,U + 2610或U + 2612。因此,即使Java正在为控制台使用正确的编码(或者因为你设置了类似Cp866在控制台中默认编码
-Dfile.encoding=cp866
的东西,或者它猜到了它几乎从不管理的正确编码),你就无法将字符输出。
如何让控制台中的字符看起来正确?
你不能。
理论上,您可以使用-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很大程度上是浪费你的时间。
答案 2 :(得分:0)
您确定使用的字体是否包含显示Unicode的字符?没有字体支持每个可能的Unicode字符。例如,U + 9744,9632和9746不受支持。 Arial字体。您也可以更改IDE控制台和Windows控制台的字体。