Javaでバイトコードの範囲チェックを試してみた。
■1. 半角数字の範囲内かチェック
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 |
// テスト対象バイトコード final byte[] testByteArray = new byte[] { (byte)0x00, (byte)0x30, // 0 }; // 正規表現:文字コード範囲 0~9 final String regex = "^[\\u0030-\\u0039]+$"; // 文字列変換 String testString = new String(testByteArray, "UTF-16"); // 文字コード範囲内かチェック boolean result = testString.matches(regex); // 結果を出力 System.out.println(String.format( "文字列 = %s, バイトコード = 0x%02x%02x, 範囲チェック結果 = %s", testString, testByteArray[0], testByteArray[1], result)); |
結果 -> 文字コード範囲内なのでチェックできた。おぉ~。
1 |
文字列 = 0, バイトコード = 0x0030, 範囲チェック結果 = true |
■2. ひらがなの範囲内かチェック
1 2 3 4 5 6 7 |
// テスト対象バイトコード final byte[] testByteArray = new byte[] { (byte)0x30, (byte)0x42, // あ }; // 正規表現:文字コード範囲 あ~ん final String regex = "^[\\u3041-\\u3093]+$"; |
結果 -> 文字コード範囲内なのでtrueが返ってきた。おぉ~。
1 |
文字列 = あ, バイトコード = 0x3042, 範囲チェック結果 = true |
■3. 次は以下のバイトコードでは正しい結果が得られなかった。。。。
1 2 3 4 5 6 7 |
// テスト対象バイトコード final byte[] testByteArray = new byte[] { (byte)0xD8, (byte)0x00, // 0xD800 }; // 正規表現:文字コード範囲 final String regex = "^[\\uD800-\\uDFFF]+$"; |
結果 -> 文字コード範囲内だがfalseが返ってきた。なぜだ!?
1 |
文字列 = �, バイトコード = 0xd800, 範囲チェック結果 = false |
調べてみると「D000-DFFF」は代用対(サロゲートペア)に使われるそうだ。
Unicode一覧 D000-DFFF
その影響で正しくチェックできていないっぽい。。。
1 2 3 4 5 6 7 |
// テスト対象バイトコード final byte[] testByteArray = new byte[] { (byte)0xD8, (byte)0x00, // 0xD800 }; // 正規表現:文字コード範囲 final String regex = "^[\\uFFFD]+$"; |
結果 -> 0xFFFDで範囲チェックを行ってみるとtrueとなった。java内でFFFDの扱いになってるのかなぁ~。。。
1 |
文字列 = �, バイトコード = 0xd800, 範囲チェック結果 = true |
調べてみると、「該当する文字が存在しない場合は’0xFFFD(REPLACEMENT CHARACTER)’の文字に変換されます。 」のようだ。なるほど。
今度D000-DFFFを判定する方法を調べてみることにしよう。
おわり。