|
19 | 19 | public class Base32768Encoder { |
20 | 20 | Base32768Encoder() {} |
21 | 21 |
|
22 | | - static final char[] CODES_7 = {0x180, 0x240, 0x260, 0x280}; |
23 | | - // region CODES_15 |
24 | | - static final char[] CODES_15 = { |
25 | | - 0x4a0, 0x500, 0x680, 0x6a0, 0x760, 0x780, 0x7c0, 0x1000, 0x10a0, 0x1100, 0x1120, 0x1140, 0x1180, 0x11e0, 0x1200, 0x1220, |
26 | | - 0x1260, 0x12e0, 0x1320, 0x13a0, 0x13c0, 0x1420, 0x1440, 0x1460, 0x1480, 0x14a0, 0x14c0, 0x14e0, 0x1500, 0x1520, 0x1540, 0x1560, |
27 | | - 0x1580, 0x15a0, 0x15c0, 0x15e0, 0x1600, 0x1620, 0x1640, 0x16a0, 0x16c0, 0x1780, 0x1820, 0x1840, 0x18c0, 0x1980, 0x19e0, 0x1a20, |
28 | | - 0x1bc0, 0x1c00, 0x1d00, 0x21e0, 0x22c0, 0x2340, 0x2360, 0x2380, 0x23a0, 0x23c0, 0x2400, 0x2500, 0x2520, 0x2540, 0x2560, 0x2580, |
29 | | - 0x25a0, 0x25c0, 0x25e0, 0x2600, 0x2620, 0x2640, 0x2660, 0x2680, 0x26a0, 0x26c0, 0x26e0, 0x2700, 0x2720, 0x2740, 0x2780, 0x27a0, |
30 | | - 0x2800, 0x2820, 0x2840, 0x2860, 0x2880, 0x28a0, 0x28c0, 0x28e0, 0x2900, 0x2920, 0x2940, 0x2960, 0x29a0, 0x2a20, 0x2a40, 0x2a80, |
31 | | - 0x2aa0, 0x2ae0, 0x2b00, 0x2b20, 0x2b40, 0x2c00, 0x2c80, 0x2ca0, 0x2cc0, 0x2d00, 0x2d40, 0x2ea0, 0x2ec0, 0x31c0, 0x3400, 0x3420, |
32 | | - 0x3440, 0x3460, 0x3480, 0x34a0, 0x34c0, 0x34e0, 0x3500, 0x3520, 0x3540, 0x3560, 0x3580, 0x35a0, 0x35c0, 0x35e0, 0x3600, 0x3620, |
33 | | - 0x3640, 0x3660, 0x3680, 0x36a0, 0x36c0, 0x36e0, 0x3700, 0x3720, 0x3740, 0x3760, 0x3780, 0x37a0, 0x37c0, 0x37e0, 0x3800, 0x3820, |
34 | | - 0x3840, 0x3860, 0x3880, 0x38a0, 0x38c0, 0x38e0, 0x3900, 0x3920, 0x3940, 0x3960, 0x3980, 0x39a0, 0x39c0, 0x39e0, 0x3a00, 0x3a20, |
35 | | - 0x3a40, 0x3a60, 0x3a80, 0x3aa0, 0x3ac0, 0x3ae0, 0x3b00, 0x3b20, 0x3b40, 0x3b60, 0x3b80, 0x3ba0, 0x3bc0, 0x3be0, 0x3c00, 0x3c20, |
36 | | - 0x3c40, 0x3c60, 0x3c80, 0x3ca0, 0x3cc0, 0x3ce0, 0x3d00, 0x3d20, 0x3d40, 0x3d60, 0x3d80, 0x3da0, 0x3dc0, 0x3de0, 0x3e00, 0x3e20, |
37 | | - 0x3e40, 0x3e60, 0x3e80, 0x3ea0, 0x3ec0, 0x3ee0, 0x3f00, 0x3f20, 0x3f40, 0x3f60, 0x3f80, 0x3fa0, 0x3fc0, 0x3fe0, 0x4000, 0x4020, |
38 | | - 0x4040, 0x4060, 0x4080, 0x40a0, 0x40c0, 0x40e0, 0x4100, 0x4120, 0x4140, 0x4160, 0x4180, 0x41a0, 0x41c0, 0x41e0, 0x4200, 0x4220, |
39 | | - 0x4240, 0x4260, 0x4280, 0x42a0, 0x42c0, 0x42e0, 0x4300, 0x4320, 0x4340, 0x4360, 0x4380, 0x43a0, 0x43c0, 0x43e0, 0x4400, 0x4420, |
40 | | - 0x4440, 0x4460, 0x4480, 0x44a0, 0x44c0, 0x44e0, 0x4500, 0x4520, 0x4540, 0x4560, 0x4580, 0x45a0, 0x45c0, 0x45e0, 0x4600, 0x4620, |
41 | | - 0x4640, 0x4660, 0x4680, 0x46a0, 0x46c0, 0x46e0, 0x4700, 0x4720, 0x4740, 0x4760, 0x4780, 0x47a0, 0x47c0, 0x47e0, 0x4800, 0x4820, |
42 | | - 0x4840, 0x4860, 0x4880, 0x48a0, 0x48c0, 0x48e0, 0x4900, 0x4920, 0x4940, 0x4960, 0x4980, 0x49a0, 0x49c0, 0x49e0, 0x4a00, 0x4a20, |
43 | | - 0x4a40, 0x4a60, 0x4a80, 0x4aa0, 0x4ac0, 0x4ae0, 0x4b00, 0x4b20, 0x4b40, 0x4b60, 0x4b80, 0x4ba0, 0x4bc0, 0x4be0, 0x4c00, 0x4c20, |
44 | | - 0x4c40, 0x4c60, 0x4c80, 0x4ca0, 0x4cc0, 0x4ce0, 0x4d00, 0x4d20, 0x4d40, 0x4d60, 0x4d80, 0x4dc0, 0x4de0, 0x4e00, 0x4e20, 0x4e40, |
45 | | - 0x4e60, 0x4e80, 0x4ea0, 0x4ec0, 0x4ee0, 0x4f00, 0x4f20, 0x4f40, 0x4f60, 0x4f80, 0x4fa0, 0x4fc0, 0x4fe0, 0x5000, 0x5020, 0x5040, |
46 | | - 0x5060, 0x5080, 0x50a0, 0x50c0, 0x50e0, 0x5100, 0x5120, 0x5140, 0x5160, 0x5180, 0x51a0, 0x51c0, 0x51e0, 0x5200, 0x5220, 0x5240, |
47 | | - 0x5260, 0x5280, 0x52a0, 0x52c0, 0x52e0, 0x5300, 0x5320, 0x5340, 0x5360, 0x5380, 0x53a0, 0x53c0, 0x53e0, 0x5400, 0x5420, 0x5440, |
48 | | - 0x5460, 0x5480, 0x54a0, 0x54c0, 0x54e0, 0x5500, 0x5520, 0x5540, 0x5560, 0x5580, 0x55a0, 0x55c0, 0x55e0, 0x5600, 0x5620, 0x5640, |
49 | | - 0x5660, 0x5680, 0x56a0, 0x56c0, 0x56e0, 0x5700, 0x5720, 0x5740, 0x5760, 0x5780, 0x57a0, 0x57c0, 0x57e0, 0x5800, 0x5820, 0x5840, |
50 | | - 0x5860, 0x5880, 0x58a0, 0x58c0, 0x58e0, 0x5900, 0x5920, 0x5940, 0x5960, 0x5980, 0x59a0, 0x59c0, 0x59e0, 0x5a00, 0x5a20, 0x5a40, |
51 | | - 0x5a60, 0x5a80, 0x5aa0, 0x5ac0, 0x5ae0, 0x5b00, 0x5b20, 0x5b40, 0x5b60, 0x5b80, 0x5ba0, 0x5bc0, 0x5be0, 0x5c00, 0x5c20, 0x5c40, |
52 | | - 0x5c60, 0x5c80, 0x5ca0, 0x5cc0, 0x5ce0, 0x5d00, 0x5d20, 0x5d40, 0x5d60, 0x5d80, 0x5da0, 0x5dc0, 0x5de0, 0x5e00, 0x5e20, 0x5e40, |
53 | | - 0x5e60, 0x5e80, 0x5ea0, 0x5ec0, 0x5ee0, 0x5f00, 0x5f20, 0x5f40, 0x5f60, 0x5f80, 0x5fa0, 0x5fc0, 0x5fe0, 0x6000, 0x6020, 0x6040, |
54 | | - 0x6060, 0x6080, 0x60a0, 0x60c0, 0x60e0, 0x6100, 0x6120, 0x6140, 0x6160, 0x6180, 0x61a0, 0x61c0, 0x61e0, 0x6200, 0x6220, 0x6240, |
55 | | - 0x6260, 0x6280, 0x62a0, 0x62c0, 0x62e0, 0x6300, 0x6320, 0x6340, 0x6360, 0x6380, 0x63a0, 0x63c0, 0x63e0, 0x6400, 0x6420, 0x6440, |
56 | | - 0x6460, 0x6480, 0x64a0, 0x64c0, 0x64e0, 0x6500, 0x6520, 0x6540, 0x6560, 0x6580, 0x65a0, 0x65c0, 0x65e0, 0x6600, 0x6620, 0x6640, |
57 | | - 0x6660, 0x6680, 0x66a0, 0x66c0, 0x66e0, 0x6700, 0x6720, 0x6740, 0x6760, 0x6780, 0x67a0, 0x67c0, 0x67e0, 0x6800, 0x6820, 0x6840, |
58 | | - 0x6860, 0x6880, 0x68a0, 0x68c0, 0x68e0, 0x6900, 0x6920, 0x6940, 0x6960, 0x6980, 0x69a0, 0x69c0, 0x69e0, 0x6a00, 0x6a20, 0x6a40, |
59 | | - 0x6a60, 0x6a80, 0x6aa0, 0x6ac0, 0x6ae0, 0x6b00, 0x6b20, 0x6b40, 0x6b60, 0x6b80, 0x6ba0, 0x6bc0, 0x6be0, 0x6c00, 0x6c20, 0x6c40, |
60 | | - 0x6c60, 0x6c80, 0x6ca0, 0x6cc0, 0x6ce0, 0x6d00, 0x6d20, 0x6d40, 0x6d60, 0x6d80, 0x6da0, 0x6dc0, 0x6de0, 0x6e00, 0x6e20, 0x6e40, |
61 | | - 0x6e60, 0x6e80, 0x6ea0, 0x6ec0, 0x6ee0, 0x6f00, 0x6f20, 0x6f40, 0x6f60, 0x6f80, 0x6fa0, 0x6fc0, 0x6fe0, 0x7000, 0x7020, 0x7040, |
62 | | - 0x7060, 0x7080, 0x70a0, 0x70c0, 0x70e0, 0x7100, 0x7120, 0x7140, 0x7160, 0x7180, 0x71a0, 0x71c0, 0x71e0, 0x7200, 0x7220, 0x7240, |
63 | | - 0x7260, 0x7280, 0x72a0, 0x72c0, 0x72e0, 0x7300, 0x7320, 0x7340, 0x7360, 0x7380, 0x73a0, 0x73c0, 0x73e0, 0x7400, 0x7420, 0x7440, |
64 | | - 0x7460, 0x7480, 0x74a0, 0x74c0, 0x74e0, 0x7500, 0x7520, 0x7540, 0x7560, 0x7580, 0x75a0, 0x75c0, 0x75e0, 0x7600, 0x7620, 0x7640, |
65 | | - 0x7660, 0x7680, 0x76a0, 0x76c0, 0x76e0, 0x7700, 0x7720, 0x7740, 0x7760, 0x7780, 0x77a0, 0x77c0, 0x77e0, 0x7800, 0x7820, 0x7840, |
66 | | - 0x7860, 0x7880, 0x78a0, 0x78c0, 0x78e0, 0x7900, 0x7920, 0x7940, 0x7960, 0x7980, 0x79a0, 0x79c0, 0x79e0, 0x7a00, 0x7a20, 0x7a40, |
67 | | - 0x7a60, 0x7a80, 0x7aa0, 0x7ac0, 0x7ae0, 0x7b00, 0x7b20, 0x7b40, 0x7b60, 0x7b80, 0x7ba0, 0x7bc0, 0x7be0, 0x7c00, 0x7c20, 0x7c40, |
68 | | - 0x7c60, 0x7c80, 0x7ca0, 0x7cc0, 0x7ce0, 0x7d00, 0x7d20, 0x7d40, 0x7d60, 0x7d80, 0x7da0, 0x7dc0, 0x7de0, 0x7e00, 0x7e20, 0x7e40, |
69 | | - 0x7e60, 0x7e80, 0x7ea0, 0x7ec0, 0x7ee0, 0x7f00, 0x7f20, 0x7f40, 0x7f60, 0x7f80, 0x7fa0, 0x7fc0, 0x7fe0, 0x8000, 0x8020, 0x8040, |
70 | | - 0x8060, 0x8080, 0x80a0, 0x80c0, 0x80e0, 0x8100, 0x8120, 0x8140, 0x8160, 0x8180, 0x81a0, 0x81c0, 0x81e0, 0x8200, 0x8220, 0x8240, |
71 | | - 0x8260, 0x8280, 0x82a0, 0x82c0, 0x82e0, 0x8300, 0x8320, 0x8340, 0x8360, 0x8380, 0x83a0, 0x83c0, 0x83e0, 0x8400, 0x8420, 0x8440, |
72 | | - 0x8460, 0x8480, 0x84a0, 0x84c0, 0x84e0, 0x8500, 0x8520, 0x8540, 0x8560, 0x8580, 0x85a0, 0x85c0, 0x85e0, 0x8600, 0x8620, 0x8640, |
73 | | - 0x8660, 0x8680, 0x86a0, 0x86c0, 0x86e0, 0x8700, 0x8720, 0x8740, 0x8760, 0x8780, 0x87a0, 0x87c0, 0x87e0, 0x8800, 0x8820, 0x8840, |
74 | | - 0x8860, 0x8880, 0x88a0, 0x88c0, 0x88e0, 0x8900, 0x8920, 0x8940, 0x8960, 0x8980, 0x89a0, 0x89c0, 0x89e0, 0x8a00, 0x8a20, 0x8a40, |
75 | | - 0x8a60, 0x8a80, 0x8aa0, 0x8ac0, 0x8ae0, 0x8b00, 0x8b20, 0x8b40, 0x8b60, 0x8b80, 0x8ba0, 0x8bc0, 0x8be0, 0x8c00, 0x8c20, 0x8c40, |
76 | | - 0x8c60, 0x8c80, 0x8ca0, 0x8cc0, 0x8ce0, 0x8d00, 0x8d20, 0x8d40, 0x8d60, 0x8d80, 0x8da0, 0x8dc0, 0x8de0, 0x8e00, 0x8e20, 0x8e40, |
77 | | - 0x8e60, 0x8e80, 0x8ea0, 0x8ec0, 0x8ee0, 0x8f00, 0x8f20, 0x8f40, 0x8f60, 0x8f80, 0x8fa0, 0x8fc0, 0x8fe0, 0x9000, 0x9020, 0x9040, |
78 | | - 0x9060, 0x9080, 0x90a0, 0x90c0, 0x90e0, 0x9100, 0x9120, 0x9140, 0x9160, 0x9180, 0x91a0, 0x91c0, 0x91e0, 0x9200, 0x9220, 0x9240, |
79 | | - 0x9260, 0x9280, 0x92a0, 0x92c0, 0x92e0, 0x9300, 0x9320, 0x9340, 0x9360, 0x9380, 0x93a0, 0x93c0, 0x93e0, 0x9400, 0x9420, 0x9440, |
80 | | - 0x9460, 0x9480, 0x94a0, 0x94c0, 0x94e0, 0x9500, 0x9520, 0x9540, 0x9560, 0x9580, 0x95a0, 0x95c0, 0x95e0, 0x9600, 0x9620, 0x9640, |
81 | | - 0x9660, 0x9680, 0x96a0, 0x96c0, 0x96e0, 0x9700, 0x9720, 0x9740, 0x9760, 0x9780, 0x97a0, 0x97c0, 0x97e0, 0x9800, 0x9820, 0x9840, |
82 | | - 0x9860, 0x9880, 0x98a0, 0x98c0, 0x98e0, 0x9900, 0x9920, 0x9940, 0x9960, 0x9980, 0x99a0, 0x99c0, 0x99e0, 0x9a00, 0x9a20, 0x9a40, |
83 | | - 0x9a60, 0x9a80, 0x9aa0, 0x9ac0, 0x9ae0, 0x9b00, 0x9b20, 0x9b40, 0x9b60, 0x9b80, 0x9ba0, 0x9bc0, 0x9be0, 0x9c00, 0x9c20, 0x9c40, |
84 | | - 0x9c60, 0x9c80, 0x9ca0, 0x9cc0, 0x9ce0, 0x9d00, 0x9d20, 0x9d40, 0x9d60, 0x9d80, 0x9da0, 0x9dc0, 0x9de0, 0x9e00, 0x9e20, 0x9e40, |
85 | | - 0x9e60, 0x9e80, 0x9ea0, 0x9ec0, 0x9ee0, 0x9f00, 0x9f20, 0x9f40, 0x9f60, 0x9f80, 0x9fa0, 0xa000, 0xa020, 0xa040, 0xa060, 0xa080, |
86 | | - 0xa0a0, 0xa0c0, 0xa0e0, 0xa100, 0xa120, 0xa140, 0xa160, 0xa180, 0xa1a0, 0xa1c0, 0xa1e0, 0xa200, 0xa220, 0xa240, 0xa260, 0xa280, |
87 | | - 0xa2a0, 0xa2c0, 0xa2e0, 0xa300, 0xa320, 0xa340, 0xa360, 0xa380, 0xa3a0, 0xa3c0, 0xa3e0, 0xa400, 0xa420, 0xa440, 0xa460, 0xa4a0, |
88 | | - 0xa500, 0xa520, 0xa540, 0xa560, 0xa580, 0xa5a0, 0xa5c0, 0xa5e0, 0xa640, 0xa6a0, 0xa6c0, 0xa700, 0xa720, 0xa740, 0xa780, 0xa840, |
| 22 | + // Unicode ranges for 7-bit encoding (128 total characters, 4 blocks of 32) |
| 23 | + static final int[][] CODES_7_RANGES = { |
| 24 | + {0x0180, 0x019f}, |
| 25 | + {0x0240, 0x029f} |
| 26 | + }; |
| 27 | + |
| 28 | + // Unicode ranges for 15-bit encoding (32768 total characters, 1024 blocks of 32) |
| 29 | + static final int[][] CODES_15_RANGES = { |
| 30 | + {0x04a0, 0x04bf}, {0x0500, 0x051f}, {0x0680, 0x06bf}, {0x0760, 0x079f}, |
| 31 | + {0x07c0, 0x07df}, {0x1000, 0x101f}, {0x10a0, 0x10bf}, {0x1100, 0x115f}, |
| 32 | + {0x1180, 0x119f}, {0x11e0, 0x123f}, {0x1260, 0x127f}, {0x12e0, 0x12ff}, |
| 33 | + {0x1320, 0x133f}, {0x13a0, 0x13df}, {0x1420, 0x165f}, {0x16a0, 0x16df}, |
| 34 | + {0x1780, 0x179f}, {0x1820, 0x185f}, {0x18c0, 0x18df}, {0x1980, 0x199f}, |
| 35 | + {0x19e0, 0x19ff}, {0x1a20, 0x1a3f}, {0x1bc0, 0x1bdf}, {0x1c00, 0x1c1f}, |
| 36 | + {0x1d00, 0x1d1f}, {0x21e0, 0x21ff}, {0x22c0, 0x22df}, {0x2340, 0x23df}, |
| 37 | + {0x2400, 0x241f}, {0x2500, 0x275f}, {0x2780, 0x27bf}, {0x2800, 0x297f}, |
| 38 | + {0x29a0, 0x29bf}, {0x2a20, 0x2a5f}, {0x2a80, 0x2abf}, {0x2ae0, 0x2b5f}, |
| 39 | + {0x2c00, 0x2c1f}, {0x2c80, 0x2cdf}, {0x2d00, 0x2d1f}, {0x2d40, 0x2d5f}, |
| 40 | + {0x2ea0, 0x2edf}, {0x31c0, 0x31df}, {0x3400, 0x4d9f}, {0x4dc0, 0x9fbf}, |
| 41 | + {0xa000, 0xa47f}, {0xa4a0, 0xa4bf}, {0xa500, 0xa5ff}, {0xa640, 0xa65f}, |
| 42 | + {0xa6a0, 0xa6df}, {0xa700, 0xa75f}, {0xa780, 0xa79f}, {0xa840, 0xa85f} |
89 | 43 | }; |
90 | | - // endregion CODES_15 |
91 | 44 |
|
92 | 45 | private static final VarHandle VH_LONG_BE = MethodHandles.byteArrayViewVarHandle(long[].class, ByteOrder.BIG_ENDIAN); |
93 | 46 |
|
94 | 47 | private static final char[] CODES15_CHAR = new char[1 << 15]; |
95 | 48 | private static final char[] CODES7_CHAR = new char[1 << 7]; |
96 | 49 |
|
97 | 50 | static { |
98 | | - for (int v = 0; v < (1 << 15); v++) { |
99 | | - CODES15_CHAR[v] = (char) (CODES_15[v >>> 5] + (v & 31)); |
| 51 | + // Build CODES15_CHAR lookup table from Unicode ranges |
| 52 | + int idx = 0; |
| 53 | + for (int[] range : CODES_15_RANGES) { |
| 54 | + for (int cp = range[0]; cp <= range[1]; cp++) { |
| 55 | + CODES15_CHAR[idx++] = (char) cp; |
| 56 | + } |
100 | 57 | } |
101 | | - for (int v = 0; v < (1 << 7); v++) { |
102 | | - CODES7_CHAR[v] = (char) (CODES_7[v >>> 5] + (v & 31)); |
| 58 | + |
| 59 | + // Build CODES7_CHAR lookup table from Unicode ranges |
| 60 | + idx = 0; |
| 61 | + for (int[] range : CODES_7_RANGES) { |
| 62 | + for (int cp = range[0]; cp <= range[1]; cp++) { |
| 63 | + CODES7_CHAR[idx++] = (char) cp; |
| 64 | + } |
103 | 65 | } |
104 | 66 | } |
105 | 67 |
|
|
0 commit comments