如何打印Unicode符号U+;2610和U+;2612到使用Java的Windows控制台?

如何打印Unicode符号U+;2610和U+;2612到使用Java的Windows控制台?,java,windows,unicode,console,cyrillic,Java,Windows,Unicode,Console,Cyrillic,我所做的: 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中得到了什么:

我所做的:

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中得到了什么:

我在Windows控制台中获得的内容:

我有Windows10(俄罗斯地区),控制台中的Cp866默认编码,IDE中的UTF-8编码。
如何使console中的字符看起来正确?

您确定您使用的字体具有显示Unicode的字符吗?没有字体支持所有可能的Unicode字符。例如,Arial字体不支持U+97449632和9746。您也可以更改IDE控制台和Windows控制台的字体。

您确定您使用的字体具有显示Unicode的字符吗?没有字体支持所有可能的Unicode字符。例如,Arial字体不支持U+97449632和9746。您也可以更改IDE控制台和Windows控制台的字体。

实际上,这里有两个问题:

  • Java将输出转换为其默认编码,这通常和控制台编码无关。这显然只能在VM启动时被覆盖,例如

    java -Dfile.encoding=UTF-8 MyClass
    
  • 控制台窗口必须使用TrueType字体才能显示Unicode。但是,Console和Lucida Console都没有☐, 或☒. 因此,它们显示为带有Lucida控制台的方框,以及带有带有Consolas问号的方框(即缺少的标志符号)。输出仍然很好,您可以轻松地复制/粘贴它,只是看起来不太对劲,而且由于Windows控制台不使用字体替换(无论如何,使用字符网格很难做到这一点),因此您几乎无法让它们显示出来


  • 我可能只会使用
    [█]
    []
    [X]
    取而代之。

    这里实际上有两个问题:

  • Java将输出转换为默认编码,这通常和控制台编码无关

    java -Dfile.encoding=UTF-8 MyClass
    
  • console窗口必须使用TrueType字体才能显示Unicode。但是,ConsoleAS和Lucida console都没有☐, 或☒. 因此,它们显示为带有Lucida控制台的方框和带有问号的带有Console的方框(即缺少的字形)。输出仍然很好,您可以轻松复制/粘贴它,只是看起来不对劲,而且由于Windows控制台不使用字体替换(无论如何,使用字符网格很难做到这一点),你没办法让他们出现

  • 我可能只会使用
    [█]
    []
    ,和
    [X]

    Cp866控制台中的默认编码

    嗯,是的。代码页866不包含字符U+25A0、U+2610或U+2612。因此,即使Java对控制台使用了正确的编码(因为您设置了类似于-Dfile.encoding=cp866,或者它猜测了正确的编码,但它几乎无法管理),您也无法提取字符

    如何使控制台中的字符看起来正确

    你不能

    理论上,您可以使用
    -Dfile.encoding=utf-8
    ,并将控制台编码设置为utf-8(或接近代码页65001)。不幸的是,Windows控制台因多字节编码而中断(传统语言环境默认支持的编码除外,utf-8不支持);您将得到乱码输出并挂起输入。这种方法通常不可行

    让Unicode进入Windows控制台的唯一可靠方法是跳过Java使用的基于字节的C标准库I/O函数,直接进入Win32 native WriteConsoleW接口,该接口接受Unicode字符(UTF-16代码单元,与Java字符串相同)因此,避免了字节转换中的控制台错误。您可以使用JNA访问此API。请参阅此问题中的示例代码:尽管如果要使其在命令管道的控制台字符输出和常规字节输出之间切换,需要一些额外的繁琐工作

    然后你必须希望用户使用非光栅字体(正如@Joey提到的),然后你必须希望字体有你想要的字符的字形(ConsoleAs不支持U+2610或U+22612)。除非你真的必须这样做,否则让Windows控制台使用Unicode在很大程度上是浪费你的时间

    Cp866控制台中的默认编码

    嗯,是的。代码页866不包含字符U+25A0、U+2610或U+2612。因此,即使Java对控制台使用了正确的编码(因为您设置了类似于-Dfile.encoding=cp866,或者它猜测了正确的编码,但它几乎无法管理),您也无法提取字符

    如何使控制台中的字符看起来正确

    你不能

    理论上,您可以使用
    -Dfile.encoding=utf-8
    ,并将控制台编码设置为utf-8(或接近代码页65001)。不幸的是,Windows控制台因多字节编码而中断(传统语言环境默认支持的编码除外,utf-8不支持);您将得到乱码输出并挂起输入。这种方法通常不可行

    让Unicode进入Windows控制台的唯一可靠方法是跳过Java使用的基于字节的C标准库I/O函数,直接进入Win32 native WriteConsoleW接口,该接口接受Unicode字符(UTF-16代码单元,与Java字符串相同)因此,避免了字节转换中的控制台错误。您可以使用JNA访问此API。请参阅此问题中的示例代码:尽管如果要使其在命令管道的控制台字符输出和常规字节输出之间切换,需要一些额外的繁琐工作


    然后你必须希望用户有非光栅字体(正如@Joey提到的),然后你必须希望字体有你想要的字符的字形(Consolas不适用于U+2610或U+22612)。除非您真的必须这样做,否则让Windows控制台使用Unicode在很大程度上是浪费您的时间。

    这有帮助吗?看看这里:切换
    chcp 65001
    和字体更改没有帮助哦,那么我