使用UnicodeBlock打印国际象棋符号吗?

Pau*_*and 8 java unicode java-12

附带jdk12,国际象棋符号(来源):

Unicode 11.0.0引入了JDK 12现在包含的以下新功能

[...] 4个块,用于以下现有脚本:

  • 格鲁吉亚扩展

  • 玛雅数字

  • ndic Siyaq数字

  • 象棋符号

考虑到这一点,我尝试使用以下代码打印这些字符,以测试功能并稍后在小型国际象棋游戏中使用它们:

Character.UnicodeBlock block = Character.UnicodeBlock.CHESS_SYMBOLS;
for (int i = 0; i < 1114112; i++) {
    char unicode = (char) i;
    if(Character.UnicodeBlock.of(unicode) == block) {
        System.out.println(unicode);
    }
}
Run Code Online (Sandbox Code Playgroud)

但是,它没有打印任何内容。如果我将其替换CHESS_SYMBOLS为例如,该代码将起作用ARABIC。我有Java 12.0.1。

问题:上面的代码为什么不打印任何内容?

VGR*_*VGR 8

杂项符号块中存在一些国际象棋符号字符,但是您专门在其他块中检查16位char值。国际象棋符号块包含零个字符和16位值。它开始于U + 1FA00,结束于U + 1FA6F。

通过强制转换为char,可以将U + FFFF以上的所有值修整为最低的16位。例如,如果i0x1fa60,将其强制转换为a char将使其变为0xfa60,这将阻止您的块检查成功。

为了使您的代码正常工作,您需要停止假设所有代码点均为16位值。您可以通过更改此方法来做到这一点:

char unicode = (char) i;
Run Code Online (Sandbox Code Playgroud)

对此:

int unicode = i;
Run Code Online (Sandbox Code Playgroud)

  • 当然,将“ char unicode =(char)i;”更改为“ int unicode = i;”时,根本不需要两个不同的变量。 (3认同)