ポールLemarchand:
では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);
}
}
しかし、それは何も印刷されていません。私は交換した場合、コードは動作しますCHESS_SYMBOLS
と、例えば、ARABIC
。私は、java 12.0.1を持っています。
質問:なぜ、何を印刷し、上記のコードではないでしょうか?
VGR:
いくつかのチェスの記号文字は、その他の記号ブロック内に存在していますが、特に16ビットをチェックしているchar
別のブロック内の値。チェスシンボルブロックが含まれているゼロの16ビット値を持つ文字を、それはU + 1FA00から始まり、U + 1FA6Fで終了します。
キャストすることによりchar
、あなたは自分の最下位16ビットにU + FFFF上記のすべての値をトリミングしています。例えば、もしi
ある0x1fa60にキャスト、char
続くから、あなたのブロックチェックを防ぐこと0xfa60を行います。
あなたのコードの作業を行うには、すべてのコードポイントは、16ビットの値であることを仮定して停止する必要があります。あなたはこれを変更することでそれを行うことができます。
char unicode = (char) i;
これに:
int unicode = i;