// Written in the D programming language. /++ Functions which operate on Unicode characters. For functions which operate on ASCII characters and ignore Unicode characters, see $(LINK2 std_ascii.html, std.ascii). References: $(WEB www.digitalmars.com/d/ascii-table.html, ASCII Table), $(WEB en.wikipedia.org/wiki/Unicode, Wikipedia), $(WEB www.unicode.org, The Unicode Consortium) Trademarks: Unicode(tm) is a trademark of Unicode, Inc. Macros: WIKI=Phobos/StdUni Copyright: Copyright 2000 - License: $(WEB www.boost.org/LICENSE_1_0.txt, Boost License 1.0). Authors: $(WEB digitalmars.com, Walter Bright), Jonathan M Davis, and Kenji Hara Source: $(PHOBOSSRC std/_uni.d) +/ module std.uni; static import std.ascii; enum dchar lineSep = '\u2028'; /// UTF line separator enum dchar paraSep = '\u2029'; /// UTF paragraph separator /++ Whether or not $(D c) is a Unicode whitespace character. (general Unicode category: Part of C0(tab, vertical tab, form feed, carriage return, and linefeed characters), Zs, Zl, Zp, and NEL(U+0085)) +/ bool isWhite(dchar c) @safe pure nothrow { return std.ascii.isWhite(c) || c == lineSep || c == paraSep || c == '\u0085' || c == '\u00A0' || c == '\u1680' || c == '\u180E' || (c >= '\u2000' && c <= '\u200A') || c == '\u202F' || c == '\u205F' || c == '\u3000'; } /++ Return whether $(D c) is a Unicode lowercase character. +/ bool isLower(dchar c) @safe pure nothrow { if(std.ascii.isASCII(c)) return std.ascii.isLower(c); return isAlpha(c) && c == toLower(c); } /++ Return whether $(D c) is a Unicode uppercase character. +/ bool isUpper(dchar c) @safe pure nothrow { if(std.ascii.isASCII(c)) return std.ascii.isUpper(c); return isAlpha(c) && c == toUpper(c); } /++ If $(D c) is a Unicode uppercase character, then its lowercase equivalent is returned. Otherwise $(D c) is returned. +/ dchar toLower(dchar c) @safe pure nothrow { if(std.ascii.isUpper(c)) c += 32; else if(c >= 0x00C0) { if((c >= 0x00C0 && c <= 0x00D6) || (c >= 0x00D8 && c<=0x00DE)) { c += 32; } else if((c >= 0x0100 && c < 0x0138) || (c > 0x0149 && c < 0x0178)) { if(c == 0x0130) c = 0x0069; else if((c & 1) == 0) ++c; } else if(c == 0x0178) c = 0x00FF; else if((c >= 0x0139 && c < 0x0149) || (c > 0x0178 && c < 0x017F)) { if(c & 1) ++c; } else if(c >= 0x0200 && c <= 0x0217) { if((c & 1) == 0) ++c; } else if((c >= 0x0401 && c <= 0x040C) || (c>= 0x040E && c <= 0x040F)) { c += 80; } else if(c >= 0x0410 && c <= 0x042F) c += 32; else if(c >= 0x0460 && c <= 0x047F) { if((c & 1) == 0) ++c; } else if(c >= 0x0531 && c <= 0x0556) c += 48; else if(c >= 0x10A0 && c <= 0x10C5) c += 48; else if(c >= 0xFF21 && c <= 0xFF3A) c += 32; } return c; } /++ If $(D c) is a Unicode lowercase character, then its uppercase equivalent is returned. Otherwise $(D c) is returned. +/ dchar toUpper(dchar c) @safe pure nothrow { if(std.ascii.isLower(c)) c -= 32; else if(c >= 0x00E0) { if((c >= 0x00E0 && c <= 0x00F6) || (c >= 0x00F8 && c <= 0x00FE)) { c -= 32; } else if(c == 0x00FF) c = 0x0178; else if((c >= 0x0100 && c < 0x0138) || (c > 0x0149 && c < 0x0178)) { if(c == 0x0131) c = 0x0049; else if(c & 1) --c; } else if((c >= 0x0139 && c < 0x0149) || (c > 0x0178 && c < 0x017F)) { if((c & 1) == 0) --c; } else if(c == 0x017F) c = 0x0053; else if(c >= 0x0200 && c <= 0x0217) { if(c & 1) --c; } else if(c >= 0x0430 && c<= 0x044F) c -= 32; else if((c >= 0x0451 && c <= 0x045C) || (c >=0x045E && c<= 0x045F)) { c -= 80; } else if(c >= 0x0460 && c <= 0x047F) { if(c & 1) --c; } else if(c >= 0x0561 && c < 0x0587) c -= 48; else if(c >= 0xFF41 && c <= 0xFF5A) c -= 32; } return c; } /++ Returns whether $(D c) is a Unicode alpha character (general Unicode category: Lu, Ll, Lt, Lm, and Lo). Standards: Unicode 5.0.0. +/ bool isAlpha(dchar c) @safe pure nothrow { static immutable dchar[2][] table = [ [ 'A', 'Z' ], [ 'a', 'z' ], [ 0x00AA, 0x00AA ], [ 0x00B5, 0x00B5 ], [ 0x00BA, 0x00BA ], [ 0x00C0, 0x00D6 ], [ 0x00D8, 0x00F6 ], [ 0x00F8, 0x02C1 ], [ 0x02C6, 0x02D1 ], [ 0x02E0, 0x02E4 ], [ 0x02EE, 0x02EE ], [ 0x037A, 0x037D ], [ 0x0386, 0x0386 ], [ 0x0388, 0x038A ], [ 0x038C, 0x038C ], [ 0x038E, 0x03A1 ], [ 0x03A3, 0x03CE ], [ 0x03D0, 0x03F5 ], [ 0x03F7, 0x0481 ], [ 0x048A, 0x0513 ], [ 0x0531, 0x0556 ], [ 0x0559, 0x0559 ], [ 0x0561, 0x0587 ], [ 0x05D0, 0x05EA ], [ 0x05F0, 0x05F2 ], [ 0x0621, 0x063A ], [ 0x0640, 0x064A ], [ 0x066E, 0x066F ], [ 0x0671, 0x06D3 ], [ 0x06D5, 0x06D5 ], [ 0x06E5, 0x06E6 ], [ 0x06EE, 0x06EF ], [ 0x06FA, 0x06FC ], [ 0x06FF, 0x06FF ], [ 0x0710, 0x0710 ], [ 0x0712, 0x072F ], [ 0x074D, 0x076D ], [ 0x0780, 0x07A5 ], [ 0x07B1, 0x07B1 ], [ 0x07CA, 0x07EA ], [ 0x07F4, 0x07F5 ], [ 0x07FA, 0x07FA ], [ 0x0904, 0x0939 ], [ 0x093D, 0x093D ], [ 0x0950, 0x0950 ], [ 0x0958, 0x0961 ], [ 0x097B, 0x097F ], [ 0x0985, 0x098C ], [ 0x098F, 0x0990 ], [ 0x0993, 0x09A8 ], [ 0x09AA, 0x09B0 ], [ 0x09B2, 0x09B2 ], [ 0x09B6, 0x09B9 ], [ 0x09BD, 0x09BD ], [ 0x09CE, 0x09CE ], [ 0x09DC, 0x09DD ], [ 0x09DF, 0x09E1 ], [ 0x09F0, 0x09F1 ], [ 0x0A05, 0x0A0A ], [ 0x0A0F, 0x0A10 ], [ 0x0A13, 0x0A28 ], [ 0x0A2A, 0x0A30 ], [ 0x0A32, 0x0A33 ], [ 0x0A35, 0x0A36 ], [ 0x0A38, 0x0A39 ], [ 0x0A59, 0x0A5C ], [ 0x0A5E, 0x0A5E ], [ 0x0A72, 0x0A74 ], [ 0x0A85, 0x0A8D ], [ 0x0A8F, 0x0A91 ], [ 0x0A93, 0x0AA8 ], [ 0x0AAA, 0x0AB0 ], [ 0x0AB2, 0x0AB3 ], [ 0x0AB5, 0x0AB9 ], [ 0x0ABD, 0x0ABD ], [ 0x0AD0, 0x0AD0 ], [ 0x0AE0, 0x0AE1 ], [ 0x0B05, 0x0B0C ], [ 0x0B0F, 0x0B10 ], [ 0x0B13, 0x0B28 ], [ 0x0B2A, 0x0B30 ], [ 0x0B32, 0x0B33 ], [ 0x0B35, 0x0B39 ], [ 0x0B3D, 0x0B3D ], [ 0x0B5C, 0x0B5D ], [ 0x0B5F, 0x0B61 ], [ 0x0B71, 0x0B71 ], [ 0x0B83, 0x0B83 ], [ 0x0B85, 0x0B8A ], [ 0x0B8E, 0x0B90 ], [ 0x0B92, 0x0B95 ], [ 0x0B99, 0x0B9A ], [ 0x0B9C, 0x0B9C ], [ 0x0B9E, 0x0B9F ], [ 0x0BA3, 0x0BA4 ], [ 0x0BA8, 0x0BAA ], [ 0x0BAE, 0x0BB9 ], [ 0x0C05, 0x0C0C ], [ 0x0C0E, 0x0C10 ], [ 0x0C12, 0x0C28 ], [ 0x0C2A, 0x0C33 ], [ 0x0C35, 0x0C39 ], [ 0x0C60, 0x0C61 ], [ 0x0C85, 0x0C8C ], [ 0x0C8E, 0x0C90 ], [ 0x0C92, 0x0CA8 ], [ 0x0CAA, 0x0CB3 ], [ 0x0CB5, 0x0CB9 ], [ 0x0CBD, 0x0CBD ], [ 0x0CDE, 0x0CDE ], [ 0x0CE0, 0x0CE1 ], [ 0x0D05, 0x0D0C ], [ 0x0D0E, 0x0D10 ], [ 0x0D12, 0x0D28 ], [ 0x0D2A, 0x0D39 ], [ 0x0D60, 0x0D61 ], [ 0x0D85, 0x0D96 ], [ 0x0D9A, 0x0DB1 ], [ 0x0DB3, 0x0DBB ], [ 0x0DBD, 0x0DBD ], [ 0x0DC0, 0x0DC6 ], [ 0x0E01, 0x0E30 ], [ 0x0E32, 0x0E33 ], [ 0x0E40, 0x0E46 ], [ 0x0E81, 0x0E82 ], [ 0x0E84, 0x0E84 ], [ 0x0E87, 0x0E88 ], [ 0x0E8A, 0x0E8A ], [ 0x0E8D, 0x0E8D ], [ 0x0E94, 0x0E97 ], [ 0x0E99, 0x0E9F ], [ 0x0EA1, 0x0EA3 ], [ 0x0EA5, 0x0EA5 ], [ 0x0EA7, 0x0EA7 ], [ 0x0EAA, 0x0EAB ], [ 0x0EAD, 0x0EB0 ], [ 0x0EB2, 0x0EB3 ], [ 0x0EBD, 0x0EBD ], [ 0x0EC0, 0x0EC4 ], [ 0x0EC6, 0x0EC6 ], [ 0x0EDC, 0x0EDD ], [ 0x0F00, 0x0F00 ], [ 0x0F40, 0x0F47 ], [ 0x0F49, 0x0F6A ], [ 0x0F88, 0x0F8B ], [ 0x1000, 0x1021 ], [ 0x1023, 0x1027 ], [ 0x1029, 0x102A ], [ 0x1050, 0x1055 ], [ 0x10A0, 0x10C5 ], [ 0x10D0, 0x10FA ], [ 0x10FC, 0x10FC ], [ 0x1100, 0x1159 ], [ 0x115F, 0x11A2 ], [ 0x11A8, 0x11F9 ], [ 0x1200, 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 ], [ 0x1380, 0x138F ], [ 0x13A0, 0x13F4 ], [ 0x1401, 0x166C ], [ 0x166F, 0x1676 ], [ 0x1681, 0x169A ], [ 0x16A0, 0x16EA ], [ 0x1700, 0x170C ], [ 0x170E, 0x1711 ], [ 0x1720, 0x1731 ], [ 0x1740, 0x1751 ], [ 0x1760, 0x176C ], [ 0x176E, 0x1770 ], [ 0x1780, 0x17B3 ], [ 0x17D7, 0x17D7 ], [ 0x17DC, 0x17DC ], [ 0x1820, 0x1877 ], [ 0x1880, 0x18A8 ], [ 0x1900, 0x191C ], [ 0x1950, 0x196D ], [ 0x1970, 0x1974 ], [ 0x1980, 0x19A9 ], [ 0x19C1, 0x19C7 ], [ 0x1A00, 0x1A16 ], [ 0x1B05, 0x1B33 ], [ 0x1B45, 0x1B4B ], [ 0x1D00, 0x1DBF ], [ 0x1E00, 0x1E9B ], [ 0x1EA0, 0x1EF9 ], [ 0x1F00, 0x1F15 ], [ 0x1F18, 0x1F1D ], [ 0x1F20, 0x1F45 ], [ 0x1F48, 0x1F4D ], [ 0x1F50, 0x1F57 ], [ 0x1F59, 0x1F59 ], [ 0x1F5B, 0x1F5B ], [ 0x1F5D, 0x1F5D ], [ 0x1F5F, 0x1F7D ], [ 0x1F80, 0x1FB4 ], [ 0x1FB6, 0x1FBC ], [ 0x1FBE, 0x1FBE ], [ 0x1FC2, 0x1FC4 ], [ 0x1FC6, 0x1FCC ], [ 0x1FD0, 0x1FD3 ], [ 0x1FD6, 0x1FDB ], [ 0x1FE0, 0x1FEC ], [ 0x1FF2, 0x1FF4 ], [ 0x1FF6, 0x1FFC ], [ 0x2071, 0x2071 ], [ 0x207F, 0x207F ], [ 0x2090, 0x2094 ], [ 0x2102, 0x2102 ], [ 0x2107, 0x2107 ], [ 0x210A, 0x2113 ], [ 0x2115, 0x2115 ], [ 0x2119, 0x211D ], [ 0x2124, 0x2124 ], [ 0x2126, 0x2126 ], [ 0x2128, 0x2128 ], [ 0x212A, 0x212D ], [ 0x212F, 0x2139 ], [ 0x213C, 0x213F ], [ 0x2145, 0x2149 ], [ 0x214E, 0x214E ], [ 0x2183, 0x2184 ], [ 0x2C00, 0x2C2E ], [ 0x2C30, 0x2C5E ], [ 0x2C60, 0x2C6C ], [ 0x2C74, 0x2C77 ], [ 0x2C80, 0x2CE4 ], [ 0x2D00, 0x2D25 ], [ 0x2D30, 0x2D65 ], [ 0x2D6F, 0x2D6F ], [ 0x2D80, 0x2D96 ], [ 0x2DA0, 0x2DA6 ], [ 0x2DA8, 0x2DAE ], [ 0x2DB0, 0x2DB6 ], [ 0x2DB8, 0x2DBE ], [ 0x2DC0, 0x2DC6 ], [ 0x2DC8, 0x2DCE ], [ 0x2DD0, 0x2DD6 ], [ 0x2DD8, 0x2DDE ], [ 0x3005, 0x3006 ], [ 0x3031, 0x3035 ], [ 0x303B, 0x303C ], [ 0x3041, 0x3096 ], [ 0x309D, 0x309F ], [ 0x30A1, 0x30FA ], [ 0x30FC, 0x30FF ], [ 0x3105, 0x312C ], [ 0x3131, 0x318E ], [ 0x31A0, 0x31B7 ], [ 0x31F0, 0x31FF ], [ 0x3400, 0x4DB5 ], [ 0x4E00, 0x9FBB ], [ 0xA000, 0xA48C ], [ 0xA717, 0xA71A ], [ 0xA800, 0xA801 ], [ 0xA803, 0xA805 ], [ 0xA807, 0xA80A ], [ 0xA80C, 0xA822 ], [ 0xA840, 0xA873 ], [ 0xAC00, 0xD7A3 ], [ 0xF900, 0xFA2D ], [ 0xFA30, 0xFA6A ], [ 0xFA70, 0xFAD9 ], [ 0xFB00, 0xFB06 ], [ 0xFB13, 0xFB17 ], [ 0xFB1D, 0xFB1D ], [ 0xFB1F, 0xFB28 ], [ 0xFB2A, 0xFB36 ], [ 0xFB38, 0xFB3C ], [ 0xFB3E, 0xFB3E ], [ 0xFB40, 0xFB41 ], [ 0xFB43, 0xFB44 ], [ 0xFB46, 0xFBB1 ], [ 0xFBD3, 0xFD3D ], [ 0xFD50, 0xFD8F ], [ 0xFD92, 0xFDC7 ], [ 0xFDF0, 0xFDFB ], [ 0xFE70, 0xFE74 ], [ 0xFE76, 0xFEFC ], [ 0xFF21, 0xFF3A ], [ 0xFF41, 0xFF5A ], [ 0xFF66, 0xFFBE ], [ 0xFFC2, 0xFFC7 ], [ 0xFFCA, 0xFFCF ], [ 0xFFD2, 0xFFD7 ], [ 0xFFDA, 0xFFDC ], [ 0x10000, 0x1000B ], [ 0x1000D, 0x10026 ], [ 0x10028, 0x1003A ], [ 0x1003C, 0x1003D ], [ 0x1003F, 0x1004D ], [ 0x10050, 0x1005D ], [ 0x10080, 0x100FA ], [ 0x10300, 0x1031E ], [ 0x10330, 0x10340 ], [ 0x10342, 0x10349 ], [ 0x10380, 0x1039D ], [ 0x103A0, 0x103C3 ], [ 0x103C8, 0x103CF ], [ 0x10400, 0x1049D ], [ 0x10800, 0x10805 ], [ 0x10808, 0x10808 ], [ 0x1080A, 0x10835 ], [ 0x10837, 0x10838 ], [ 0x1083C, 0x1083C ], [ 0x1083F, 0x1083F ], [ 0x10900, 0x10915 ], [ 0x10A00, 0x10A00 ], [ 0x10A10, 0x10A13 ], [ 0x10A15, 0x10A17 ], [ 0x10A19, 0x10A33 ], [ 0x12000, 0x1236E ], [ 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, 0x1D6C0 ], [ 0x1D6C2, 0x1D6DA ], [ 0x1D6DC, 0x1D6FA ], [ 0x1D6FC, 0x1D714 ], [ 0x1D716, 0x1D734 ], [ 0x1D736, 0x1D74E ], [ 0x1D750, 0x1D76E ], [ 0x1D770, 0x1D788 ], [ 0x1D78A, 0x1D7A8 ], [ 0x1D7AA, 0x1D7C2 ], [ 0x1D7C4, 0x1D7CB ], [ 0x20000, 0x2A6D6 ], [ 0x2F800, 0x2FA1D ], ]; // optimization if(c < 0xAA) { if(c < 'A') return false; if(c <= 'Z') return true; if(c < 'a') return false; if(c <= 'z') return true; return false; } return binarySearch!table(c); } unittest { for(dchar c = 0; c < 0x80; ++c) { if(c >= 'A' && c <= 'Z') assert(isAlpha(c)); else if(c >= 'a' && c <= 'z') assert(isAlpha(c)); else assert(!isAlpha(c)); } } /++ Returns whether $(D c) is a Unicode mark (general Unicode category: Mn, Me, Mc). Standards: Unicode 6.0.0. +/ bool isMark(dchar c) @safe pure nothrow { static immutable dchar[2][] tableMn = [ [ 0x0300, 0x036F ], [ 0x0483, 0x0487 ], [ 0x0591, 0x05BD ], [ 0x05BF, 0x05BF ], [ 0x05C1, 0x05C2 ], [ 0x05C4, 0x05C5 ], [ 0x05C7, 0x05C7 ], [ 0x0610, 0x061A ], [ 0x064B, 0x065F ], [ 0x0670, 0x0670 ], [ 0x06D6, 0x06DC ], [ 0x06DF, 0x06E4 ], [ 0x06E7, 0x06E8 ], [ 0x06EA, 0x06ED ], [ 0x0711, 0x0711 ], [ 0x0730, 0x074A ], [ 0x07A6, 0x07B0 ], [ 0x07EB, 0x07F3 ], [ 0x0816, 0x0819 ], [ 0x081B, 0x0823 ], [ 0x0825, 0x0827 ], [ 0x0829, 0x082D ], [ 0x0859, 0x085B ], [ 0x0900, 0x0902 ], [ 0x093A, 0x093A ], [ 0x093C, 0x093C ], [ 0x0941, 0x0948 ], [ 0x094D, 0x094D ], [ 0x0951, 0x0957 ], [ 0x0962, 0x0963 ], [ 0x0981, 0x0981 ], [ 0x09BC, 0x09BC ], [ 0x09C1, 0x09C4 ], [ 0x09CD, 0x09CD ], [ 0x09E2, 0x09E3 ], [ 0x0A01, 0x0A02 ], [ 0x0A3C, 0x0A3C ], [ 0x0A41, 0x0A42 ], [ 0x0A47, 0x0A48 ], [ 0x0A4B, 0x0A4D ], [ 0x0A51, 0x0A51 ], [ 0x0A70, 0x0A71 ], [ 0x0A75, 0x0A75 ], [ 0x0A81, 0x0A82 ], [ 0x0ABC, 0x0ABC ], [ 0x0AC1, 0x0AC5 ], [ 0x0AC7, 0x0AC8 ], [ 0x0ACD, 0x0ACD ], [ 0x0AE2, 0x0AE3 ], [ 0x0B01, 0x0B01 ], [ 0x0B3C, 0x0B3C ], [ 0x0B3F, 0x0B3F ], [ 0x0B41, 0x0B44 ], [ 0x0B4D, 0x0B4D ], [ 0x0B56, 0x0B56 ], [ 0x0B62, 0x0B63 ], [ 0x0B82, 0x0B82 ], [ 0x0BC0, 0x0BC0 ], [ 0x0BCD, 0x0BCD ], [ 0x0C3E, 0x0C40 ], [ 0x0C46, 0x0C48 ], [ 0x0C4A, 0x0C4D ], [ 0x0C55, 0x0C56 ], [ 0x0C62, 0x0C63 ], [ 0x0CBC, 0x0CBC ], [ 0x0CBF, 0x0CBF ], [ 0x0CC6, 0x0CC6 ], [ 0x0CCC, 0x0CCD ], [ 0x0CE2, 0x0CE3 ], [ 0x0D41, 0x0D44 ], [ 0x0D4D, 0x0D4D ], [ 0x0D62, 0x0D63 ], [ 0x0DCA, 0x0DCA ], [ 0x0DD2, 0x0DD4 ], [ 0x0DD6, 0x0DD6 ], [ 0x0E31, 0x0E31 ], [ 0x0E34, 0x0E3A ], [ 0x0E47, 0x0E4E ], [ 0x0EB1, 0x0EB1 ], [ 0x0EB4, 0x0EB9 ], [ 0x0EBB, 0x0EBC ], [ 0x0EC8, 0x0ECD ], [ 0x0F18, 0x0F19 ], [ 0x0F35, 0x0F35 ], [ 0x0F37, 0x0F37 ], [ 0x0F39, 0x0F39 ], [ 0x0F71, 0x0F7E ], [ 0x0F80, 0x0F84 ], [ 0x0F86, 0x0F87 ], [ 0x0F8D, 0x0F97 ], [ 0x0F99, 0x0FBC ], [ 0x0FC6, 0x0FC6 ], [ 0x102D, 0x1030 ], [ 0x1032, 0x1037 ], [ 0x1039, 0x103A ], [ 0x103D, 0x103E ], [ 0x1058, 0x1059 ], [ 0x105E, 0x1060 ], [ 0x1071, 0x1074 ], [ 0x1082, 0x1082 ], [ 0x1085, 0x1086 ], [ 0x108D, 0x108D ], [ 0x109D, 0x109D ], [ 0x135D, 0x135F ], [ 0x1712, 0x1714 ], [ 0x1732, 0x1734 ], [ 0x1752, 0x1753 ], [ 0x1772, 0x1773 ], [ 0x17B7, 0x17BD ], [ 0x17C6, 0x17C6 ], [ 0x17C9, 0x17D3 ], [ 0x17DD, 0x17DD ], [ 0x180B, 0x180D ], [ 0x18A9, 0x18A9 ], [ 0x1920, 0x1922 ], [ 0x1927, 0x1928 ], [ 0x1932, 0x1932 ], [ 0x1939, 0x193B ], [ 0x1A17, 0x1A18 ], [ 0x1A56, 0x1A56 ], [ 0x1A58, 0x1A5E ], [ 0x1A60, 0x1A60 ], [ 0x1A62, 0x1A62 ], [ 0x1A65, 0x1A6C ], [ 0x1A73, 0x1A7C ], [ 0x1A7F, 0x1A7F ], [ 0x1B00, 0x1B03 ], [ 0x1B34, 0x1B34 ], [ 0x1B36, 0x1B3A ], [ 0x1B3C, 0x1B3C ], [ 0x1B42, 0x1B42 ], [ 0x1B6B, 0x1B73 ], [ 0x1B80, 0x1B81 ], [ 0x1BA2, 0x1BA5 ], [ 0x1BA8, 0x1BA9 ], [ 0x1BE6, 0x1BE6 ], [ 0x1BE8, 0x1BE9 ], [ 0x1BED, 0x1BED ], [ 0x1BEF, 0x1BF1 ], [ 0x1C2C, 0x1C33 ], [ 0x1C36, 0x1C37 ], [ 0x1CD0, 0x1CD2 ], [ 0x1CD4, 0x1CE0 ], [ 0x1CE2, 0x1CE8 ], [ 0x1CED, 0x1CED ], [ 0x1DC0, 0x1DE6 ], [ 0x1DFC, 0x1DFF ], [ 0x20D0, 0x20DC ], [ 0x20E1, 0x20E1 ], [ 0x20E5, 0x20F0 ], [ 0x2CEF, 0x2CF1 ], [ 0x2D7F, 0x2D7F ], [ 0x2DE0, 0x2DFF ], [ 0x302A, 0x302F ], [ 0x3099, 0x309A ], [ 0xA66F, 0xA66F ], [ 0xA67C, 0xA67D ], [ 0xA6F0, 0xA6F1 ], [ 0xA802, 0xA802 ], [ 0xA806, 0xA806 ], [ 0xA80B, 0xA80B ], [ 0xA825, 0xA826 ], [ 0xA8C4, 0xA8C4 ], [ 0xA8E0, 0xA8F1 ], [ 0xA926, 0xA92D ], [ 0xA947, 0xA951 ], [ 0xA980, 0xA982 ], [ 0xA9B3, 0xA9B3 ], [ 0xA9B6, 0xA9B9 ], [ 0xA9BC, 0xA9BC ], [ 0xAA29, 0xAA2E ], [ 0xAA31, 0xAA32 ], [ 0xAA35, 0xAA36 ], [ 0xAA43, 0xAA43 ], [ 0xAA4C, 0xAA4C ], [ 0xAAB0, 0xAAB0 ], [ 0xAAB2, 0xAAB4 ], [ 0xAAB7, 0xAAB8 ], [ 0xAABE, 0xAABF ], [ 0xAAC1, 0xAAC1 ], [ 0xABE5, 0xABE5 ], [ 0xABE8, 0xABE8 ], [ 0xABED, 0xABED ], [ 0xFB1E, 0xFB1E ], [ 0xFE00, 0xFE0F ], [ 0xFE20, 0xFE26 ], [ 0x101FD, 0x101FD ], [ 0x10A01, 0x10A03 ], [ 0x10A05, 0x10A06 ], [ 0x10A0C, 0x10A0F ], [ 0x10A38, 0x10A3A ], [ 0x10A3F, 0x10A3F ], [ 0x11001, 0x11001 ], [ 0x11038, 0x11046 ], [ 0x11080, 0x11081 ], [ 0x110B3, 0x110B6 ], [ 0x110B9, 0x110BA ], [ 0x1D167, 0x1D169 ], [ 0x1D17B, 0x1D182 ], [ 0x1D185, 0x1D18B ], [ 0x1D1AA, 0x1D1AD ], [ 0x1D242, 0x1D244 ], [ 0xE0100, 0xE01EF ], ]; static immutable dchar[2][] tableMe = [ [ 0x0488, 0x0489 ], [ 0x20DD, 0x20E0 ], [ 0x20E2, 0x20E4 ], [ 0xA670, 0xA672 ], ]; static immutable dchar[2][] tableMc = [ [ 0x0903, 0x0903 ], [ 0x093B, 0x093B ], [ 0x093E, 0x0940 ], [ 0x0949, 0x094C ], [ 0x094E, 0x094F ], [ 0x0982, 0x0983 ], [ 0x09BE, 0x09C0 ], [ 0x09C7, 0x09C8 ], [ 0x09CB, 0x09CC ], [ 0x09D7, 0x09D7 ], [ 0x0A03, 0x0A03 ], [ 0x0A3E, 0x0A40 ], [ 0x0A83, 0x0A83 ], [ 0x0ABE, 0x0AC0 ], [ 0x0AC9, 0x0AC9 ], [ 0x0ACB, 0x0ACC ], [ 0x0B02, 0x0B03 ], [ 0x0B3E, 0x0B3E ], [ 0x0B40, 0x0B40 ], [ 0x0B47, 0x0B48 ], [ 0x0B4B, 0x0B4C ], [ 0x0B57, 0x0B57 ], [ 0x0BBE, 0x0BBF ], [ 0x0BC1, 0x0BC2 ], [ 0x0BC6, 0x0BC8 ], [ 0x0BCA, 0x0BCC ], [ 0x0BD7, 0x0BD7 ], [ 0x0C01, 0x0C03 ], [ 0x0C41, 0x0C44 ], [ 0x0C82, 0x0C83 ], [ 0x0CBE, 0x0CBE ], [ 0x0CC0, 0x0CC4 ], [ 0x0CC7, 0x0CC8 ], [ 0x0CCA, 0x0CCB ], [ 0x0CD5, 0x0CD6 ], [ 0x0D02, 0x0D03 ], [ 0x0D3E, 0x0D40 ], [ 0x0D46, 0x0D48 ], [ 0x0D4A, 0x0D4C ], [ 0x0D57, 0x0D57 ], [ 0x0D82, 0x0D83 ], [ 0x0DCF, 0x0DD1 ], [ 0x0DD8, 0x0DDF ], [ 0x0DF2, 0x0DF3 ], [ 0x0F3E, 0x0F3F ], [ 0x0F7F, 0x0F7F ], [ 0x102B, 0x102C ], [ 0x1031, 0x1031 ], [ 0x1038, 0x1038 ], [ 0x103B, 0x103C ], [ 0x1056, 0x1057 ], [ 0x1062, 0x1064 ], [ 0x1067, 0x106D ], [ 0x1083, 0x1084 ], [ 0x1087, 0x108C ], [ 0x108F, 0x108F ], [ 0x109A, 0x109C ], [ 0x17B6, 0x17B6 ], [ 0x17BE, 0x17C5 ], [ 0x17C7, 0x17C8 ], [ 0x1923, 0x1926 ], [ 0x1929, 0x192B ], [ 0x1930, 0x1931 ], [ 0x1933, 0x1938 ], [ 0x19B0, 0x19C0 ], [ 0x19C8, 0x19C9 ], [ 0x1A19, 0x1A1B ], [ 0x1A55, 0x1A55 ], [ 0x1A57, 0x1A57 ], [ 0x1A61, 0x1A61 ], [ 0x1A63, 0x1A64 ], [ 0x1A6D, 0x1A72 ], [ 0x1B04, 0x1B04 ], [ 0x1B35, 0x1B35 ], [ 0x1B3B, 0x1B3B ], [ 0x1B3D, 0x1B41 ], [ 0x1B43, 0x1B44 ], [ 0x1B82, 0x1B82 ], [ 0x1BA1, 0x1BA1 ], [ 0x1BA6, 0x1BA7 ], [ 0x1BAA, 0x1BAA ], [ 0x1BE7, 0x1BE7 ], [ 0x1BEA, 0x1BEC ], [ 0x1BEE, 0x1BEE ], [ 0x1BF2, 0x1BF3 ], [ 0x1C24, 0x1C2B ], [ 0x1C34, 0x1C35 ], [ 0x1CE1, 0x1CE1 ], [ 0x1CF2, 0x1CF2 ], [ 0xA823, 0xA824 ], [ 0xA827, 0xA827 ], [ 0xA880, 0xA881 ], [ 0xA8B4, 0xA8C3 ], [ 0xA952, 0xA953 ], [ 0xA983, 0xA983 ], [ 0xA9B4, 0xA9B5 ], [ 0xA9BA, 0xA9BB ], [ 0xA9BD, 0xA9C0 ], [ 0xAA2F, 0xAA30 ], [ 0xAA33, 0xAA34 ], [ 0xAA4D, 0xAA4D ], [ 0xAA7B, 0xAA7B ], [ 0xABE3, 0xABE4 ], [ 0xABE6, 0xABE7 ], [ 0xABE9, 0xABEA ], [ 0xABEC, 0xABEC ], [ 0x11000, 0x11000 ], [ 0x11002, 0x11002 ], [ 0x11082, 0x11082 ], [ 0x110B0, 0x110B2 ], [ 0x110B7, 0x110B8 ], [ 0x1D165, 0x1D166 ], [ 0x1D16D, 0x1D172 ], ]; return binarySearch!tableMn(c) || binarySearch!tableMe(c) || binarySearch!tableMc(c); } unittest { assert(isMark('\u0300')); assert(isMark('\u0488')); assert(isMark('\u0903')); } /++ Returns whether $(D c) is a Unicode numerical character (general Unicode category: Nd, Nl, No). Standards: Unicode 6.0.0. +/ bool isNumber(dchar c) @safe pure nothrow { static immutable dchar[2][] tableNd = [ [ 0x0030, 0x0039 ], [ 0x0660, 0x0669 ], [ 0x06F0, 0x06F9 ], [ 0x07C0, 0x07C9 ], [ 0x0966, 0x096F ], [ 0x09E6, 0x09EF ], [ 0x0A66, 0x0A6F ], [ 0x0AE6, 0x0AEF ], [ 0x0B66, 0x0B6F ], [ 0x0BE6, 0x0BEF ], [ 0x0C66, 0x0C6F ], [ 0x0CE6, 0x0CEF ], [ 0x0D66, 0x0D6F ], [ 0x0E50, 0x0E59 ], [ 0x0ED0, 0x0ED9 ], [ 0x0F20, 0x0F29 ], [ 0x1040, 0x1049 ], [ 0x1090, 0x1099 ], [ 0x17E0, 0x17E9 ], [ 0x1810, 0x1819 ], [ 0x1946, 0x194F ], [ 0x19D0, 0x19D9 ], [ 0x1A80, 0x1A89 ], [ 0x1A90, 0x1A99 ], [ 0x1B50, 0x1B59 ], [ 0x1BB0, 0x1BB9 ], [ 0x1C40, 0x1C49 ], [ 0x1C50, 0x1C59 ], [ 0xA620, 0xA629 ], [ 0xA8D0, 0xA8D9 ], [ 0xA900, 0xA909 ], [ 0xA9D0, 0xA9D9 ], [ 0xAA50, 0xAA59 ], [ 0xABF0, 0xABF9 ], [ 0xFF10, 0xFF19 ], [ 0x104A0, 0x104A9 ], [ 0x11066, 0x1106F ], [ 0x1D7CE, 0x1D7FF ], ]; static immutable dchar[2][] tableNl = [ [ 0x16EE, 0x16F0 ], [ 0x2160, 0x2182 ], [ 0x2185, 0x2188 ], [ 0x3007, 0x3007 ], [ 0x3021, 0x3029 ], [ 0x3038, 0x303A ], [ 0xA6E6, 0xA6EF ], [ 0x10140, 0x10174 ], [ 0x10341, 0x10341 ], [ 0x1034A, 0x1034A ], [ 0x103D1, 0x103D5 ], [ 0x12400, 0x12462 ], ]; static immutable dchar[2][] tableNo = [ [ 0x00B2, 0x00B3 ], [ 0x00B9, 0x00B9 ], [ 0x00BC, 0x00BE ], [ 0x09F4, 0x09F9 ], [ 0x0B72, 0x0B77 ], [ 0x0BF0, 0x0BF2 ], [ 0x0C78, 0x0C7E ], [ 0x0D70, 0x0D75 ], [ 0x0F2A, 0x0F33 ], [ 0x1369, 0x137C ], [ 0x17F0, 0x17F9 ], [ 0x19DA, 0x19DA ], [ 0x2070, 0x2070 ], [ 0x2074, 0x2079 ], [ 0x2080, 0x2089 ], [ 0x2150, 0x215F ], [ 0x2189, 0x2189 ], [ 0x2460, 0x249B ], [ 0x24EA, 0x24FF ], [ 0x2776, 0x2793 ], [ 0x2CFD, 0x2CFD ], [ 0x3192, 0x3195 ], [ 0x3220, 0x3229 ], [ 0x3251, 0x325F ], [ 0x3280, 0x3289 ], [ 0x32B1, 0x32BF ], [ 0xA830, 0xA835 ], [ 0x10107, 0x10133 ], [ 0x10175, 0x10178 ], [ 0x1018A, 0x1018A ], [ 0x10320, 0x10323 ], [ 0x10858, 0x1085F ], [ 0x10916, 0x1091B ], [ 0x10A40, 0x10A47 ], [ 0x10A7D, 0x10A7E ], [ 0x10B58, 0x10B5F ], [ 0x10B78, 0x10B7F ], [ 0x10E60, 0x10E7E ], [ 0x11052, 0x11065 ], [ 0x1D360, 0x1D371 ], [ 0x1F100, 0x1F10A ], ]; return binarySearch!tableNd(c) || binarySearch!tableNl(c) || binarySearch!tableNo(c); } unittest { for (dchar c = '0'; c < '9'; ++c) { assert(isNumber(c)); } } /++ Returns whether $(D c) is a Unicode punctuation character (general Unicode category: Pd, Ps, Pe, Pc, Po, Pi, Pf). Standards: Unicode 6.0.0. +/ bool isPunctuation(dchar c) @safe pure nothrow { static immutable dchar[2][] tablePd = [ [ 0x002D, 0x002D ], [ 0x058A, 0x058A ], [ 0x05BE, 0x05BE ], [ 0x1400, 0x1400 ], [ 0x1806, 0x1806 ], [ 0x2010, 0x2015 ], [ 0x2E17, 0x2E17 ], [ 0x2E1A, 0x2E1A ], [ 0x301C, 0x301C ], [ 0x3030, 0x3030 ], [ 0x30A0, 0x30A0 ], [ 0xFE31, 0xFE32 ], [ 0xFE58, 0xFE58 ], [ 0xFE63, 0xFE63 ], [ 0xFF0D, 0xFF0D ], ]; static immutable dchar[2][] tablePs = [ [ 0x0028, 0x0028 ], [ 0x005B, 0x005B ], [ 0x007B, 0x007B ], [ 0x0F3A, 0x0F3A ], [ 0x0F3C, 0x0F3C ], [ 0x169B, 0x169B ], [ 0x201A, 0x201A ], [ 0x201E, 0x201E ], [ 0x2045, 0x2045 ], [ 0x207D, 0x207D ], [ 0x208D, 0x208D ], [ 0x2329, 0x2329 ], [ 0x2768, 0x2768 ], [ 0x276A, 0x276A ], [ 0x276C, 0x276C ], [ 0x276E, 0x276E ], [ 0x2770, 0x2770 ], [ 0x2772, 0x2772 ], [ 0x2774, 0x2774 ], [ 0x27C5, 0x27C5 ], [ 0x27E6, 0x27E6 ], [ 0x27E8, 0x27E8 ], [ 0x27EA, 0x27EA ], [ 0x27EC, 0x27EC ], [ 0x27EE, 0x27EE ], [ 0x2983, 0x2983 ], [ 0x2985, 0x2985 ], [ 0x2987, 0x2987 ], [ 0x2989, 0x2989 ], [ 0x298B, 0x298B ], [ 0x298D, 0x298D ], [ 0x298F, 0x298F ], [ 0x2991, 0x2991 ], [ 0x2993, 0x2993 ], [ 0x2995, 0x2995 ], [ 0x2997, 0x2997 ], [ 0x29D8, 0x29D8 ], [ 0x29DA, 0x29DA ], [ 0x29FC, 0x29FC ], [ 0x2E22, 0x2E22 ], [ 0x2E24, 0x2E24 ], [ 0x2E26, 0x2E26 ], [ 0x2E28, 0x2E28 ], [ 0x3008, 0x3008 ], [ 0x300A, 0x300A ], [ 0x300C, 0x300C ], [ 0x300E, 0x300E ], [ 0x3010, 0x3010 ], [ 0x3014, 0x3014 ], [ 0x3016, 0x3016 ], [ 0x3018, 0x3018 ], [ 0x301A, 0x301A ], [ 0x301D, 0x301D ], [ 0xFD3E, 0xFD3E ], [ 0xFE17, 0xFE17 ], [ 0xFE35, 0xFE35 ], [ 0xFE37, 0xFE37 ], [ 0xFE39, 0xFE39 ], [ 0xFE3B, 0xFE3B ], [ 0xFE3D, 0xFE3D ], [ 0xFE3F, 0xFE3F ], [ 0xFE41, 0xFE41 ], [ 0xFE43, 0xFE43 ], [ 0xFE47, 0xFE47 ], [ 0xFE59, 0xFE59 ], [ 0xFE5B, 0xFE5B ], [ 0xFE5D, 0xFE5D ], [ 0xFF08, 0xFF08 ], [ 0xFF3B, 0xFF3B ], [ 0xFF5B, 0xFF5B ], [ 0xFF5F, 0xFF5F ], [ 0xFF62, 0xFF62 ], ]; static immutable dchar[2][] tablePe = [ [ 0x0029, 0x0029 ], [ 0x005D, 0x005D ], [ 0x007D, 0x007D ], [ 0x0F3B, 0x0F3B ], [ 0x0F3D, 0x0F3D ], [ 0x169C, 0x169C ], [ 0x2046, 0x2046 ], [ 0x207E, 0x207E ], [ 0x208E, 0x208E ], [ 0x232A, 0x232A ], [ 0x2769, 0x2769 ], [ 0x276B, 0x276B ], [ 0x276D, 0x276D ], [ 0x276F, 0x276F ], [ 0x2771, 0x2771 ], [ 0x2773, 0x2773 ], [ 0x2775, 0x2775 ], [ 0x27C6, 0x27C6 ], [ 0x27E7, 0x27E7 ], [ 0x27E9, 0x27E9 ], [ 0x27EB, 0x27EB ], [ 0x27ED, 0x27ED ], [ 0x27EF, 0x27EF ], [ 0x2984, 0x2984 ], [ 0x2986, 0x2986 ], [ 0x2988, 0x2988 ], [ 0x298A, 0x298A ], [ 0x298C, 0x298C ], [ 0x298E, 0x298E ], [ 0x2990, 0x2990 ], [ 0x2992, 0x2992 ], [ 0x2994, 0x2994 ], [ 0x2996, 0x2996 ], [ 0x2998, 0x2998 ], [ 0x29D9, 0x29D9 ], [ 0x29DB, 0x29DB ], [ 0x29FD, 0x29FD ], [ 0x2E23, 0x2E23 ], [ 0x2E25, 0x2E25 ], [ 0x2E27, 0x2E27 ], [ 0x2E29, 0x2E29 ], [ 0x3009, 0x3009 ], [ 0x300B, 0x300B ], [ 0x300D, 0x300D ], [ 0x300F, 0x300F ], [ 0x3011, 0x3011 ], [ 0x3015, 0x3015 ], [ 0x3017, 0x3017 ], [ 0x3019, 0x3019 ], [ 0x301B, 0x301B ], [ 0x301E, 0x301F ], [ 0xFD3F, 0xFD3F ], [ 0xFE18, 0xFE18 ], [ 0xFE36, 0xFE36 ], [ 0xFE38, 0xFE38 ], [ 0xFE3A, 0xFE3A ], [ 0xFE3C, 0xFE3C ], [ 0xFE3E, 0xFE3E ], [ 0xFE40, 0xFE40 ], [ 0xFE42, 0xFE42 ], [ 0xFE44, 0xFE44 ], [ 0xFE48, 0xFE48 ], [ 0xFE5A, 0xFE5A ], [ 0xFE5C, 0xFE5C ], [ 0xFE5E, 0xFE5E ], [ 0xFF09, 0xFF09 ], [ 0xFF3D, 0xFF3D ], [ 0xFF5D, 0xFF5D ], [ 0xFF60, 0xFF60 ], [ 0xFF63, 0xFF63 ], ]; static immutable dchar[2][] tablePc = [ [ 0x005F, 0x005F ], [ 0x203F, 0x2040 ], [ 0x2054, 0x2054 ], [ 0xFE33, 0xFE34 ], [ 0xFE4D, 0xFE4F ], [ 0xFF3F, 0xFF3F ], ]; static immutable dchar[2][] tablePo = [ [ 0x0021, 0x0023 ], [ 0x0025, 0x0027 ], [ 0x002A, 0x002A ], [ 0x002C, 0x002C ], [ 0x002E, 0x002F ], [ 0x003A, 0x003B ], [ 0x003F, 0x0040 ], [ 0x005C, 0x005C ], [ 0x00A1, 0x00A1 ], [ 0x00B7, 0x00B7 ], [ 0x00BF, 0x00BF ], [ 0x037E, 0x037E ], [ 0x0387, 0x0387 ], [ 0x055A, 0x055F ], [ 0x0589, 0x0589 ], [ 0x05C0, 0x05C0 ], [ 0x05C3, 0x05C3 ], [ 0x05C6, 0x05C6 ], [ 0x05F3, 0x05F4 ], [ 0x0609, 0x060A ], [ 0x060C, 0x060D ], [ 0x061B, 0x061B ], [ 0x061E, 0x061F ], [ 0x066A, 0x066D ], [ 0x06D4, 0x06D4 ], [ 0x0700, 0x070D ], [ 0x07F7, 0x07F9 ], [ 0x0830, 0x083E ], [ 0x085E, 0x085E ], [ 0x0964, 0x0965 ], [ 0x0970, 0x0970 ], [ 0x0DF4, 0x0DF4 ], [ 0x0E4F, 0x0E4F ], [ 0x0E5A, 0x0E5B ], [ 0x0F04, 0x0F12 ], [ 0x0F85, 0x0F85 ], [ 0x0FD0, 0x0FD4 ], [ 0x0FD9, 0x0FDA ], [ 0x104A, 0x104F ], [ 0x10FB, 0x10FB ], [ 0x1361, 0x1368 ], [ 0x166D, 0x166E ], [ 0x16EB, 0x16ED ], [ 0x1735, 0x1736 ], [ 0x17D4, 0x17D6 ], [ 0x17D8, 0x17DA ], [ 0x1800, 0x1805 ], [ 0x1807, 0x180A ], [ 0x1944, 0x1945 ], [ 0x1A1E, 0x1A1F ], [ 0x1AA0, 0x1AA6 ], [ 0x1AA8, 0x1AAD ], [ 0x1B5A, 0x1B60 ], [ 0x1BFC, 0x1BFF ], [ 0x1C3B, 0x1C3F ], [ 0x1C7E, 0x1C7F ], [ 0x1CD3, 0x1CD3 ], [ 0x2016, 0x2017 ], [ 0x2020, 0x2027 ], [ 0x2030, 0x2038 ], [ 0x203B, 0x203E ], [ 0x2041, 0x2043 ], [ 0x2047, 0x2051 ], [ 0x2053, 0x2053 ], [ 0x2055, 0x205E ], [ 0x2CF9, 0x2CFC ], [ 0x2CFE, 0x2CFF ], [ 0x2D70, 0x2D70 ], [ 0x2E00, 0x2E01 ], [ 0x2E06, 0x2E08 ], [ 0x2E0B, 0x2E0B ], [ 0x2E0E, 0x2E16 ], [ 0x2E18, 0x2E19 ], [ 0x2E1B, 0x2E1B ], [ 0x2E1E, 0x2E1F ], [ 0x2E2A, 0x2E2E ], [ 0x2E30, 0x2E31 ], [ 0x3001, 0x3003 ], [ 0x303D, 0x303D ], [ 0x30FB, 0x30FB ], [ 0xA4FE, 0xA4FF ], [ 0xA60D, 0xA60F ], [ 0xA673, 0xA673 ], [ 0xA67E, 0xA67E ], [ 0xA6F2, 0xA6F7 ], [ 0xA874, 0xA877 ], [ 0xA8CE, 0xA8CF ], [ 0xA8F8, 0xA8FA ], [ 0xA92E, 0xA92F ], [ 0xA95F, 0xA95F ], [ 0xA9C1, 0xA9CD ], [ 0xA9DE, 0xA9DF ], [ 0xAA5C, 0xAA5F ], [ 0xAADE, 0xAADF ], [ 0xABEB, 0xABEB ], [ 0xFE10, 0xFE16 ], [ 0xFE19, 0xFE19 ], [ 0xFE30, 0xFE30 ], [ 0xFE45, 0xFE46 ], [ 0xFE49, 0xFE4C ], [ 0xFE50, 0xFE52 ], [ 0xFE54, 0xFE57 ], [ 0xFE5F, 0xFE61 ], [ 0xFE68, 0xFE68 ], [ 0xFE6A, 0xFE6B ], [ 0xFF01, 0xFF03 ], [ 0xFF05, 0xFF07 ], [ 0xFF0A, 0xFF0A ], [ 0xFF0C, 0xFF0C ], [ 0xFF0E, 0xFF0F ], [ 0xFF1A, 0xFF1B ], [ 0xFF1F, 0xFF20 ], [ 0xFF3C, 0xFF3C ], [ 0xFF61, 0xFF61 ], [ 0xFF64, 0xFF65 ], [ 0x10100, 0x10101 ], [ 0x1039F, 0x1039F ], [ 0x103D0, 0x103D0 ], [ 0x10857, 0x10857 ], [ 0x1091F, 0x1091F ], [ 0x1093F, 0x1093F ], [ 0x10A50, 0x10A58 ], [ 0x10A7F, 0x10A7F ], [ 0x10B39, 0x10B3F ], [ 0x11047, 0x1104D ], [ 0x110BB, 0x110BC ], [ 0x110BE, 0x110C1 ], [ 0x12470, 0x12473 ], ]; static immutable dchar[2][] tablePi = [ [ 0x00AB, 0x00AB ], [ 0x2018, 0x2018 ], [ 0x201B, 0x201C ], [ 0x201F, 0x201F ], [ 0x2039, 0x2039 ], [ 0x2E02, 0x2E02 ], [ 0x2E04, 0x2E04 ], [ 0x2E09, 0x2E09 ], [ 0x2E0C, 0x2E0C ], [ 0x2E1C, 0x2E1C ], [ 0x2E20, 0x2E20 ], ]; static immutable dchar[2][] tablePf = [ [ 0x00BB, 0x00BB ], [ 0x2019, 0x2019 ], [ 0x201D, 0x201D ], [ 0x203A, 0x203A ], [ 0x2E03, 0x2E03 ], [ 0x2E05, 0x2E05 ], [ 0x2E0A, 0x2E0A ], [ 0x2E0D, 0x2E0D ], [ 0x2E1D, 0x2E1D ], [ 0x2E21, 0x2E21 ], ]; return binarySearch!tablePd(c) || binarySearch!tablePs(c) || binarySearch!tablePe(c) || binarySearch!tablePc(c) || binarySearch!tablePo(c) || binarySearch!tablePi(c) || binarySearch!tablePf(c); } unittest { assert(isPunctuation('\u0021')); assert(isPunctuation('\u0028')); assert(isPunctuation('\u0029')); assert(isPunctuation('\u002D')); assert(isPunctuation('\u005F')); assert(isPunctuation('\u00AB')); assert(isPunctuation('\u00BB')); } /++ Returns whether $(D c) is a Unicode symbol character (general Unicode category: Sm, Sc, Sk, So) Standards: Unicode 6.0.0. +/ bool isSymbol(dchar c) @safe pure nothrow { static immutable dchar[2][] tableSm = [ [ 0x002B, 0x002B ], [ 0x003C, 0x003E ], [ 0x007C, 0x007C ], [ 0x007E, 0x007E ], [ 0x00AC, 0x00AC ], [ 0x00B1, 0x00B1 ], [ 0x00D7, 0x00D7 ], [ 0x00F7, 0x00F7 ], [ 0x03F6, 0x03F6 ], [ 0x0606, 0x0608 ], [ 0x2044, 0x2044 ], [ 0x2052, 0x2052 ], [ 0x207A, 0x207C ], [ 0x208A, 0x208C ], [ 0x2118, 0x2118 ], [ 0x2140, 0x2144 ], [ 0x214B, 0x214B ], [ 0x2190, 0x2194 ], [ 0x219A, 0x219B ], [ 0x21A0, 0x21A0 ], [ 0x21A3, 0x21A3 ], [ 0x21A6, 0x21A6 ], [ 0x21AE, 0x21AE ], [ 0x21CE, 0x21CF ], [ 0x21D2, 0x21D2 ], [ 0x21D4, 0x21D4 ], [ 0x21F4, 0x22FF ], [ 0x2308, 0x230B ], [ 0x2320, 0x2321 ], [ 0x237C, 0x237C ], [ 0x239B, 0x23B3 ], [ 0x23DC, 0x23E1 ], [ 0x25B7, 0x25B7 ], [ 0x25C1, 0x25C1 ], [ 0x25F8, 0x25FF ], [ 0x266F, 0x266F ], [ 0x27C0, 0x27C4 ], [ 0x27C7, 0x27CA ], [ 0x27CC, 0x27CC ], [ 0x27CE, 0x27E5 ], [ 0x27F0, 0x27FF ], [ 0x2900, 0x2982 ], [ 0x2999, 0x29D7 ], [ 0x29DC, 0x29FB ], [ 0x29FE, 0x2AFF ], [ 0x2B30, 0x2B44 ], [ 0x2B47, 0x2B4C ], [ 0xFB29, 0xFB29 ], [ 0xFE62, 0xFE62 ], [ 0xFE64, 0xFE66 ], [ 0xFF0B, 0xFF0B ], [ 0xFF1C, 0xFF1E ], [ 0xFF5C, 0xFF5C ], [ 0xFF5E, 0xFF5E ], [ 0xFFE2, 0xFFE2 ], [ 0xFFE9, 0xFFEC ], [ 0x1D6C1, 0x1D6C1 ], [ 0x1D6DB, 0x1D6DB ], [ 0x1D6FB, 0x1D6FB ], [ 0x1D715, 0x1D715 ], [ 0x1D735, 0x1D735 ], [ 0x1D74F, 0x1D74F ], [ 0x1D76F, 0x1D76F ], [ 0x1D789, 0x1D789 ], [ 0x1D7A9, 0x1D7A9 ], [ 0x1D7C3, 0x1D7C3 ], ]; static immutable dchar[2][] tableSc = [ [ 0x0024, 0x0024 ], [ 0x00A2, 0x00A5 ], [ 0x060B, 0x060B ], [ 0x09F2, 0x09F3 ], [ 0x09FB, 0x09FB ], [ 0x0AF1, 0x0AF1 ], [ 0x0BF9, 0x0BF9 ], [ 0x0E3F, 0x0E3F ], [ 0x17DB, 0x17DB ], [ 0x20A0, 0x20B9 ], [ 0xA838, 0xA838 ], [ 0xFDFC, 0xFDFC ], [ 0xFE69, 0xFE69 ], [ 0xFF04, 0xFF04 ], [ 0xFFE0, 0xFFE1 ], [ 0xFFE5, 0xFFE6 ], ]; static immutable dchar[2][] tableSk = [ [ 0x005E, 0x005E ], [ 0x0060, 0x0060 ], [ 0x00A8, 0x00A8 ], [ 0x00AF, 0x00AF ], [ 0x00B4, 0x00B4 ], [ 0x00B8, 0x00B8 ], [ 0x02C2, 0x02C5 ], [ 0x02D2, 0x02DF ], [ 0x02E5, 0x02EB ], [ 0x02ED, 0x02ED ], [ 0x02EF, 0x02FF ], [ 0x0375, 0x0375 ], [ 0x0384, 0x0385 ], [ 0x1FBD, 0x1FBD ], [ 0x1FBF, 0x1FC1 ], [ 0x1FCD, 0x1FCF ], [ 0x1FDD, 0x1FDF ], [ 0x1FED, 0x1FEF ], [ 0x1FFD, 0x1FFE ], [ 0x309B, 0x309C ], [ 0xA700, 0xA716 ], [ 0xA720, 0xA721 ], [ 0xA789, 0xA78A ], [ 0xFBB2, 0xFBC1 ], [ 0xFF3E, 0xFF3E ], [ 0xFF40, 0xFF40 ], [ 0xFFE3, 0xFFE3 ], ]; static immutable dchar[2][] tableSo = [ [ 0x00A6, 0x00A7 ], [ 0x00A9, 0x00A9 ], [ 0x00AE, 0x00AE ], [ 0x00B0, 0x00B0 ], [ 0x00B6, 0x00B6 ], [ 0x0482, 0x0482 ], [ 0x060E, 0x060F ], [ 0x06DE, 0x06DE ], [ 0x06E9, 0x06E9 ], [ 0x06FD, 0x06FE ], [ 0x07F6, 0x07F6 ], [ 0x09FA, 0x09FA ], [ 0x0B70, 0x0B70 ], [ 0x0BF3, 0x0BF8 ], [ 0x0BFA, 0x0BFA ], [ 0x0C7F, 0x0C7F ], [ 0x0D79, 0x0D79 ], [ 0x0F01, 0x0F03 ], [ 0x0F13, 0x0F17 ], [ 0x0F1A, 0x0F1F ], [ 0x0F34, 0x0F34 ], [ 0x0F36, 0x0F36 ], [ 0x0F38, 0x0F38 ], [ 0x0FBE, 0x0FC5 ], [ 0x0FC7, 0x0FCC ], [ 0x0FCE, 0x0FCF ], [ 0x0FD5, 0x0FD8 ], [ 0x109E, 0x109F ], [ 0x1360, 0x1360 ], [ 0x1390, 0x1399 ], [ 0x1940, 0x1940 ], [ 0x19DE, 0x19FF ], [ 0x1B61, 0x1B6A ], [ 0x1B74, 0x1B7C ], [ 0x2100, 0x2101 ], [ 0x2103, 0x2106 ], [ 0x2108, 0x2109 ], [ 0x2114, 0x2114 ], [ 0x2116, 0x2117 ], [ 0x211E, 0x2123 ], [ 0x2125, 0x2125 ], [ 0x2127, 0x2127 ], [ 0x2129, 0x2129 ], [ 0x212E, 0x212E ], [ 0x213A, 0x213B ], [ 0x214A, 0x214A ], [ 0x214C, 0x214D ], [ 0x214F, 0x214F ], [ 0x2195, 0x2199 ], [ 0x219C, 0x219F ], [ 0x21A1, 0x21A2 ], [ 0x21A4, 0x21A5 ], [ 0x21A7, 0x21AD ], [ 0x21AF, 0x21CD ], [ 0x21D0, 0x21D1 ], [ 0x21D3, 0x21D3 ], [ 0x21D5, 0x21F3 ], [ 0x2300, 0x2307 ], [ 0x230C, 0x231F ], [ 0x2322, 0x2328 ], [ 0x232B, 0x237B ], [ 0x237D, 0x239A ], [ 0x23B4, 0x23DB ], [ 0x23E2, 0x23F3 ], [ 0x2400, 0x2426 ], [ 0x2440, 0x244A ], [ 0x249C, 0x24E9 ], [ 0x2500, 0x25B6 ], [ 0x25B8, 0x25C0 ], [ 0x25C2, 0x25F7 ], [ 0x2600, 0x266E ], [ 0x2670, 0x26FF ], [ 0x2701, 0x2767 ], [ 0x2794, 0x27BF ], [ 0x2800, 0x28FF ], [ 0x2B00, 0x2B2F ], [ 0x2B45, 0x2B46 ], [ 0x2B50, 0x2B59 ], [ 0x2CE5, 0x2CEA ], [ 0x2E80, 0x2E99 ], [ 0x2E9B, 0x2EF3 ], [ 0x2F00, 0x2FD5 ], [ 0x2FF0, 0x2FFB ], [ 0x3004, 0x3004 ], [ 0x3012, 0x3013 ], [ 0x3020, 0x3020 ], [ 0x3036, 0x3037 ], [ 0x303E, 0x303F ], [ 0x3190, 0x3191 ], [ 0x3196, 0x319F ], [ 0x31C0, 0x31E3 ], [ 0x3200, 0x321E ], [ 0x322A, 0x3250 ], [ 0x3260, 0x327F ], [ 0x328A, 0x32B0 ], [ 0x32C0, 0x32FE ], [ 0x3300, 0x33FF ], [ 0x4DC0, 0x4DFF ], [ 0xA490, 0xA4C6 ], [ 0xA828, 0xA82B ], [ 0xA836, 0xA837 ], [ 0xA839, 0xA839 ], [ 0xAA77, 0xAA79 ], [ 0xFDFD, 0xFDFD ], [ 0xFFE4, 0xFFE4 ], [ 0xFFE8, 0xFFE8 ], [ 0xFFED, 0xFFEE ], [ 0xFFFC, 0xFFFD ], [ 0x10102, 0x10102 ], [ 0x10137, 0x1013F ], [ 0x10179, 0x10189 ], [ 0x10190, 0x1019B ], [ 0x101D0, 0x101FC ], [ 0x1D000, 0x1D0F5 ], [ 0x1D100, 0x1D126 ], [ 0x1D129, 0x1D164 ], [ 0x1D16A, 0x1D16C ], [ 0x1D183, 0x1D184 ], [ 0x1D18C, 0x1D1A9 ], [ 0x1D1AE, 0x1D1DD ], [ 0x1D200, 0x1D241 ], [ 0x1D245, 0x1D245 ], [ 0x1D300, 0x1D356 ], [ 0x1F000, 0x1F02B ], [ 0x1F030, 0x1F093 ], [ 0x1F0A0, 0x1F0AE ], [ 0x1F0B1, 0x1F0BE ], [ 0x1F0C1, 0x1F0CF ], [ 0x1F0D1, 0x1F0DF ], [ 0x1F110, 0x1F12E ], [ 0x1F130, 0x1F169 ], [ 0x1F170, 0x1F19A ], [ 0x1F1E6, 0x1F202 ], [ 0x1F210, 0x1F23A ], [ 0x1F240, 0x1F248 ], [ 0x1F250, 0x1F251 ], [ 0x1F300, 0x1F320 ], [ 0x1F330, 0x1F335 ], [ 0x1F337, 0x1F37C ], [ 0x1F380, 0x1F393 ], [ 0x1F3A0, 0x1F3C4 ], [ 0x1F3C6, 0x1F3CA ], [ 0x1F3E0, 0x1F3F0 ], [ 0x1F400, 0x1F43E ], [ 0x1F440, 0x1F440 ], [ 0x1F442, 0x1F4F7 ], [ 0x1F4F9, 0x1F4FC ], [ 0x1F500, 0x1F53D ], [ 0x1F550, 0x1F567 ], [ 0x1F5FB, 0x1F5FF ], [ 0x1F601, 0x1F610 ], [ 0x1F612, 0x1F614 ], [ 0x1F616, 0x1F616 ], [ 0x1F618, 0x1F618 ], [ 0x1F61A, 0x1F61A ], [ 0x1F61C, 0x1F61E ], [ 0x1F620, 0x1F625 ], [ 0x1F628, 0x1F62B ], [ 0x1F62D, 0x1F62D ], [ 0x1F630, 0x1F633 ], [ 0x1F635, 0x1F640 ], [ 0x1F645, 0x1F64F ], [ 0x1F680, 0x1F6C5 ], [ 0x1F700, 0x1F773 ], ]; return binarySearch!tableSm(c) || binarySearch!tableSc(c) || binarySearch!tableSk(c) || binarySearch!tableSo(c); } unittest { assert(isSymbol('\u0024')); assert(isSymbol('\u002B')); assert(isSymbol('\u005E')); assert(isSymbol('\u00A6')); } /++ Returns whether $(D c) is a Unicode whitespace character (general Unicode category: Zs) Standards: Unicode 6.0.0. +/ bool isSpace(dchar c) @safe pure nothrow { return (c == 0x0020 || c == 0x00A0 || c == 0x1680 || c == 0x180E || (0x2000 <= c && c <= 0x200A) || c == 0x202F || c == 0x205F || c == 0x3000); } unittest { assert(isSpace('\u0020')); } /++ Returns whether $(D c) is a Unicode graphical character (general Unicode category: L, M, N, P, S, Zs). Standards: Unicode 6.0.0. +/ bool isGraphical(dchar c) @safe pure nothrow { return isAlpha(c) || isNumber(c) || isSpace(c) || isMark(c) || isPunctuation(c) || isSymbol(c); } unittest { } /++ Returns whether $(D c) is a Unicode control character (general Unicode category: Cc) Standards: Unicode 6.0.0. +/ bool isControl(dchar c) @safe pure nothrow { return (c <= 0x1F || (0x80 <= c && c <= 0x9F)); } unittest { assert(isControl('\u0000')); } /++ Returns whether $(D c) is a Unicode formatting character (general Unicode category: Cf) Standards: Unicode 6.0.0. +/ bool isFormat(dchar c) @safe pure nothrow { static immutable dchar[2][] tableCf = [ [ 0x00AD, 0x00AD ], [ 0x0600, 0x0603 ], [ 0x06DD, 0x06DD ], [ 0x070F, 0x070F ], [ 0x17B4, 0x17B5 ], [ 0x200B, 0x200F ], [ 0x202A, 0x202E ], [ 0x2060, 0x2064 ], [ 0x206A, 0x206F ], [ 0xFEFF, 0xFEFF ], [ 0xFFF9, 0xFFFB ], [ 0x110BD, 0x110BD ], [ 0x1D173, 0x1D17A ], [ 0xE0001, 0xE0001 ], [ 0xE0020, 0xE007F ], ]; return binarySearch!tableCf(c); } unittest { assert(isFormat('\u00AD')); } /++ Returns whether $(D c) is a Unicode Private Use character (general Unicode category: Co) Standards: Unicode 6.0.0. +/ bool isPrivateUse(dchar c) @safe pure nothrow { return (0x00_E000 <= c && c <= 0x00_F8FF) || (0x0F_0000 <= c && c <= 0x0F_FFFD) || (0x10_0000 <= c && c <= 0x10_FFFD); } unittest { } /++ Returns whether $(D c) is a Unicode surrogate character (general Unicode category: Cs) Standards: Unicode 6.0.0. +/ bool isSurrogate(dchar c) @safe pure nothrow { return (0xD800 <= c && c <= 0xDFFF); } /++ Returns whether $(D c) is a Unicode high surrogate (lead surrogate). Standards: Unicode 2.0. +/ bool isSurrogateHi(dchar c) @safe pure nothrow { return (0xD800 <= c && c <= 0xDBFF); } /++ Returns whether $(D c) is a Unicode low surrogate (trail surrogate). Standards: Unicode 2.0. +/ bool isSurrogateLo(dchar c) @safe pure nothrow { return (0xDC00 <= c && c <= 0xDFFF); } unittest { } /++ Returns whether $(D c) is a Unicode non-character (general Unicode category: Cn) Standards: Unicode 6.0.0. +/ bool isNonCharacter(dchar c) @safe pure nothrow { static immutable dchar[2][] table = [ [ 0x0378, 0x0379 ], [ 0x037F, 0x0383 ], [ 0x038B, 0x038B ], [ 0x038D, 0x038D ], [ 0x03A2, 0x03A2 ], [ 0x0528, 0x0530 ], [ 0x0557, 0x0558 ], [ 0x0560, 0x0560 ], [ 0x0588, 0x0588 ], [ 0x058B, 0x0590 ], [ 0x05C8, 0x05CF ], [ 0x05EB, 0x05EF ], [ 0x05F5, 0x05FF ], [ 0x0604, 0x0605 ], [ 0x061C, 0x061D ], [ 0x070E, 0x070E ], [ 0x074B, 0x074C ], [ 0x07B2, 0x07BF ], [ 0x07FB, 0x07FF ], [ 0x082E, 0x082F ], [ 0x083F, 0x083F ], [ 0x085C, 0x085D ], [ 0x085F, 0x08FF ], [ 0x0978, 0x0978 ], [ 0x0980, 0x0980 ], [ 0x0984, 0x0984 ], [ 0x098D, 0x098E ], [ 0x0991, 0x0992 ], [ 0x09A9, 0x09A9 ], [ 0x09B1, 0x09B1 ], [ 0x09B3, 0x09B5 ], [ 0x09BA, 0x09BB ], [ 0x09C5, 0x09C6 ], [ 0x09C9, 0x09CA ], [ 0x09CF, 0x09D6 ], [ 0x09D8, 0x09DB ], [ 0x09DE, 0x09DE ], [ 0x09E4, 0x09E5 ], [ 0x09FC, 0x0A00 ], [ 0x0A04, 0x0A04 ], [ 0x0A0B, 0x0A0E ], [ 0x0A11, 0x0A12 ], [ 0x0A29, 0x0A29 ], [ 0x0A31, 0x0A31 ], [ 0x0A34, 0x0A34 ], [ 0x0A37, 0x0A37 ], [ 0x0A3A, 0x0A3B ], [ 0x0A3D, 0x0A3D ], [ 0x0A43, 0x0A46 ], [ 0x0A49, 0x0A4A ], [ 0x0A4E, 0x0A50 ], [ 0x0A52, 0x0A58 ], [ 0x0A5D, 0x0A5D ], [ 0x0A5F, 0x0A65 ], [ 0x0A76, 0x0A80 ], [ 0x0A84, 0x0A84 ], [ 0x0A8E, 0x0A8E ], [ 0x0A92, 0x0A92 ], [ 0x0AA9, 0x0AA9 ], [ 0x0AB1, 0x0AB1 ], [ 0x0AB4, 0x0AB4 ], [ 0x0ABA, 0x0ABB ], [ 0x0AC6, 0x0AC6 ], [ 0x0ACA, 0x0ACA ], [ 0x0ACE, 0x0ACF ], [ 0x0AD1, 0x0ADF ], [ 0x0AE4, 0x0AE5 ], [ 0x0AF0, 0x0AF0 ], [ 0x0AF2, 0x0B00 ], [ 0x0B04, 0x0B04 ], [ 0x0B0D, 0x0B0E ], [ 0x0B11, 0x0B12 ], [ 0x0B29, 0x0B29 ], [ 0x0B31, 0x0B31 ], [ 0x0B34, 0x0B34 ], [ 0x0B3A, 0x0B3B ], [ 0x0B45, 0x0B46 ], [ 0x0B49, 0x0B4A ], [ 0x0B4E, 0x0B55 ], [ 0x0B58, 0x0B5B ], [ 0x0B5E, 0x0B5E ], [ 0x0B64, 0x0B65 ], [ 0x0B78, 0x0B81 ], [ 0x0B84, 0x0B84 ], [ 0x0B8B, 0x0B8D ], [ 0x0B91, 0x0B91 ], [ 0x0B96, 0x0B98 ], [ 0x0B9B, 0x0B9B ], [ 0x0B9D, 0x0B9D ], [ 0x0BA0, 0x0BA2 ], [ 0x0BA5, 0x0BA7 ], [ 0x0BAB, 0x0BAD ], [ 0x0BBA, 0x0BBD ], [ 0x0BC3, 0x0BC5 ], [ 0x0BC9, 0x0BC9 ], [ 0x0BCE, 0x0BCF ], [ 0x0BD1, 0x0BD6 ], [ 0x0BD8, 0x0BE5 ], [ 0x0BFB, 0x0C00 ], [ 0x0C04, 0x0C04 ], [ 0x0C0D, 0x0C0D ], [ 0x0C11, 0x0C11 ], [ 0x0C29, 0x0C29 ], [ 0x0C34, 0x0C34 ], [ 0x0C3A, 0x0C3C ], [ 0x0C45, 0x0C45 ], [ 0x0C49, 0x0C49 ], [ 0x0C4E, 0x0C54 ], [ 0x0C57, 0x0C57 ], [ 0x0C5A, 0x0C5F ], [ 0x0C64, 0x0C65 ], [ 0x0C70, 0x0C77 ], [ 0x0C80, 0x0C81 ], [ 0x0C84, 0x0C84 ], [ 0x0C8D, 0x0C8D ], [ 0x0C91, 0x0C91 ], [ 0x0CA9, 0x0CA9 ], [ 0x0CB4, 0x0CB4 ], [ 0x0CBA, 0x0CBB ], [ 0x0CC5, 0x0CC5 ], [ 0x0CC9, 0x0CC9 ], [ 0x0CCE, 0x0CD4 ], [ 0x0CD7, 0x0CDD ], [ 0x0CDF, 0x0CDF ], [ 0x0CE4, 0x0CE5 ], [ 0x0CF0, 0x0CF0 ], [ 0x0CF3, 0x0D01 ], [ 0x0D04, 0x0D04 ], [ 0x0D0D, 0x0D0D ], [ 0x0D11, 0x0D11 ], [ 0x0D3B, 0x0D3C ], [ 0x0D45, 0x0D45 ], [ 0x0D49, 0x0D49 ], [ 0x0D4F, 0x0D56 ], [ 0x0D58, 0x0D5F ], [ 0x0D64, 0x0D65 ], [ 0x0D76, 0x0D78 ], [ 0x0D80, 0x0D81 ], [ 0x0D84, 0x0D84 ], [ 0x0D97, 0x0D99 ], [ 0x0DB2, 0x0DB2 ], [ 0x0DBC, 0x0DBC ], [ 0x0DBE, 0x0DBF ], [ 0x0DC7, 0x0DC9 ], [ 0x0DCB, 0x0DCE ], [ 0x0DD5, 0x0DD5 ], [ 0x0DD7, 0x0DD7 ], [ 0x0DE0, 0x0DF1 ], [ 0x0DF5, 0x0E00 ], [ 0x0E3B, 0x0E3E ], [ 0x0E5C, 0x0E80 ], [ 0x0E83, 0x0E83 ], [ 0x0E85, 0x0E86 ], [ 0x0E89, 0x0E89 ], [ 0x0E8B, 0x0E8C ], [ 0x0E8E, 0x0E93 ], [ 0x0E98, 0x0E98 ], [ 0x0EA0, 0x0EA0 ], [ 0x0EA4, 0x0EA4 ], [ 0x0EA6, 0x0EA6 ], [ 0x0EA8, 0x0EA9 ], [ 0x0EAC, 0x0EAC ], [ 0x0EBA, 0x0EBA ], [ 0x0EBE, 0x0EBF ], [ 0x0EC5, 0x0EC5 ], [ 0x0EC7, 0x0EC7 ], [ 0x0ECE, 0x0ECF ], [ 0x0EDA, 0x0EDB ], [ 0x0EDE, 0x0EFF ], [ 0x0F48, 0x0F48 ], [ 0x0F6D, 0x0F70 ], [ 0x0F98, 0x0F98 ], [ 0x0FBD, 0x0FBD ], [ 0x0FCD, 0x0FCD ], [ 0x0FDB, 0x0FFF ], [ 0x10C6, 0x10CF ], [ 0x10FD, 0x10FF ], [ 0x1249, 0x1249 ], [ 0x124E, 0x124F ], [ 0x1257, 0x1257 ], [ 0x1259, 0x1259 ], [ 0x125E, 0x125F ], [ 0x1289, 0x1289 ], [ 0x128E, 0x128F ], [ 0x12B1, 0x12B1 ], [ 0x12B6, 0x12B7 ], [ 0x12BF, 0x12BF ], [ 0x12C1, 0x12C1 ], [ 0x12C6, 0x12C7 ], [ 0x12D7, 0x12D7 ], [ 0x1311, 0x1311 ], [ 0x1316, 0x1317 ], [ 0x135B, 0x135C ], [ 0x137D, 0x137F ], [ 0x139A, 0x139F ], [ 0x13F5, 0x13FF ], [ 0x169D, 0x169F ], [ 0x16F1, 0x16FF ], [ 0x170D, 0x170D ], [ 0x1715, 0x171F ], [ 0x1737, 0x173F ], [ 0x1754, 0x175F ], [ 0x176D, 0x176D ], [ 0x1771, 0x1771 ], [ 0x1774, 0x177F ], [ 0x17DE, 0x17DF ], [ 0x17EA, 0x17EF ], [ 0x17FA, 0x17FF ], [ 0x180F, 0x180F ], [ 0x181A, 0x181F ], [ 0x1878, 0x187F ], [ 0x18AB, 0x18AF ], [ 0x18F6, 0x18FF ], [ 0x191D, 0x191F ], [ 0x192C, 0x192F ], [ 0x193C, 0x193F ], [ 0x1941, 0x1943 ], [ 0x196E, 0x196F ], [ 0x1975, 0x197F ], [ 0x19AC, 0x19AF ], [ 0x19CA, 0x19CF ], [ 0x19DB, 0x19DD ], [ 0x1A1C, 0x1A1D ], [ 0x1A5F, 0x1A5F ], [ 0x1A7D, 0x1A7E ], [ 0x1A8A, 0x1A8F ], [ 0x1A9A, 0x1A9F ], [ 0x1AAE, 0x1AFF ], [ 0x1B4C, 0x1B4F ], [ 0x1B7D, 0x1B7F ], [ 0x1BAB, 0x1BAD ], [ 0x1BBA, 0x1BBF ], [ 0x1BF4, 0x1BFB ], [ 0x1C38, 0x1C3A ], [ 0x1C4A, 0x1C4C ], [ 0x1C80, 0x1CCF ], [ 0x1CF3, 0x1CFF ], [ 0x1DE7, 0x1DFB ], [ 0x1F16, 0x1F17 ], [ 0x1F1E, 0x1F1F ], [ 0x1F46, 0x1F47 ], [ 0x1F4E, 0x1F4F ], [ 0x1F58, 0x1F58 ], [ 0x1F5A, 0x1F5A ], [ 0x1F5C, 0x1F5C ], [ 0x1F5E, 0x1F5E ], [ 0x1F7E, 0x1F7F ], [ 0x1FB5, 0x1FB5 ], [ 0x1FC5, 0x1FC5 ], [ 0x1FD4, 0x1FD5 ], [ 0x1FDC, 0x1FDC ], [ 0x1FF0, 0x1FF1 ], [ 0x1FF5, 0x1FF5 ], [ 0x1FFF, 0x1FFF ], [ 0x2065, 0x2069 ], [ 0x2072, 0x2073 ], [ 0x208F, 0x208F ], [ 0x209D, 0x209F ], [ 0x20BA, 0x20CF ], [ 0x20F1, 0x20FF ], [ 0x218A, 0x218F ], [ 0x23F4, 0x23FF ], [ 0x2427, 0x243F ], [ 0x244B, 0x245F ], [ 0x2700, 0x2700 ], [ 0x27CB, 0x27CB ], [ 0x27CD, 0x27CD ], [ 0x2B4D, 0x2B4F ], [ 0x2B5A, 0x2BFF ], [ 0x2C2F, 0x2C2F ], [ 0x2C5F, 0x2C5F ], [ 0x2CF2, 0x2CF8 ], [ 0x2D26, 0x2D2F ], [ 0x2D66, 0x2D6E ], [ 0x2D71, 0x2D7E ], [ 0x2D97, 0x2D9F ], [ 0x2DA7, 0x2DA7 ], [ 0x2DAF, 0x2DAF ], [ 0x2DB7, 0x2DB7 ], [ 0x2DBF, 0x2DBF ], [ 0x2DC7, 0x2DC7 ], [ 0x2DCF, 0x2DCF ], [ 0x2DD7, 0x2DD7 ], [ 0x2DDF, 0x2DDF ], [ 0x2E32, 0x2E7F ], [ 0x2E9A, 0x2E9A ], [ 0x2EF4, 0x2EFF ], [ 0x2FD6, 0x2FEF ], [ 0x2FFC, 0x2FFF ], [ 0x3040, 0x3040 ], [ 0x3097, 0x3098 ], [ 0x3100, 0x3104 ], [ 0x312E, 0x3130 ], [ 0x318F, 0x318F ], [ 0x31BB, 0x31BF ], [ 0x31E4, 0x31EF ], [ 0x321F, 0x321F ], [ 0x32FF, 0x32FF ], [ 0x4DB6, 0x4DBF ], [ 0x9FCC, 0x9FFF ], [ 0xA48D, 0xA48F ], [ 0xA4C7, 0xA4CF ], [ 0xA62C, 0xA63F ], [ 0xA674, 0xA67B ], [ 0xA698, 0xA69F ], [ 0xA6F8, 0xA6FF ], [ 0xA78F, 0xA78F ], [ 0xA792, 0xA79F ], [ 0xA7AA, 0xA7F9 ], [ 0xA82C, 0xA82F ], [ 0xA83A, 0xA83F ], [ 0xA878, 0xA87F ], [ 0xA8C5, 0xA8CD ], [ 0xA8DA, 0xA8DF ], [ 0xA8FC, 0xA8FF ], [ 0xA954, 0xA95E ], [ 0xA97D, 0xA97F ], [ 0xA9CE, 0xA9CE ], [ 0xA9DA, 0xA9DD ], [ 0xA9E0, 0xA9FF ], [ 0xAA37, 0xAA3F ], [ 0xAA4E, 0xAA4F ], [ 0xAA5A, 0xAA5B ], [ 0xAA7C, 0xAA7F ], [ 0xAAC3, 0xAADA ], [ 0xAAE0, 0xAB00 ], [ 0xAB07, 0xAB08 ], [ 0xAB0F, 0xAB10 ], [ 0xAB17, 0xAB1F ], [ 0xAB27, 0xAB27 ], [ 0xAB2F, 0xABBF ], [ 0xABEE, 0xABEF ], [ 0xABFA, 0xABFF ], [ 0xD7A4, 0xD7AF ], [ 0xD7C7, 0xD7CA ], [ 0xD7FC, 0xD7FF ], [ 0xFA2E, 0xFA2F ], [ 0xFA6E, 0xFA6F ], [ 0xFADA, 0xFAFF ], [ 0xFB07, 0xFB12 ], [ 0xFB18, 0xFB1C ], [ 0xFB37, 0xFB37 ], [ 0xFB3D, 0xFB3D ], [ 0xFB3F, 0xFB3F ], [ 0xFB42, 0xFB42 ], [ 0xFB45, 0xFB45 ], [ 0xFBC2, 0xFBD2 ], [ 0xFD40, 0xFD4F ], [ 0xFD90, 0xFD91 ], [ 0xFDC8, 0xFDEF ], [ 0xFDFE, 0xFDFF ], [ 0xFE1A, 0xFE1F ], [ 0xFE27, 0xFE2F ], [ 0xFE53, 0xFE53 ], [ 0xFE67, 0xFE67 ], [ 0xFE6C, 0xFE6F ], [ 0xFE75, 0xFE75 ], [ 0xFEFD, 0xFEFE ], [ 0xFF00, 0xFF00 ], [ 0xFFBF, 0xFFC1 ], [ 0xFFC8, 0xFFC9 ], [ 0xFFD0, 0xFFD1 ], [ 0xFFD8, 0xFFD9 ], [ 0xFFDD, 0xFFDF ], [ 0xFFE7, 0xFFE7 ], [ 0xFFEF, 0xFFF8 ], [ 0xFFFE, 0xFFFF ], [ 0x1000C, 0x1000C ], [ 0x10027, 0x10027 ], [ 0x1003B, 0x1003B ], [ 0x1003E, 0x1003E ], [ 0x1004E, 0x1004F ], [ 0x1005E, 0x1007F ], [ 0x100FB, 0x100FF ], [ 0x10103, 0x10106 ], [ 0x10134, 0x10136 ], [ 0x1018B, 0x1018F ], [ 0x1019C, 0x101CF ], [ 0x101FE, 0x1027F ], [ 0x1029D, 0x1029F ], [ 0x102D1, 0x102FF ], [ 0x1031F, 0x1031F ], [ 0x10324, 0x1032F ], [ 0x1034B, 0x1037F ], [ 0x1039E, 0x1039E ], [ 0x103C4, 0x103C7 ], [ 0x103D6, 0x103FF ], [ 0x1049E, 0x1049F ], [ 0x104AA, 0x107FF ], [ 0x10806, 0x10807 ], [ 0x10809, 0x10809 ], [ 0x10836, 0x10836 ], [ 0x10839, 0x1083B ], [ 0x1083D, 0x1083E ], [ 0x10856, 0x10856 ], [ 0x10860, 0x108FF ], [ 0x1091C, 0x1091E ], [ 0x1093A, 0x1093E ], [ 0x10940, 0x109FF ], [ 0x10A04, 0x10A04 ], [ 0x10A07, 0x10A0B ], [ 0x10A14, 0x10A14 ], [ 0x10A18, 0x10A18 ], [ 0x10A34, 0x10A37 ], [ 0x10A3B, 0x10A3E ], [ 0x10A48, 0x10A4F ], [ 0x10A59, 0x10A5F ], [ 0x10A80, 0x10AFF ], [ 0x10B36, 0x10B38 ], [ 0x10B56, 0x10B57 ], [ 0x10B73, 0x10B77 ], [ 0x10B80, 0x10BFF ], [ 0x10C49, 0x10E5F ], [ 0x10E7F, 0x10FFF ], [ 0x1104E, 0x11051 ], [ 0x11070, 0x1107F ], [ 0x110C2, 0x11FFF ], [ 0x1236F, 0x123FF ], [ 0x12463, 0x1246F ], [ 0x12474, 0x12FFF ], [ 0x1342F, 0x167FF ], [ 0x16A39, 0x1AFFF ], [ 0x1B002, 0x1CFFF ], [ 0x1D0F6, 0x1D0FF ], [ 0x1D127, 0x1D128 ], [ 0x1D1DE, 0x1D1FF ], [ 0x1D246, 0x1D2FF ], [ 0x1D357, 0x1D35F ], [ 0x1D372, 0x1D3FF ], [ 0x1D455, 0x1D455 ], [ 0x1D49D, 0x1D49D ], [ 0x1D4A0, 0x1D4A1 ], [ 0x1D4A3, 0x1D4A4 ], [ 0x1D4A7, 0x1D4A8 ], [ 0x1D4AD, 0x1D4AD ], [ 0x1D4BA, 0x1D4BA ], [ 0x1D4BC, 0x1D4BC ], [ 0x1D4C4, 0x1D4C4 ], [ 0x1D506, 0x1D506 ], [ 0x1D50B, 0x1D50C ], [ 0x1D515, 0x1D515 ], [ 0x1D51D, 0x1D51D ], [ 0x1D53A, 0x1D53A ], [ 0x1D53F, 0x1D53F ], [ 0x1D545, 0x1D545 ], [ 0x1D547, 0x1D549 ], [ 0x1D551, 0x1D551 ], [ 0x1D6A6, 0x1D6A7 ], [ 0x1D7CC, 0x1D7CD ], [ 0x1D800, 0x1EFFF ], [ 0x1F02C, 0x1F02F ], [ 0x1F094, 0x1F09F ], [ 0x1F0AF, 0x1F0B0 ], [ 0x1F0BF, 0x1F0C0 ], [ 0x1F0D0, 0x1F0D0 ], [ 0x1F0E0, 0x1F0FF ], [ 0x1F10B, 0x1F10F ], [ 0x1F12F, 0x1F12F ], [ 0x1F16A, 0x1F16F ], [ 0x1F19B, 0x1F1E5 ], [ 0x1F203, 0x1F20F ], [ 0x1F23B, 0x1F23F ], [ 0x1F249, 0x1F24F ], [ 0x1F252, 0x1F2FF ], [ 0x1F321, 0x1F32F ], [ 0x1F336, 0x1F336 ], [ 0x1F37D, 0x1F37F ], [ 0x1F394, 0x1F39F ], [ 0x1F3C5, 0x1F3C5 ], [ 0x1F3CB, 0x1F3DF ], [ 0x1F3F1, 0x1F3FF ], [ 0x1F43F, 0x1F43F ], [ 0x1F441, 0x1F441 ], [ 0x1F4F8, 0x1F4F8 ], [ 0x1F4FD, 0x1F4FF ], [ 0x1F53E, 0x1F54F ], [ 0x1F568, 0x1F5FA ], [ 0x1F600, 0x1F600 ], [ 0x1F611, 0x1F611 ], [ 0x1F615, 0x1F615 ], [ 0x1F617, 0x1F617 ], [ 0x1F619, 0x1F619 ], [ 0x1F61B, 0x1F61B ], [ 0x1F61F, 0x1F61F ], [ 0x1F626, 0x1F627 ], [ 0x1F62C, 0x1F62C ], [ 0x1F62E, 0x1F62F ], [ 0x1F634, 0x1F634 ], [ 0x1F641, 0x1F644 ], [ 0x1F650, 0x1F67F ], [ 0x1F6C6, 0x1F6FF ], [ 0x1F774, 0x1FFFF ], [ 0x2A6D7, 0x2A6FF ], [ 0x2B735, 0x2B73F ], [ 0x2B81E, 0x2F7FF ], [ 0x2FA1E, 0xE0000 ], [ 0xE0002, 0xE001F ], [ 0xE0080, 0xE00FF ], [ 0xE01F0, 0xEFFFF ], [ 0xFFFFE, 0xFFFFF ], [ 0x10FFFE, 0x10FFFF ], ]; return binarySearch!table(c); } unittest { } //============================================================================== // Private Section. //============================================================================== private: bool binarySearch(alias table)(dchar c) @safe pure nothrow { static @property bool checkTableEntry(alias table)() { foreach(i, entry; table) { assert(table[i][0] <= table[i][1]); if(i < table.length - 1) assert(table[i][1] < table[i + 1][0]); } return true; } static assert(checkTableEntry!table); return binarySearch2(c, table); } bool binarySearch2(dchar c, immutable dchar[2][] table) @safe pure nothrow { // Binary search size_t mid; size_t low; size_t high; low = 0; high = table.length - 1; while(cast(int)low <= cast(int)high) { mid = (low + high) >> 1; if(c < table[mid][0]) high = mid - 1; else if(c > table[mid][1]) low = mid + 1; else goto Lis; } Lisnot: debug { for(size_t i = 0; i < table.length; ++i) assert(c < table[i][0] || c > table[i][1]); } return false; Lis: debug { for(size_t i = 0; i < table.length; ++i) { if(c >= table[i][0] && c <= table[i][1]) return true; } assert(0); // should have been in table } else return true; };