const NON_ASCII_IDENTIFIER_RANGES: &[(u32, u32)] = &[
(0xa0, 0x377),
(0x37a, 0x37f),
(0x384, 0x38a),
(0x38c, 0x38c),
(0x38e, 0x3a1),
(0x3a3, 0x52f),
(0x531, 0x556),
(0x559, 0x58a),
(0x58d, 0x58f),
(0x591, 0x5c7),
(0x5d0, 0x5ea),
(0x5ef, 0x5f4),
(0x600, 0x70d),
(0x70f, 0x74a),
(0x74d, 0x7b1),
(0x7c0, 0x7fa),
(0x7fd, 0x82d),
(0x830, 0x83e),
(0x840, 0x85b),
(0x85e, 0x85e),
(0x860, 0x86a),
(0x870, 0x88e),
(0x890, 0x891),
(0x898, 0x983),
(0x985, 0x98c),
(0x98f, 0x990),
(0x993, 0x9a8),
(0x9aa, 0x9b0),
(0x9b2, 0x9b2),
(0x9b6, 0x9b9),
(0x9bc, 0x9c4),
(0x9c7, 0x9c8),
(0x9cb, 0x9ce),
(0x9d7, 0x9d7),
(0x9dc, 0x9dd),
(0x9df, 0x9e3),
(0x9e6, 0x9fe),
(0xa01, 0xa03),
(0xa05, 0xa0a),
(0xa0f, 0xa10),
(0xa13, 0xa28),
(0xa2a, 0xa30),
(0xa32, 0xa33),
(0xa35, 0xa36),
(0xa38, 0xa39),
(0xa3c, 0xa3c),
(0xa3e, 0xa42),
(0xa47, 0xa48),
(0xa4b, 0xa4d),
(0xa51, 0xa51),
(0xa59, 0xa5c),
(0xa5e, 0xa5e),
(0xa66, 0xa76),
(0xa81, 0xa83),
(0xa85, 0xa8d),
(0xa8f, 0xa91),
(0xa93, 0xaa8),
(0xaaa, 0xab0),
(0xab2, 0xab3),
(0xab5, 0xab9),
(0xabc, 0xac5),
(0xac7, 0xac9),
(0xacb, 0xacd),
(0xad0, 0xad0),
(0xae0, 0xae3),
(0xae6, 0xaf1),
(0xaf9, 0xaff),
(0xb01, 0xb03),
(0xb05, 0xb0c),
(0xb0f, 0xb10),
(0xb13, 0xb28),
(0xb2a, 0xb30),
(0xb32, 0xb33),
(0xb35, 0xb39),
(0xb3c, 0xb44),
(0xb47, 0xb48),
(0xb4b, 0xb4d),
(0xb55, 0xb57),
(0xb5c, 0xb5d),
(0xb5f, 0xb63),
(0xb66, 0xb77),
(0xb82, 0xb83),
(0xb85, 0xb8a),
(0xb8e, 0xb90),
(0xb92, 0xb95),
(0xb99, 0xb9a),
(0xb9c, 0xb9c),
(0xb9e, 0xb9f),
(0xba3, 0xba4),
(0xba8, 0xbaa),
(0xbae, 0xbb9),
(0xbbe, 0xbc2),
(0xbc6, 0xbc8),
(0xbca, 0xbcd),
(0xbd0, 0xbd0),
(0xbd7, 0xbd7),
(0xbe6, 0xbfa),
(0xc00, 0xc0c),
(0xc0e, 0xc10),
(0xc12, 0xc28),
(0xc2a, 0xc39),
(0xc3c, 0xc44),
(0xc46, 0xc48),
(0xc4a, 0xc4d),
(0xc55, 0xc56),
(0xc58, 0xc5a),
(0xc5d, 0xc5d),
(0xc60, 0xc63),
(0xc66, 0xc6f),
(0xc77, 0xc8c),
(0xc8e, 0xc90),
(0xc92, 0xca8),
(0xcaa, 0xcb3),
(0xcb5, 0xcb9),
(0xcbc, 0xcc4),
(0xcc6, 0xcc8),
(0xcca, 0xccd),
(0xcd5, 0xcd6),
(0xcdd, 0xcde),
(0xce0, 0xce3),
(0xce6, 0xcef),
(0xcf1, 0xcf3),
(0xd00, 0xd0c),
(0xd0e, 0xd10),
(0xd12, 0xd44),
(0xd46, 0xd48),
(0xd4a, 0xd4f),
(0xd54, 0xd63),
(0xd66, 0xd7f),
(0xd81, 0xd83),
(0xd85, 0xd96),
(0xd9a, 0xdb1),
(0xdb3, 0xdbb),
(0xdbd, 0xdbd),
(0xdc0, 0xdc6),
(0xdca, 0xdca),
(0xdcf, 0xdd4),
(0xdd6, 0xdd6),
(0xdd8, 0xddf),
(0xde6, 0xdef),
(0xdf2, 0xdf4),
(0xe01, 0xe3a),
(0xe3f, 0xe5b),
(0xe81, 0xe82),
(0xe84, 0xe84),
(0xe86, 0xe8a),
(0xe8c, 0xea3),
(0xea5, 0xea5),
(0xea7, 0xebd),
(0xec0, 0xec4),
(0xec6, 0xec6),
(0xec8, 0xece),
(0xed0, 0xed9),
(0xedc, 0xedf),
(0xf00, 0xf47),
(0xf49, 0xf6c),
(0xf71, 0xf97),
(0xf99, 0xfbc),
(0xfbe, 0xfcc),
(0xfce, 0xfda),
(0x1000, 0x10c5),
(0x10c7, 0x10c7),
(0x10cd, 0x10cd),
(0x10d0, 0x1248),
(0x124a, 0x124d),
(0x1250, 0x1256),
(0x1258, 0x1258),
(0x125a, 0x125d),
(0x1260, 0x1288),
(0x128a, 0x128d),
(0x1290, 0x12b0),
(0x12b2, 0x12b5),
(0x12b8, 0x12be),
(0x12c0, 0x12c0),
(0x12c2, 0x12c5),
(0x12c8, 0x12d6),
(0x12d8, 0x1310),
(0x1312, 0x1315),
(0x1318, 0x135a),
(0x135d, 0x137c),
(0x1380, 0x1399),
(0x13a0, 0x13f5),
(0x13f8, 0x13fd),
(0x1400, 0x169c),
(0x16a0, 0x16f8),
(0x1700, 0x1715),
(0x171f, 0x1736),
(0x1740, 0x1753),
(0x1760, 0x176c),
(0x176e, 0x1770),
(0x1772, 0x1773),
(0x1780, 0x17dd),
(0x17e0, 0x17e9),
(0x17f0, 0x17f9),
(0x1800, 0x1819),
(0x1820, 0x1878),
(0x1880, 0x18aa),
(0x18b0, 0x18f5),
(0x1900, 0x191e),
(0x1920, 0x192b),
(0x1930, 0x193b),
(0x1940, 0x1940),
(0x1944, 0x196d),
(0x1970, 0x1974),
(0x1980, 0x19ab),
(0x19b0, 0x19c9),
(0x19d0, 0x19da),
(0x19de, 0x1a1b),
(0x1a1e, 0x1a5e),
(0x1a60, 0x1a7c),
(0x1a7f, 0x1a89),
(0x1a90, 0x1a99),
(0x1aa0, 0x1aad),
(0x1ab0, 0x1ace),
(0x1b00, 0x1b4c),
(0x1b50, 0x1b7e),
(0x1b80, 0x1bf3),
(0x1bfc, 0x1c37),
(0x1c3b, 0x1c49),
(0x1c4d, 0x1c88),
(0x1c90, 0x1cba),
(0x1cbd, 0x1cc7),
(0x1cd0, 0x1cfa),
(0x1d00, 0x1f15),
(0x1f18, 0x1f1d),
(0x1f20, 0x1f45),
(0x1f48, 0x1f4d),
(0x1f50, 0x1f57),
(0x1f59, 0x1f59),
(0x1f5b, 0x1f5b),
(0x1f5d, 0x1f5d),
(0x1f5f, 0x1f7d),
(0x1f80, 0x1fb4),
(0x1fb6, 0x1fc4),
(0x1fc6, 0x1fd3),
(0x1fd6, 0x1fdb),
(0x1fdd, 0x1fef),
(0x1ff2, 0x1ff4),
(0x1ff6, 0x1ffe),
(0x2000, 0x200d),
(0x2010, 0x2027),
(0x202a, 0x2064),
(0x2066, 0x2071),
(0x2074, 0x208e),
(0x2090, 0x209c),
(0x20a0, 0x20c0),
(0x20d0, 0x20f0),
(0x2100, 0x218b),
(0x2190, 0x2426),
(0x2440, 0x244a),
(0x2460, 0x2b73),
(0x2b76, 0x2b95),
(0x2b97, 0x2cf3),
(0x2cf9, 0x2d25),
(0x2d27, 0x2d27),
(0x2d2d, 0x2d2d),
(0x2d30, 0x2d67),
(0x2d6f, 0x2d70),
(0x2d7f, 0x2d96),
(0x2da0, 0x2da6),
(0x2da8, 0x2dae),
(0x2db0, 0x2db6),
(0x2db8, 0x2dbe),
(0x2dc0, 0x2dc6),
(0x2dc8, 0x2dce),
(0x2dd0, 0x2dd6),
(0x2dd8, 0x2dde),
(0x2de0, 0x2e5d),
(0x2e80, 0x2e99),
(0x2e9b, 0x2ef3),
(0x2f00, 0x2fd5),
(0x2ff0, 0x2ffb),
(0x3000, 0x303f),
(0x3041, 0x3096),
(0x3099, 0x30ff),
(0x3105, 0x312f),
(0x3131, 0x318e),
(0x3190, 0x31e3),
(0x31f0, 0x321e),
(0x3220, 0xa48c),
(0xa490, 0xa4c6),
(0xa4d0, 0xa62b),
(0xa640, 0xa6f7),
(0xa700, 0xa7ca),
(0xa7d0, 0xa7d1),
(0xa7d3, 0xa7d3),
(0xa7d5, 0xa7d9),
(0xa7f2, 0xa82c),
(0xa830, 0xa839),
(0xa840, 0xa877),
(0xa880, 0xa8c5),
(0xa8ce, 0xa8d9),
(0xa8e0, 0xa953),
(0xa95f, 0xa97c),
(0xa980, 0xa9cd),
(0xa9cf, 0xa9d9),
(0xa9de, 0xa9fe),
(0xaa00, 0xaa36),
(0xaa40, 0xaa4d),
(0xaa50, 0xaa59),
(0xaa5c, 0xaac2),
(0xaadb, 0xaaf6),
(0xab01, 0xab06),
(0xab09, 0xab0e),
(0xab11, 0xab16),
(0xab20, 0xab26),
(0xab28, 0xab2e),
(0xab30, 0xab6b),
(0xab70, 0xabed),
(0xabf0, 0xabf9),
(0xac00, 0xd7a3),
(0xd7b0, 0xd7c6),
(0xd7cb, 0xd7fb),
(0xf900, 0xfa6d),
(0xfa70, 0xfad9),
(0xfb00, 0xfb06),
(0xfb13, 0xfb17),
(0xfb1d, 0xfb36),
(0xfb38, 0xfb3c),
(0xfb3e, 0xfb3e),
(0xfb40, 0xfb41),
(0xfb43, 0xfb44),
(0xfb46, 0xfbc2),
(0xfbd3, 0xfd8f),
(0xfd92, 0xfdc7),
(0xfdcf, 0xfdcf),
(0xfdf0, 0xfe19),
(0xfe20, 0xfe52),
(0xfe54, 0xfe66),
(0xfe68, 0xfe6b),
(0xfe70, 0xfe74),
(0xfe76, 0xfefc),
(0xfeff, 0xfeff),
(0xff01, 0xffbe),
(0xffc2, 0xffc7),
(0xffca, 0xffcf),
(0xffd2, 0xffd7),
(0xffda, 0xffdc),
(0xffe0, 0xffe6),
(0xffe8, 0xffee),
(0xfff9, 0xfffc),
(0x10000, 0x1000b),
(0x1000d, 0x10026),
(0x10028, 0x1003a),
(0x1003c, 0x1003d),
(0x1003f, 0x1004d),
(0x10050, 0x1005d),
(0x10080, 0x100fa),
(0x10100, 0x10102),
(0x10107, 0x10133),
(0x10137, 0x1018e),
(0x10190, 0x1019c),
(0x101a0, 0x101a0),
(0x101d0, 0x101fd),
(0x10280, 0x1029c),
(0x102a0, 0x102d0),
(0x102e0, 0x102fb),
(0x10300, 0x10323),
(0x1032d, 0x1034a),
(0x10350, 0x1037a),
(0x10380, 0x1039d),
(0x1039f, 0x103c3),
(0x103c8, 0x103d5),
(0x10400, 0x1049d),
(0x104a0, 0x104a9),
(0x104b0, 0x104d3),
(0x104d8, 0x104fb),
(0x10500, 0x10527),
(0x10530, 0x10563),
(0x1056f, 0x1057a),
(0x1057c, 0x1058a),
(0x1058c, 0x10592),
(0x10594, 0x10595),
(0x10597, 0x105a1),
(0x105a3, 0x105b1),
(0x105b3, 0x105b9),
(0x105bb, 0x105bc),
(0x10600, 0x10736),
(0x10740, 0x10755),
(0x10760, 0x10767),
(0x10780, 0x10785),
(0x10787, 0x107b0),
(0x107b2, 0x107ba),
(0x10800, 0x10805),
(0x10808, 0x10808),
(0x1080a, 0x10835),
(0x10837, 0x10838),
(0x1083c, 0x1083c),
(0x1083f, 0x10855),
(0x10857, 0x1089e),
(0x108a7, 0x108af),
(0x108e0, 0x108f2),
(0x108f4, 0x108f5),
(0x108fb, 0x1091b),
(0x1091f, 0x10939),
(0x1093f, 0x1093f),
(0x10980, 0x109b7),
(0x109bc, 0x109cf),
(0x109d2, 0x10a03),
(0x10a05, 0x10a06),
(0x10a0c, 0x10a13),
(0x10a15, 0x10a17),
(0x10a19, 0x10a35),
(0x10a38, 0x10a3a),
(0x10a3f, 0x10a48),
(0x10a50, 0x10a58),
(0x10a60, 0x10a9f),
(0x10ac0, 0x10ae6),
(0x10aeb, 0x10af6),
(0x10b00, 0x10b35),
(0x10b39, 0x10b55),
(0x10b58, 0x10b72),
(0x10b78, 0x10b91),
(0x10b99, 0x10b9c),
(0x10ba9, 0x10baf),
(0x10c00, 0x10c48),
(0x10c80, 0x10cb2),
(0x10cc0, 0x10cf2),
(0x10cfa, 0x10d27),
(0x10d30, 0x10d39),
(0x10e60, 0x10e7e),
(0x10e80, 0x10ea9),
(0x10eab, 0x10ead),
(0x10eb0, 0x10eb1),
(0x10efd, 0x10f27),
(0x10f30, 0x10f59),
(0x10f70, 0x10f89),
(0x10fb0, 0x10fcb),
(0x10fe0, 0x10ff6),
(0x11000, 0x1104d),
(0x11052, 0x11075),
(0x1107f, 0x110c2),
(0x110cd, 0x110cd),
(0x110d0, 0x110e8),
(0x110f0, 0x110f9),
(0x11100, 0x11134),
(0x11136, 0x11147),
(0x11150, 0x11176),
(0x11180, 0x111df),
(0x111e1, 0x111f4),
(0x11200, 0x11211),
(0x11213, 0x11241),
(0x11280, 0x11286),
(0x11288, 0x11288),
(0x1128a, 0x1128d),
(0x1128f, 0x1129d),
(0x1129f, 0x112a9),
(0x112b0, 0x112ea),
(0x112f0, 0x112f9),
(0x11300, 0x11303),
(0x11305, 0x1130c),
(0x1130f, 0x11310),
(0x11313, 0x11328),
(0x1132a, 0x11330),
(0x11332, 0x11333),
(0x11335, 0x11339),
(0x1133b, 0x11344),
(0x11347, 0x11348),
(0x1134b, 0x1134d),
(0x11350, 0x11350),
(0x11357, 0x11357),
(0x1135d, 0x11363),
(0x11366, 0x1136c),
(0x11370, 0x11374),
(0x11400, 0x1145b),
(0x1145d, 0x11461),
(0x11480, 0x114c7),
(0x114d0, 0x114d9),
(0x11580, 0x115b5),
(0x115b8, 0x115dd),
(0x11600, 0x11644),
(0x11650, 0x11659),
(0x11660, 0x1166c),
(0x11680, 0x116b9),
(0x116c0, 0x116c9),
(0x11700, 0x1171a),
(0x1171d, 0x1172b),
(0x11730, 0x11746),
(0x11800, 0x1183b),
(0x118a0, 0x118f2),
(0x118ff, 0x11906),
(0x11909, 0x11909),
(0x1190c, 0x11913),
(0x11915, 0x11916),
(0x11918, 0x11935),
(0x11937, 0x11938),
(0x1193b, 0x11946),
(0x11950, 0x11959),
(0x119a0, 0x119a7),
(0x119aa, 0x119d7),
(0x119da, 0x119e4),
(0x11a00, 0x11a47),
(0x11a50, 0x11aa2),
(0x11ab0, 0x11af8),
(0x11b00, 0x11b09),
(0x11c00, 0x11c08),
(0x11c0a, 0x11c36),
(0x11c38, 0x11c45),
(0x11c50, 0x11c6c),
(0x11c70, 0x11c8f),
(0x11c92, 0x11ca7),
(0x11ca9, 0x11cb6),
(0x11d00, 0x11d06),
(0x11d08, 0x11d09),
(0x11d0b, 0x11d36),
(0x11d3a, 0x11d3a),
(0x11d3c, 0x11d3d),
(0x11d3f, 0x11d47),
(0x11d50, 0x11d59),
(0x11d60, 0x11d65),
(0x11d67, 0x11d68),
(0x11d6a, 0x11d8e),
(0x11d90, 0x11d91),
(0x11d93, 0x11d98),
(0x11da0, 0x11da9),
(0x11ee0, 0x11ef8),
(0x11f00, 0x11f10),
(0x11f12, 0x11f3a),
(0x11f3e, 0x11f59),
(0x11fb0, 0x11fb0),
(0x11fc0, 0x11ff1),
(0x11fff, 0x12399),
(0x12400, 0x1246e),
(0x12470, 0x12474),
(0x12480, 0x12543),
(0x12f90, 0x12ff2),
(0x13000, 0x13455),
(0x14400, 0x14646),
(0x16800, 0x16a38),
(0x16a40, 0x16a5e),
(0x16a60, 0x16a69),
(0x16a6e, 0x16abe),
(0x16ac0, 0x16ac9),
(0x16ad0, 0x16aed),
(0x16af0, 0x16af5),
(0x16b00, 0x16b45),
(0x16b50, 0x16b59),
(0x16b5b, 0x16b61),
(0x16b63, 0x16b77),
(0x16b7d, 0x16b8f),
(0x16e40, 0x16e9a),
(0x16f00, 0x16f4a),
(0x16f4f, 0x16f87),
(0x16f8f, 0x16f9f),
(0x16fe0, 0x16fe4),
(0x16ff0, 0x16ff1),
(0x17000, 0x187f7),
(0x18800, 0x18cd5),
(0x18d00, 0x18d08),
(0x1aff0, 0x1aff3),
(0x1aff5, 0x1affb),
(0x1affd, 0x1affe),
(0x1b000, 0x1b122),
(0x1b132, 0x1b132),
(0x1b150, 0x1b152),
(0x1b155, 0x1b155),
(0x1b164, 0x1b167),
(0x1b170, 0x1b2fb),
(0x1bc00, 0x1bc6a),
(0x1bc70, 0x1bc7c),
(0x1bc80, 0x1bc88),
(0x1bc90, 0x1bc99),
(0x1bc9c, 0x1bca3),
(0x1cf00, 0x1cf2d),
(0x1cf30, 0x1cf46),
(0x1cf50, 0x1cfc3),
(0x1d000, 0x1d0f5),
(0x1d100, 0x1d126),
(0x1d129, 0x1d1ea),
(0x1d200, 0x1d245),
(0x1d2c0, 0x1d2d3),
(0x1d2e0, 0x1d2f3),
(0x1d300, 0x1d356),
(0x1d360, 0x1d378),
(0x1d400, 0x1d454),
(0x1d456, 0x1d49c),
(0x1d49e, 0x1d49f),
(0x1d4a2, 0x1d4a2),
(0x1d4a5, 0x1d4a6),
(0x1d4a9, 0x1d4ac),
(0x1d4ae, 0x1d4b9),
(0x1d4bb, 0x1d4bb),
(0x1d4bd, 0x1d4c3),
(0x1d4c5, 0x1d505),
(0x1d507, 0x1d50a),
(0x1d50d, 0x1d514),
(0x1d516, 0x1d51c),
(0x1d51e, 0x1d539),
(0x1d53b, 0x1d53e),
(0x1d540, 0x1d544),
(0x1d546, 0x1d546),
(0x1d54a, 0x1d550),
(0x1d552, 0x1d6a5),
(0x1d6a8, 0x1d7cb),
(0x1d7ce, 0x1da8b),
(0x1da9b, 0x1da9f),
(0x1daa1, 0x1daaf),
(0x1df00, 0x1df1e),
(0x1df25, 0x1df2a),
(0x1e000, 0x1e006),
(0x1e008, 0x1e018),
(0x1e01b, 0x1e021),
(0x1e023, 0x1e024),
(0x1e026, 0x1e02a),
(0x1e030, 0x1e06d),
(0x1e08f, 0x1e08f),
(0x1e100, 0x1e12c),
(0x1e130, 0x1e13d),
(0x1e140, 0x1e149),
(0x1e14e, 0x1e14f),
(0x1e290, 0x1e2ae),
(0x1e2c0, 0x1e2f9),
(0x1e2ff, 0x1e2ff),
(0x1e4d0, 0x1e4f9),
(0x1e7e0, 0x1e7e6),
(0x1e7e8, 0x1e7eb),
(0x1e7ed, 0x1e7ee),
(0x1e7f0, 0x1e7fe),
(0x1e800, 0x1e8c4),
(0x1e8c7, 0x1e8d6),
(0x1e900, 0x1e94b),
(0x1e950, 0x1e959),
(0x1e95e, 0x1e95f),
(0x1ec71, 0x1ecb4),
(0x1ed01, 0x1ed3d),
(0x1ee00, 0x1ee03),
(0x1ee05, 0x1ee1f),
(0x1ee21, 0x1ee22),
(0x1ee24, 0x1ee24),
(0x1ee27, 0x1ee27),
(0x1ee29, 0x1ee32),
(0x1ee34, 0x1ee37),
(0x1ee39, 0x1ee39),
(0x1ee3b, 0x1ee3b),
(0x1ee42, 0x1ee42),
(0x1ee47, 0x1ee47),
(0x1ee49, 0x1ee49),
(0x1ee4b, 0x1ee4b),
(0x1ee4d, 0x1ee4f),
(0x1ee51, 0x1ee52),
(0x1ee54, 0x1ee54),
(0x1ee57, 0x1ee57),
(0x1ee59, 0x1ee59),
(0x1ee5b, 0x1ee5b),
(0x1ee5d, 0x1ee5d),
(0x1ee5f, 0x1ee5f),
(0x1ee61, 0x1ee62),
(0x1ee64, 0x1ee64),
(0x1ee67, 0x1ee6a),
(0x1ee6c, 0x1ee72),
(0x1ee74, 0x1ee77),
(0x1ee79, 0x1ee7c),
(0x1ee7e, 0x1ee7e),
(0x1ee80, 0x1ee89),
(0x1ee8b, 0x1ee9b),
(0x1eea1, 0x1eea3),
(0x1eea5, 0x1eea9),
(0x1eeab, 0x1eebb),
(0x1eef0, 0x1eef1),
(0x1f000, 0x1f02b),
(0x1f030, 0x1f093),
(0x1f0a0, 0x1f0ae),
(0x1f0b1, 0x1f0bf),
(0x1f0c1, 0x1f0cf),
(0x1f0d1, 0x1f0f5),
(0x1f100, 0x1f1ad),
(0x1f1e6, 0x1f202),
(0x1f210, 0x1f23b),
(0x1f240, 0x1f248),
(0x1f250, 0x1f251),
(0x1f260, 0x1f265),
(0x1f300, 0x1f6d7),
(0x1f6dc, 0x1f6ec),
(0x1f6f0, 0x1f6fc),
(0x1f700, 0x1f776),
(0x1f77b, 0x1f7d9),
(0x1f7e0, 0x1f7eb),
(0x1f7f0, 0x1f7f0),
(0x1f800, 0x1f80b),
(0x1f810, 0x1f847),
(0x1f850, 0x1f859),
(0x1f860, 0x1f887),
(0x1f890, 0x1f8ad),
(0x1f8b0, 0x1f8b1),
(0x1f900, 0x1fa53),
(0x1fa60, 0x1fa6d),
(0x1fa70, 0x1fa7c),
(0x1fa80, 0x1fa88),
(0x1fa90, 0x1fabd),
(0x1fabf, 0x1fac5),
(0x1face, 0x1fadb),
(0x1fae0, 0x1fae8),
(0x1faf0, 0x1faf8),
(0x1fb00, 0x1fb92),
(0x1fb94, 0x1fbca),
(0x1fbf0, 0x1fbf9),
(0x20000, 0x2a6df),
(0x2a700, 0x2b739),
(0x2b740, 0x2b81d),
(0x2b820, 0x2cea1),
(0x2ceb0, 0x2ebe0),
(0x2f800, 0x2fa1d),
(0x30000, 0x3134a),
(0x31350, 0x323af),
(0xe0001, 0xe0001),
(0xe0020, 0xe007f),
(0xe0100, 0xe01ef),
];
pub fn is_non_ascii_identifier_character(code_point: u32) -> bool {
NON_ASCII_IDENTIFIER_RANGES
.binary_search_by(|(start, end)| {
if code_point < *start {
std::cmp::Ordering::Greater
} else if code_point > *end {
std::cmp::Ordering::Less
} else {
std::cmp::Ordering::Equal
}
})
.is_ok()
}
#[cfg(test)]
mod tests {
use super::*;
#[test]
fn test_latin_extended() {
assert!(is_non_ascii_identifier_character(0x100));
assert!(is_non_ascii_identifier_character(0x17f));
}
#[test]
fn test_greek() {
assert!(is_non_ascii_identifier_character(0x37a));
assert!(is_non_ascii_identifier_character(0x37f));
}
#[test]
fn test_cjk_unified() {
assert!(is_non_ascii_identifier_character(0x4e00));
assert!(is_non_ascii_identifier_character(0x9fff));
}
#[test]
fn test_hangul_syllables() {
assert!(is_non_ascii_identifier_character(0xac00));
assert!(is_non_ascii_identifier_character(0xd7a3));
}
#[test]
fn test_hiragana() {
assert!(is_non_ascii_identifier_character(0x3041));
assert!(is_non_ascii_identifier_character(0x3096));
}
#[test]
fn test_katakana() {
assert!(is_non_ascii_identifier_character(0x30a1));
assert!(is_non_ascii_identifier_character(0x30ff));
}
#[test]
fn test_no_break_space() {
assert!(is_non_ascii_identifier_character(0xa0));
}
#[test]
fn test_supplementary_plane() {
assert!(is_non_ascii_identifier_character(0x10000));
assert!(is_non_ascii_identifier_character(0x1000b));
assert!(is_non_ascii_identifier_character(0x10080));
}
#[test]
fn test_cjk_extension_b() {
assert!(is_non_ascii_identifier_character(0x20000));
assert!(is_non_ascii_identifier_character(0x2a6df));
}
#[test]
fn test_tags_language_tag() {
assert!(is_non_ascii_identifier_character(0xe0001));
assert!(is_non_ascii_identifier_character(0xe0020));
assert!(is_non_ascii_identifier_character(0xe007f));
}
#[test]
fn test_variation_selectors() {
assert!(is_non_ascii_identifier_character(0xe0100));
assert!(is_non_ascii_identifier_character(0xe01ef));
}
#[test]
fn test_not_in_range() {
assert!(!is_non_ascii_identifier_character(0x378)); assert!(!is_non_ascii_identifier_character(0x38b)); assert!(!is_non_ascii_identifier_character(0x38d)); }
#[test]
fn test_ascii_not_matched() {
assert!(!is_non_ascii_identifier_character(0x41)); assert!(!is_non_ascii_identifier_character(0x7a)); assert!(!is_non_ascii_identifier_character(0x30)); assert!(!is_non_ascii_identifier_character(0x7f)); }
#[test]
fn test_surrogate_range_not_matched() {
assert!(!is_non_ascii_identifier_character(0xD800));
assert!(!is_non_ascii_identifier_character(0xDFFF));
}
#[test]
fn test_private_use_area() {
assert!(!is_non_ascii_identifier_character(0xE000));
assert!(!is_non_ascii_identifier_character(0xE001));
}
#[test]
fn test_single_point_range() {
assert!(is_non_ascii_identifier_character(0x38c));
assert!(is_non_ascii_identifier_character(0x85e));
assert!(is_non_ascii_identifier_character(0x9b2));
assert!(is_non_ascii_identifier_character(0xad0));
}
#[test]
fn test_zero_not_matched() {
assert!(!is_non_ascii_identifier_character(0x0));
assert!(!is_non_ascii_identifier_character(0x99));
}
#[test]
fn test_boundary_cases() {
assert!(is_non_ascii_identifier_character(0xa0));
assert!(is_non_ascii_identifier_character(0x377));
assert!(!is_non_ascii_identifier_character(0x99)); assert!(!is_non_ascii_identifier_character(0x378)); }
#[test]
fn test_high_code_points_not_in_map() {
assert!(!is_non_ascii_identifier_character(0xFFFFF));
assert!(!is_non_ascii_identifier_character(0xF0001));
assert!(!is_non_ascii_identifier_character(0x10FFFF));
}
}