codealignment icon indicating copy to clipboard operation
codealignment copied to clipboard

CHINESE CHARACTERS failed alignment

Open xp44mm opened this issue 6 years ago • 6 comments

a CHINESE CHARACTER width equals double a english CHARACTER,

大气: atmospherePanel(),
煤燃烧: coalPanel(),
过量空气: exessairPanel(),

execute : alignment will be:

大气  : atmospherePanel(),
煤燃烧 : coalPanel(),
过量空气: exessairPanel(),

tip: the regex of matching chinese characters: [\u4e00-\u9fa5]

/[\u4e00-\u9fa5]+/.test('中文字符') //=>true;

xp44mm avatar Jun 24 '18 08:06 xp44mm

Hi, Are you experiencing this in Notepad++ or Visual Studio?

cpmcgrath avatar Jun 25 '18 06:06 cpmcgrath

I believe this is the same as #36

cpmcgrath avatar Jun 25 '18 06:06 cpmcgrath

@cpmcgrath :i use visual studio, select font Microsft Yahei Mono

匹配双字节字符(包括汉字在内):[^\x00-\xff]

/[^\x00-\xff]/.test('℃') === true
/[\x00-\xff]/.test('a') === true

the length of should be 2, the length of 'a' should be 1.

xp44mm avatar Jun 25 '18 11:06 xp44mm

@cpmcgrath

The unicode-11.0.0 defined characters' width when interoperating with East Asian Legacy character sets.

Basically, all unicode defined code points can be divided into 3 partitions by the characters' width: those do not display at all with 0 width like control characters; those occupy 1 character width like latin letters(half width); those occupy 2 character width like most CJK characters and full width latin letters.

The east asian characters' width is described here: http://www.unicode.org/reports/tr11/

The detailed characters' widths is listed here: https://www.unicode.org/Public/UCD/latest/ucd/EastAsianWidth.txt

And, I think this will be of help:

    using System.Collections.Generic;

    public static partial class TextX
    {
        public static bool IsZeroWidth(this char c) => c.IsInWidths(CharWidths[0]);
        public static bool IsHalfWidth(this char c) => c.IsInWidths(CharWidths[1]);
        public static bool IsFullWidth(this char c) => c.IsInWidths(CharWidths[2]);

        private static bool IsInWidths(this char c, IReadOnlyList<IReadOnlyList<int>> widths)
        {
            for (var i = 0; i < widths.Count;)
            {
                var w = widths[i];
                if (w[0] <= c && c <= w[1]) return true;
                ++i;
            }
            return false;
        }

        public static readonly IReadOnlyList<IReadOnlyList<IReadOnlyList<int>>> CharWidths = new[]
        {
            /*0*/new[]{new[]{0x0000, 0x001F}, new[]{0xFE6C, 0xFF00}, new[]{0x007F, 0x00A0}, new[]{0x00A9, 0x00A9}, new[]{0x00AB, 0x00AB}, new[]{0x00B5, 0x00B5}, new[]{0x00BB, 0x00BB}, new[]{0x00C0, 0x00C5}, new[]{0x00C7, 0x00CF}, new[]{0x00D1, 0x00D6}, new[]{0x00D9, 0x00DD}, new[]{0x00E2, 0x00E5}, new[]{0x00E7, 0x00E7}, new[]{0x00EB, 0x00EB}, new[]{0x00EE, 0x00EF}, new[]{0x00F1, 0x00F1}, new[]{0x00F4, 0x00F6}, new[]{0x00FB, 0x00FB}, new[]{0x00FD, 0x00FD}, new[]{0x00FF, 0x0100}, new[]{0x0102, 0x0110}, new[]{0x0112, 0x0112}, new[]{0x0114, 0x011A}, new[]{0x011C, 0x0125}, new[]{0x0128, 0x012A}, new[]{0x012C, 0x0130}, new[]{0x0134, 0x0137}, new[]{0x0139, 0x013E}, new[]{0x0143, 0x0143}, new[]{0x0145, 0x0147}, new[]{0x014C, 0x014C}, new[]{0x014E, 0x0151}, new[]{0x0154, 0x0165}, new[]{0x0168, 0x016A}, new[]{0x016C, 0x01CD}, new[]{0x01CF, 0x01CF}, new[]{0x01D1, 0x01D1}, new[]{0x01D3, 0x01D3}, new[]{0x01D5, 0x01D5}, new[]{0x01D7, 0x01D7}, new[]{0x01D9, 0x01D9}, new[]{0x01DB, 0x01DB}, new[]{0x01DD, 0x0250}, new[]{0x0252, 0x0260}, new[]{0x0262, 0x02C3}, new[]{0x02C5, 0x02C6}, new[]{0x02C8, 0x02C8}, new[]{0x02CC, 0x02CC}, new[]{0x02CE, 0x02CF}, new[]{0x02D1, 0x02D7}, new[]{0x02DC, 0x02DC}, new[]{0x02DE, 0x02DE}, new[]{0x02E0, 0x02FF}, new[]{0x0370, 0x0390}, new[]{0x03A2, 0x03A2}, new[]{0x03AA, 0x03B0}, new[]{0x03C2, 0x03C2}, new[]{0x03CA, 0x0400}, new[]{0x0402, 0x040F}, new[]{0x0450, 0x0450}, new[]{0x0452, 0x10FF}, new[]{0x1160, 0x200F}, new[]{0x2011, 0x2012}, new[]{0x2017, 0x2017}, new[]{0x201A, 0x201B}, new[]{0x201E, 0x201F}, new[]{0x2023, 0x2023}, new[]{0x2028, 0x202F}, new[]{0x2031, 0x2031}, new[]{0x2034, 0x2034}, new[]{0x2036, 0x203A}, new[]{0x203C, 0x203D}, new[]{0x203F, 0x2073}, new[]{0x2075, 0x207E}, new[]{0x2080, 0x2080}, new[]{0x2085, 0x20A8}, new[]{0x20AA, 0x20AB}, new[]{0x20AD, 0x2102}, new[]{0x2104, 0x2104}, new[]{0x2106, 0x2108}, new[]{0x210A, 0x2112}, new[]{0x2114, 0x2115}, new[]{0x2117, 0x2120}, new[]{0x2123, 0x2125}, new[]{0x2127, 0x212A}, new[]{0x212C, 0x2152}, new[]{0x2155, 0x215A}, new[]{0x215F, 0x215F}, new[]{0x216C, 0x216F}, new[]{0x217A, 0x2188}, new[]{0x218A, 0x218F}, new[]{0x219A, 0x21B7}, new[]{0x21BA, 0x21D1}, new[]{0x21D3, 0x21D3}, new[]{0x21D5, 0x21E6}, new[]{0x21E8, 0x21FF}, new[]{0x2201, 0x2201}, new[]{0x2204, 0x2206}, new[]{0x2209, 0x220A}, new[]{0x220C, 0x220E}, new[]{0x2210, 0x2210}, new[]{0x2212, 0x2214}, new[]{0x2216, 0x2219}, new[]{0x221B, 0x221C}, new[]{0x2221, 0x2222}, new[]{0x2224, 0x2224}, new[]{0x2226, 0x2226}, new[]{0x222D, 0x222D}, new[]{0x222F, 0x2233}, new[]{0x2238, 0x223B}, new[]{0x223E, 0x2247}, new[]{0x2249, 0x224B}, new[]{0x224D, 0x2251}, new[]{0x2253, 0x225F}, new[]{0x2262, 0x2263}, new[]{0x2268, 0x2269}, new[]{0x226C, 0x226D}, new[]{0x2270, 0x2281}, new[]{0x2284, 0x2285}, new[]{0x2288, 0x2294}, new[]{0x2296, 0x2298}, new[]{0x229A, 0x22A4}, new[]{0x22A6, 0x22BE}, new[]{0x22C0, 0x2311}, new[]{0x2313, 0x2319}, new[]{0x231C, 0x2328}, new[]{0x232B, 0x23E8}, new[]{0x23ED, 0x23EF}, new[]{0x23F1, 0x23F2}, new[]{0x23F4, 0x245F}, new[]{0x24EA, 0x24EA}, new[]{0x254C, 0x254F}, new[]{0x2574, 0x257F}, new[]{0x2590, 0x2591}, new[]{0x2596, 0x259F}, new[]{0x25A2, 0x25A2}, new[]{0x25AA, 0x25B1}, new[]{0x25B4, 0x25B5}, new[]{0x25B8, 0x25BB}, new[]{0x25BE, 0x25BF}, new[]{0x25C2, 0x25C5}, new[]{0x25C9, 0x25CA}, new[]{0x25CC, 0x25CD}, new[]{0x25D2, 0x25E1}, new[]{0x25E6, 0x25EE}, new[]{0x25F0, 0x25FC}, new[]{0x25FF, 0x2604}, new[]{0x2607, 0x2608}, new[]{0x260A, 0x260D}, new[]{0x2610, 0x2613}, new[]{0x2616, 0x261B}, new[]{0x261D, 0x261D}, new[]{0x261F, 0x263F}, new[]{0x2641, 0x2641}, new[]{0x2643, 0x2647}, new[]{0x2654, 0x265F}, new[]{0x2662, 0x2662}, new[]{0x2666, 0x2666}, new[]{0x266B, 0x266B}, new[]{0x266E, 0x266E}, new[]{0x2670, 0x267E}, new[]{0x2680, 0x2692}, new[]{0x2694, 0x269D}, new[]{0x26A0, 0x26A0}, new[]{0x26A2, 0x26A9}, new[]{0x26AC, 0x26BC}, new[]{0x26C0, 0x26C3}, new[]{0x26E2, 0x26E2}, new[]{0x26E4, 0x26E7}, new[]{0x2700, 0x2704}, new[]{0x2706, 0x2709}, new[]{0x270C, 0x2727}, new[]{0x2729, 0x273C}, new[]{0x273E, 0x274B}, new[]{0x274D, 0x274D}, new[]{0x274F, 0x2752}, new[]{0x2756, 0x2756}, new[]{0x2758, 0x2775}, new[]{0x2780, 0x2794}, new[]{0x2798, 0x27AF}, new[]{0x27B1, 0x27BE}, new[]{0x27C0, 0x27E5}, new[]{0x27EE, 0x2984}, new[]{0x2987, 0x2B1A}, new[]{0x2B1D, 0x2B4F}, new[]{0x2B51, 0x2B54}, new[]{0x2B5A, 0x2E7F}, new[]{0x2E9A, 0x2E9A}, new[]{0x2EF4, 0x2EFF}, new[]{0x2FD6, 0x2FEF}, new[]{0x2FFC, 0x2FFF}, new[]{0x303F, 0x3040}, new[]{0x3097, 0x3098}, new[]{0x3100, 0x3104}, new[]{0x3130, 0x3130}, new[]{0x318F, 0x318F}, new[]{0x31BB, 0x31BF}, new[]{0x31E4, 0x31EF}, new[]{0x321F, 0x321F}, new[]{0x32FF, 0x32FF}, new[]{0x4DC0, 0x4DFF}, new[]{0xA48D, 0xA48F}, new[]{0xA4C7, 0xA95F}, new[]{0xA97D, 0xABFF}, new[]{0xD7A4, 0xDFFF}, new[]{0xFB00, 0xFDFF}, new[]{0xFE1A, 0xFE2F}, new[]{0xFE53, 0xFE53}, new[]{0xFE67, 0xFE67}, new[]{0xFFBF, 0xFFC1}, new[]{0xFFC8, 0xFFC9}, new[]{0xFFD0, 0xFFD1}, new[]{0xFFD8, 0xFFD9}, new[]{0xFFDD, 0xFFDF}, new[]{0xFFE7, 0xFFE7}, new[]{0xFFEF, 0xFFFC}, new[]{0xFFFE, 0x16FDF}, new[]{0x16FE2, 0x16FFF}, new[]{0x187F2, 0x187FF}, new[]{0x18AF3, 0x1AFFF}, new[]{0x1B11F, 0x1B16F}, new[]{0x1B2FC, 0x1F003}, new[]{0x1F005, 0x1F0CE}, new[]{0x1F0D0, 0x1F0FF}, new[]{0x1F10B, 0x1F10F}, new[]{0x1F12E, 0x1F12F}, new[]{0x1F16A, 0x1F16F}, new[]{0x1F1AD, 0x1F1FF}, new[]{0x1F203, 0x1F20F}, new[]{0x1F23C, 0x1F23F}, new[]{0x1F249, 0x1F24F}, new[]{0x1F252, 0x1F25F}, new[]{0x1F266, 0x1F2FF}, new[]{0x1F321, 0x1F32C}, new[]{0x1F336, 0x1F336}, new[]{0x1F37D, 0x1F37D}, new[]{0x1F394, 0x1F39F}, new[]{0x1F3CB, 0x1F3CE}, new[]{0x1F3D4, 0x1F3DF}, new[]{0x1F3F1, 0x1F3F3}, new[]{0x1F3F5, 0x1F3F7}, new[]{0x1F43F, 0x1F43F}, new[]{0x1F441, 0x1F441}, new[]{0x1F4FD, 0x1F4FE}, new[]{0x1F53E, 0x1F54A}, new[]{0x1F54F, 0x1F54F}, new[]{0x1F568, 0x1F579}, new[]{0x1F57B, 0x1F594}, new[]{0x1F597, 0x1F5A3}, new[]{0x1F5A5, 0x1F5FA}, new[]{0x1F650, 0x1F67F}, new[]{0x1F6C6, 0x1F6CB}, new[]{0x1F6CD, 0x1F6CF}, new[]{0x1F6D3, 0x1F6EA}, new[]{0x1F6ED, 0x1F6F3}, new[]{0x1F6FA, 0x1F90F}, new[]{0x1F93F, 0x1F93F}, new[]{0x1F971, 0x1F972}, new[]{0x1F977, 0x1F979}, new[]{0x1F97B, 0x1F97B}, new[]{0x1F9A3, 0x1F9AF}, new[]{0x1F9BA, 0x1F9BF}, new[]{0x1F9C3, 0x1F9CF}, new[]{0x1FA00, 0x1FFFF}, new[]{0x2FFFE, 0x2FFFF}, new[]{0x3FFFE, 0xE00FF}, new[]{0xE01F0, 0xEFFFF}, new[]{0xFFFFE, 0xFFFFF}, new[]{0x10FFFE, 0x10FFFF}},
            /*1*/new[]{new[]{0x0020, 0x007E}, new[]{0x00A2, 0x00A3}, new[]{0x00A5, 0x00A6}, new[]{0x00AC, 0x00AC}, new[]{0x00AF, 0x00AF}, new[]{0x20A9, 0x20A9}, new[]{0x27E6, 0x27ED}, new[]{0x2985, 0x2986}, new[]{0xFF61, 0xFFBE}, new[]{0xFFC2, 0xFFC7}, new[]{0xFFCA, 0xFFCF}, new[]{0xFFD2, 0xFFD7}, new[]{0xFFDA, 0xFFDC}, new[]{0xFFE8, 0xFFEE}},
            /*2*/new[]{new[]{0x4E00, 0xA48C}, new[]{0xFF01, 0xFF60}, new[]{0xFFE0, 0xFFE6}, new[]{0x3000, 0x303E}, new[]{0x3041, 0x3096}, new[]{0x3099, 0x30FF}, new[]{0x31C0, 0x31E3}, new[]{0x2F00, 0x2FD5}, new[]{0x2E80, 0x2E99}, new[]{0x2E9B, 0x2EF3}, new[]{0x31F0, 0x321E}, new[]{0x3300, 0x4DBF}, new[]{0xE000, 0xFAFF}, new[]{0xFE30, 0xFE52}, new[]{0x3105, 0x312F}, new[]{0x3190, 0x31BA}, new[]{0xAC00, 0xD7A3}, new[]{0x1100, 0x115F}, new[]{0xA960, 0xA97C}, new[]{0x3131, 0x318E}, new[]{0x00A1, 0x00A1}, new[]{0x00A4, 0x00A4}, new[]{0x00A7, 0x00A8}, new[]{0x00AA, 0x00AA}, new[]{0x00AD, 0x00AE}, new[]{0x00B0, 0x00B4}, new[]{0x00B6, 0x00BA}, new[]{0x00BC, 0x00BF}, new[]{0x00C6, 0x00C6}, new[]{0x00D0, 0x00D0}, new[]{0x00D7, 0x00D8}, new[]{0x00DE, 0x00E1}, new[]{0x00E6, 0x00E6}, new[]{0x00E8, 0x00EA}, new[]{0x00EC, 0x00ED}, new[]{0x00F0, 0x00F0}, new[]{0x00F2, 0x00F3}, new[]{0x00F7, 0x00FA}, new[]{0x00FC, 0x00FC}, new[]{0x00FE, 0x00FE}, new[]{0x0101, 0x0101}, new[]{0x0111, 0x0111}, new[]{0x0113, 0x0113}, new[]{0x011B, 0x011B}, new[]{0x0126, 0x0127}, new[]{0x012B, 0x012B}, new[]{0x0131, 0x0133}, new[]{0x0138, 0x0138}, new[]{0x013F, 0x0142}, new[]{0x0144, 0x0144}, new[]{0x0148, 0x014B}, new[]{0x014D, 0x014D}, new[]{0x0152, 0x0153}, new[]{0x0166, 0x0167}, new[]{0x016B, 0x016B}, new[]{0x01CE, 0x01CE}, new[]{0x01D0, 0x01D0}, new[]{0x01D2, 0x01D2}, new[]{0x01D4, 0x01D4}, new[]{0x01D6, 0x01D6}, new[]{0x01D8, 0x01D8}, new[]{0x01DA, 0x01DA}, new[]{0x01DC, 0x01DC}, new[]{0x0251, 0x0251}, new[]{0x0261, 0x0261}, new[]{0x02C4, 0x02C4}, new[]{0x02C7, 0x02C7}, new[]{0x02C9, 0x02CB}, new[]{0x02CD, 0x02CD}, new[]{0x02D0, 0x02D0}, new[]{0x02D8, 0x02DB}, new[]{0x02DD, 0x02DD}, new[]{0x02DF, 0x02DF}, new[]{0x0300, 0x036F}, new[]{0x0391, 0x03A1}, new[]{0x03A3, 0x03A9}, new[]{0x03B1, 0x03C1}, new[]{0x03C3, 0x03C9}, new[]{0x0401, 0x0401}, new[]{0x0410, 0x044F}, new[]{0x0451, 0x0451}, new[]{0x2010, 0x2010}, new[]{0x2013, 0x2016}, new[]{0x2018, 0x2019}, new[]{0x201C, 0x201D}, new[]{0x2020, 0x2022}, new[]{0x2024, 0x2027}, new[]{0x2030, 0x2030}, new[]{0x2032, 0x2033}, new[]{0x2035, 0x2035}, new[]{0x203B, 0x203B}, new[]{0x203E, 0x203E}, new[]{0x2074, 0x2074}, new[]{0x207F, 0x207F}, new[]{0x2081, 0x2084}, new[]{0x20AC, 0x20AC}, new[]{0x2103, 0x2103}, new[]{0x2105, 0x2105}, new[]{0x2109, 0x2109}, new[]{0x2113, 0x2113}, new[]{0x2116, 0x2116}, new[]{0x2121, 0x2122}, new[]{0x2126, 0x2126}, new[]{0x212B, 0x212B}, new[]{0x2153, 0x2154}, new[]{0x215B, 0x215E}, new[]{0x2160, 0x216B}, new[]{0x2170, 0x2179}, new[]{0x2189, 0x2189}, new[]{0x2190, 0x2199}, new[]{0x21B8, 0x21B9}, new[]{0x21D2, 0x21D2}, new[]{0x21D4, 0x21D4}, new[]{0x21E7, 0x21E7}, new[]{0x2200, 0x2200}, new[]{0x2202, 0x2203}, new[]{0x2207, 0x2208}, new[]{0x220B, 0x220B}, new[]{0x220F, 0x220F}, new[]{0x2211, 0x2211}, new[]{0x2215, 0x2215}, new[]{0x221A, 0x221A}, new[]{0x221D, 0x2220}, new[]{0x2223, 0x2223}, new[]{0x2225, 0x2225}, new[]{0x2227, 0x222C}, new[]{0x222E, 0x222E}, new[]{0x2234, 0x2237}, new[]{0x223C, 0x223D}, new[]{0x2248, 0x2248}, new[]{0x224C, 0x224C}, new[]{0x2252, 0x2252}, new[]{0x2260, 0x2261}, new[]{0x2264, 0x2267}, new[]{0x226A, 0x226B}, new[]{0x226E, 0x226F}, new[]{0x2282, 0x2283}, new[]{0x2286, 0x2287}, new[]{0x2295, 0x2295}, new[]{0x2299, 0x2299}, new[]{0x22A5, 0x22A5}, new[]{0x22BF, 0x22BF}, new[]{0x2312, 0x2312}, new[]{0x231A, 0x231B}, new[]{0x2329, 0x232A}, new[]{0x23E9, 0x23EC}, new[]{0x23F0, 0x23F0}, new[]{0x23F3, 0x23F3}, new[]{0x2460, 0x24E9}, new[]{0x24EB, 0x254B}, new[]{0x2550, 0x2573}, new[]{0x2580, 0x258F}, new[]{0x2592, 0x2595}, new[]{0x25A0, 0x25A1}, new[]{0x25A3, 0x25A9}, new[]{0x25B2, 0x25B3}, new[]{0x25B6, 0x25B7}, new[]{0x25BC, 0x25BD}, new[]{0x25C0, 0x25C1}, new[]{0x25C6, 0x25C8}, new[]{0x25CB, 0x25CB}, new[]{0x25CE, 0x25D1}, new[]{0x25E2, 0x25E5}, new[]{0x25EF, 0x25EF}, new[]{0x25FD, 0x25FE}, new[]{0x2605, 0x2606}, new[]{0x2609, 0x2609}, new[]{0x260E, 0x260F}, new[]{0x2614, 0x2615}, new[]{0x261C, 0x261C}, new[]{0x261E, 0x261E}, new[]{0x2640, 0x2640}, new[]{0x2642, 0x2642}, new[]{0x2648, 0x2653}, new[]{0x2660, 0x2661}, new[]{0x2663, 0x2665}, new[]{0x2667, 0x266A}, new[]{0x266C, 0x266D}, new[]{0x266F, 0x266F}, new[]{0x267F, 0x267F}, new[]{0x2693, 0x2693}, new[]{0x269E, 0x269F}, new[]{0x26A1, 0x26A1}, new[]{0x26AA, 0x26AB}, new[]{0x26BD, 0x26BF}, new[]{0x26C4, 0x26E1}, new[]{0x26E3, 0x26E3}, new[]{0x26E8, 0x26FF}, new[]{0x2705, 0x2705}, new[]{0x270A, 0x270B}, new[]{0x2728, 0x2728}, new[]{0x273D, 0x273D}, new[]{0x274C, 0x274C}, new[]{0x274E, 0x274E}, new[]{0x2753, 0x2755}, new[]{0x2757, 0x2757}, new[]{0x2776, 0x277F}, new[]{0x2795, 0x2797}, new[]{0x27B0, 0x27B0}, new[]{0x27BF, 0x27BF}, new[]{0x2B1B, 0x2B1C}, new[]{0x2B50, 0x2B50}, new[]{0x2B55, 0x2B59}, new[]{0x2FF0, 0x2FFB}, new[]{0x3220, 0x32FE}, new[]{0xA490, 0xA4C6}, new[]{0xFE00, 0xFE19}, new[]{0xFE54, 0xFE66}, new[]{0xFE68, 0xFE6B}, new[]{0xFFFD, 0xFFFD}, new[]{0x16FE0, 0x16FE1}, new[]{0x17000, 0x187F1}, new[]{0x18800, 0x18AF2}, new[]{0x1B000, 0x1B11E}, new[]{0x1B170, 0x1B2FB}, new[]{0x1F004, 0x1F004}, new[]{0x1F0CF, 0x1F0CF}, new[]{0x1F100, 0x1F10A}, new[]{0x1F110, 0x1F12D}, new[]{0x1F130, 0x1F169}, new[]{0x1F170, 0x1F1AC}, new[]{0x1F200, 0x1F202}, new[]{0x1F210, 0x1F23B}, new[]{0x1F240, 0x1F248}, new[]{0x1F250, 0x1F251}, new[]{0x1F260, 0x1F265}, new[]{0x1F300, 0x1F320}, new[]{0x1F32D, 0x1F335}, new[]{0x1F337, 0x1F37C}, new[]{0x1F37E, 0x1F393}, new[]{0x1F3A0, 0x1F3CA}, new[]{0x1F3CF, 0x1F3D3}, new[]{0x1F3E0, 0x1F3F0}, new[]{0x1F3F4, 0x1F3F4}, new[]{0x1F3F8, 0x1F43E}, new[]{0x1F440, 0x1F440}, new[]{0x1F442, 0x1F4FC}, new[]{0x1F4FF, 0x1F53D}, new[]{0x1F54B, 0x1F54E}, new[]{0x1F550, 0x1F567}, new[]{0x1F57A, 0x1F57A}, new[]{0x1F595, 0x1F596}, new[]{0x1F5A4, 0x1F5A4}, new[]{0x1F5FB, 0x1F64F}, new[]{0x1F680, 0x1F6C5}, new[]{0x1F6CC, 0x1F6CC}, new[]{0x1F6D0, 0x1F6D2}, new[]{0x1F6EB, 0x1F6EC}, new[]{0x1F6F4, 0x1F6F9}, new[]{0x1F910, 0x1F93E}, new[]{0x1F940, 0x1F970}, new[]{0x1F973, 0x1F976}, new[]{0x1F97A, 0x1F97A}, new[]{0x1F97C, 0x1F9A2}, new[]{0x1F9B0, 0x1F9B9}, new[]{0x1F9C0, 0x1F9C2}, new[]{0x1F9D0, 0x1F9FF}, new[]{0x20000, 0x2FFFD}, new[]{0x30000, 0x3FFFD}, new[]{0xE0100, 0xE01EF}, new[]{0xF0000, 0xFFFFD}, new[]{0x100000, 0x10FFFD}},
        };

        //# EastAsianWidth-11.0.0.txt
        //# Date: 2018-05-14, 09:41:59 GMT [KW, LI]

        //*N */new[]{new[]{0x0000, 0x001F}, new[]{0x007F, 0x00A0}, new[]{0x00A9, 0x00A9}, new[]{0x00AB, 0x00AB}, new[]{0x00B5, 0x00B5}, new[]{0x00BB, 0x00BB}, new[]{0x00C0, 0x00C5}, new[]{0x00C7, 0x00CF}, new[]{0x00D1, 0x00D6}, new[]{0x00D9, 0x00DD}, new[]{0x00E2, 0x00E5}, new[]{0x00E7, 0x00E7}, new[]{0x00EB, 0x00EB}, new[]{0x00EE, 0x00EF}, new[]{0x00F1, 0x00F1}, new[]{0x00F4, 0x00F6}, new[]{0x00FB, 0x00FB}, new[]{0x00FD, 0x00FD}, new[]{0x00FF, 0x0100}, new[]{0x0102, 0x0110}, new[]{0x0112, 0x0112}, new[]{0x0114, 0x011A}, new[]{0x011C, 0x0125}, new[]{0x0128, 0x012A}, new[]{0x012C, 0x0130}, new[]{0x0134, 0x0137}, new[]{0x0139, 0x013E}, new[]{0x0143, 0x0143}, new[]{0x0145, 0x0147}, new[]{0x014C, 0x014C}, new[]{0x014E, 0x0151}, new[]{0x0154, 0x0165}, new[]{0x0168, 0x016A}, new[]{0x016C, 0x01CD}, new[]{0x01CF, 0x01CF}, new[]{0x01D1, 0x01D1}, new[]{0x01D3, 0x01D3}, new[]{0x01D5, 0x01D5}, new[]{0x01D7, 0x01D7}, new[]{0x01D9, 0x01D9}, new[]{0x01DB, 0x01DB}, new[]{0x01DD, 0x0250}, new[]{0x0252, 0x0260}, new[]{0x0262, 0x02C3}, new[]{0x02C5, 0x02C6}, new[]{0x02C8, 0x02C8}, new[]{0x02CC, 0x02CC}, new[]{0x02CE, 0x02CF}, new[]{0x02D1, 0x02D7}, new[]{0x02DC, 0x02DC}, new[]{0x02DE, 0x02DE}, new[]{0x02E0, 0x02FF}, new[]{0x0370, 0x0390}, new[]{0x03A2, 0x03A2}, new[]{0x03AA, 0x03B0}, new[]{0x03C2, 0x03C2}, new[]{0x03CA, 0x0400}, new[]{0x0402, 0x040F}, new[]{0x0450, 0x0450}, new[]{0x0452, 0x10FF}, new[]{0x1160, 0x200F}, new[]{0x2011, 0x2012}, new[]{0x2017, 0x2017}, new[]{0x201A, 0x201B}, new[]{0x201E, 0x201F}, new[]{0x2023, 0x2023}, new[]{0x2028, 0x202F}, new[]{0x2031, 0x2031}, new[]{0x2034, 0x2034}, new[]{0x2036, 0x203A}, new[]{0x203C, 0x203D}, new[]{0x203F, 0x2073}, new[]{0x2075, 0x207E}, new[]{0x2080, 0x2080}, new[]{0x2085, 0x20A8}, new[]{0x20AA, 0x20AB}, new[]{0x20AD, 0x2102}, new[]{0x2104, 0x2104}, new[]{0x2106, 0x2108}, new[]{0x210A, 0x2112}, new[]{0x2114, 0x2115}, new[]{0x2117, 0x2120}, new[]{0x2123, 0x2125}, new[]{0x2127, 0x212A}, new[]{0x212C, 0x2152}, new[]{0x2155, 0x215A}, new[]{0x215F, 0x215F}, new[]{0x216C, 0x216F}, new[]{0x217A, 0x2188}, new[]{0x218A, 0x218F}, new[]{0x219A, 0x21B7}, new[]{0x21BA, 0x21D1}, new[]{0x21D3, 0x21D3}, new[]{0x21D5, 0x21E6}, new[]{0x21E8, 0x21FF}, new[]{0x2201, 0x2201}, new[]{0x2204, 0x2206}, new[]{0x2209, 0x220A}, new[]{0x220C, 0x220E}, new[]{0x2210, 0x2210}, new[]{0x2212, 0x2214}, new[]{0x2216, 0x2219}, new[]{0x221B, 0x221C}, new[]{0x2221, 0x2222}, new[]{0x2224, 0x2224}, new[]{0x2226, 0x2226}, new[]{0x222D, 0x222D}, new[]{0x222F, 0x2233}, new[]{0x2238, 0x223B}, new[]{0x223E, 0x2247}, new[]{0x2249, 0x224B}, new[]{0x224D, 0x2251}, new[]{0x2253, 0x225F}, new[]{0x2262, 0x2263}, new[]{0x2268, 0x2269}, new[]{0x226C, 0x226D}, new[]{0x2270, 0x2281}, new[]{0x2284, 0x2285}, new[]{0x2288, 0x2294}, new[]{0x2296, 0x2298}, new[]{0x229A, 0x22A4}, new[]{0x22A6, 0x22BE}, new[]{0x22C0, 0x2311}, new[]{0x2313, 0x2319}, new[]{0x231C, 0x2328}, new[]{0x232B, 0x23E8}, new[]{0x23ED, 0x23EF}, new[]{0x23F1, 0x23F2}, new[]{0x23F4, 0x245F}, new[]{0x24EA, 0x24EA}, new[]{0x254C, 0x254F}, new[]{0x2574, 0x257F}, new[]{0x2590, 0x2591}, new[]{0x2596, 0x259F}, new[]{0x25A2, 0x25A2}, new[]{0x25AA, 0x25B1}, new[]{0x25B4, 0x25B5}, new[]{0x25B8, 0x25BB}, new[]{0x25BE, 0x25BF}, new[]{0x25C2, 0x25C5}, new[]{0x25C9, 0x25CA}, new[]{0x25CC, 0x25CD}, new[]{0x25D2, 0x25E1}, new[]{0x25E6, 0x25EE}, new[]{0x25F0, 0x25FC}, new[]{0x25FF, 0x2604}, new[]{0x2607, 0x2608}, new[]{0x260A, 0x260D}, new[]{0x2610, 0x2613}, new[]{0x2616, 0x261B}, new[]{0x261D, 0x261D}, new[]{0x261F, 0x263F}, new[]{0x2641, 0x2641}, new[]{0x2643, 0x2647}, new[]{0x2654, 0x265F}, new[]{0x2662, 0x2662}, new[]{0x2666, 0x2666}, new[]{0x266B, 0x266B}, new[]{0x266E, 0x266E}, new[]{0x2670, 0x267E}, new[]{0x2680, 0x2692}, new[]{0x2694, 0x269D}, new[]{0x26A0, 0x26A0}, new[]{0x26A2, 0x26A9}, new[]{0x26AC, 0x26BC}, new[]{0x26C0, 0x26C3}, new[]{0x26E2, 0x26E2}, new[]{0x26E4, 0x26E7}, new[]{0x2700, 0x2704}, new[]{0x2706, 0x2709}, new[]{0x270C, 0x2727}, new[]{0x2729, 0x273C}, new[]{0x273E, 0x274B}, new[]{0x274D, 0x274D}, new[]{0x274F, 0x2752}, new[]{0x2756, 0x2756}, new[]{0x2758, 0x2775}, new[]{0x2780, 0x2794}, new[]{0x2798, 0x27AF}, new[]{0x27B1, 0x27BE}, new[]{0x27C0, 0x27E5}, new[]{0x27EE, 0x2984}, new[]{0x2987, 0x2B1A}, new[]{0x2B1D, 0x2B4F}, new[]{0x2B51, 0x2B54}, new[]{0x2B5A, 0x2E7F}, new[]{0x2E9A, 0x2E9A}, new[]{0x2EF4, 0x2EFF}, new[]{0x2FD6, 0x2FEF}, new[]{0x2FFC, 0x2FFF}, new[]{0x303F, 0x3040}, new[]{0x3097, 0x3098}, new[]{0x3100, 0x3104}, new[]{0x3130, 0x3130}, new[]{0x318F, 0x318F}, new[]{0x31BB, 0x31BF}, new[]{0x31E4, 0x31EF}, new[]{0x321F, 0x321F}, new[]{0x32FF, 0x32FF}, new[]{0x4DC0, 0x4DFF}, new[]{0xA48D, 0xA48F}, new[]{0xA4C7, 0xA95F}, new[]{0xA97D, 0xABFF}, new[]{0xD7A4, 0xDFFF}, new[]{0xFB00, 0xFDFF}, new[]{0xFE1A, 0xFE2F}, new[]{0xFE53, 0xFE53}, new[]{0xFE67, 0xFE67}, new[]{0xFE6C, 0xFF00}, new[]{0xFFBF, 0xFFC1}, new[]{0xFFC8, 0xFFC9}, new[]{0xFFD0, 0xFFD1}, new[]{0xFFD8, 0xFFD9}, new[]{0xFFDD, 0xFFDF}, new[]{0xFFE7, 0xFFE7}, new[]{0xFFEF, 0xFFFC}, new[]{0xFFFE, 0x16FDF}, new[]{0x16FE2, 0x16FFF}, new[]{0x187F2, 0x187FF}, new[]{0x18AF3, 0x1AFFF}, new[]{0x1B11F, 0x1B16F}, new[]{0x1B2FC, 0x1F003}, new[]{0x1F005, 0x1F0CE}, new[]{0x1F0D0, 0x1F0FF}, new[]{0x1F10B, 0x1F10F}, new[]{0x1F12E, 0x1F12F}, new[]{0x1F16A, 0x1F16F}, new[]{0x1F1AD, 0x1F1FF}, new[]{0x1F203, 0x1F20F}, new[]{0x1F23C, 0x1F23F}, new[]{0x1F249, 0x1F24F}, new[]{0x1F252, 0x1F25F}, new[]{0x1F266, 0x1F2FF}, new[]{0x1F321, 0x1F32C}, new[]{0x1F336, 0x1F336}, new[]{0x1F37D, 0x1F37D}, new[]{0x1F394, 0x1F39F}, new[]{0x1F3CB, 0x1F3CE}, new[]{0x1F3D4, 0x1F3DF}, new[]{0x1F3F1, 0x1F3F3}, new[]{0x1F3F5, 0x1F3F7}, new[]{0x1F43F, 0x1F43F}, new[]{0x1F441, 0x1F441}, new[]{0x1F4FD, 0x1F4FE}, new[]{0x1F53E, 0x1F54A}, new[]{0x1F54F, 0x1F54F}, new[]{0x1F568, 0x1F579}, new[]{0x1F57B, 0x1F594}, new[]{0x1F597, 0x1F5A3}, new[]{0x1F5A5, 0x1F5FA}, new[]{0x1F650, 0x1F67F}, new[]{0x1F6C6, 0x1F6CB}, new[]{0x1F6CD, 0x1F6CF}, new[]{0x1F6D3, 0x1F6EA}, new[]{0x1F6ED, 0x1F6F3}, new[]{0x1F6FA, 0x1F90F}, new[]{0x1F93F, 0x1F93F}, new[]{0x1F971, 0x1F972}, new[]{0x1F977, 0x1F979}, new[]{0x1F97B, 0x1F97B}, new[]{0x1F9A3, 0x1F9AF}, new[]{0x1F9BA, 0x1F9BF}, new[]{0x1F9C3, 0x1F9CF}, new[]{0x1FA00, 0x1FFFF}, new[]{0x2FFFE, 0x2FFFF}, new[]{0x3FFFE, 0xE00FF}, new[]{0xE01F0, 0xEFFFF}, new[]{0xFFFFE, 0xFFFFF}, new[]{0x10FFFE, 0x10FFFF}},
        //*Na*/new[]{new[]{0x0020, 0x007E}, new[]{0x00A2, 0x00A3}, new[]{0x00A5, 0x00A6}, new[]{0x00AC, 0x00AC}, new[]{0x00AF, 0x00AF}, new[]{0x27E6, 0x27ED}, new[]{0x2985, 0x2986}},
        //*H */new[]{new[]{0x20A9, 0x20A9}, new[]{0xFF61, 0xFFBE}, new[]{0xFFC2, 0xFFC7}, new[]{0xFFCA, 0xFFCF}, new[]{0xFFD2, 0xFFD7}, new[]{0xFFDA, 0xFFDC}, new[]{0xFFE8, 0xFFEE}},
        //*F */new[]{new[]{0x3000, 0x3000}, new[]{0xFF01, 0xFF60}, new[]{0xFFE0, 0xFFE6}},
        //*W */new[]{new[]{0x1100, 0x115F}, new[]{0x231A, 0x231B}, new[]{0x2329, 0x232A}, new[]{0x23E9, 0x23EC}, new[]{0x23F0, 0x23F0}, new[]{0x23F3, 0x23F3}, new[]{0x25FD, 0x25FE}, new[]{0x2614, 0x2615}, new[]{0x2648, 0x2653}, new[]{0x267F, 0x267F}, new[]{0x2693, 0x2693}, new[]{0x26A1, 0x26A1}, new[]{0x26AA, 0x26AB}, new[]{0x26BD, 0x26BE}, new[]{0x26C4, 0x26C5}, new[]{0x26CE, 0x26CE}, new[]{0x26D4, 0x26D4}, new[]{0x26EA, 0x26EA}, new[]{0x26F2, 0x26F3}, new[]{0x26F5, 0x26F5}, new[]{0x26FA, 0x26FA}, new[]{0x26FD, 0x26FD}, new[]{0x2705, 0x2705}, new[]{0x270A, 0x270B}, new[]{0x2728, 0x2728}, new[]{0x274C, 0x274C}, new[]{0x274E, 0x274E}, new[]{0x2753, 0x2755}, new[]{0x2757, 0x2757}, new[]{0x2795, 0x2797}, new[]{0x27B0, 0x27B0}, new[]{0x27BF, 0x27BF}, new[]{0x2B1B, 0x2B1C}, new[]{0x2B50, 0x2B50}, new[]{0x2B55, 0x2B55}, new[]{0x2E80, 0x2E99}, new[]{0x2E9B, 0x2EF3}, new[]{0x2F00, 0x2FD5}, new[]{0x2FF0, 0x2FFB}, new[]{0x3001, 0x303E}, new[]{0x3041, 0x3096}, new[]{0x3099, 0x30FF}, new[]{0x3105, 0x312F}, new[]{0x3131, 0x318E}, new[]{0x3190, 0x31BA}, new[]{0x31C0, 0x31E3}, new[]{0x31F0, 0x321E}, new[]{0x3220, 0x3247}, new[]{0x3250, 0x32FE}, new[]{0x3300, 0x4DBF}, new[]{0x4E00, 0xA48C}, new[]{0xA490, 0xA4C6}, new[]{0xA960, 0xA97C}, new[]{0xAC00, 0xD7A3}, new[]{0xF900, 0xFAFF}, new[]{0xFE10, 0xFE19}, new[]{0xFE30, 0xFE52}, new[]{0xFE54, 0xFE66}, new[]{0xFE68, 0xFE6B}, new[]{0x16FE0, 0x16FE1}, new[]{0x17000, 0x187F1}, new[]{0x18800, 0x18AF2}, new[]{0x1B000, 0x1B11E}, new[]{0x1B170, 0x1B2FB}, new[]{0x1F004, 0x1F004}, new[]{0x1F0CF, 0x1F0CF}, new[]{0x1F18E, 0x1F18E}, new[]{0x1F191, 0x1F19A}, new[]{0x1F200, 0x1F202}, new[]{0x1F210, 0x1F23B}, new[]{0x1F240, 0x1F248}, new[]{0x1F250, 0x1F251}, new[]{0x1F260, 0x1F265}, new[]{0x1F300, 0x1F320}, new[]{0x1F32D, 0x1F335}, new[]{0x1F337, 0x1F37C}, new[]{0x1F37E, 0x1F393}, new[]{0x1F3A0, 0x1F3CA}, new[]{0x1F3CF, 0x1F3D3}, new[]{0x1F3E0, 0x1F3F0}, new[]{0x1F3F4, 0x1F3F4}, new[]{0x1F3F8, 0x1F43E}, new[]{0x1F440, 0x1F440}, new[]{0x1F442, 0x1F4FC}, new[]{0x1F4FF, 0x1F53D}, new[]{0x1F54B, 0x1F54E}, new[]{0x1F550, 0x1F567}, new[]{0x1F57A, 0x1F57A}, new[]{0x1F595, 0x1F596}, new[]{0x1F5A4, 0x1F5A4}, new[]{0x1F5FB, 0x1F64F}, new[]{0x1F680, 0x1F6C5}, new[]{0x1F6CC, 0x1F6CC}, new[]{0x1F6D0, 0x1F6D2}, new[]{0x1F6EB, 0x1F6EC}, new[]{0x1F6F4, 0x1F6F9}, new[]{0x1F910, 0x1F93E}, new[]{0x1F940, 0x1F970}, new[]{0x1F973, 0x1F976}, new[]{0x1F97A, 0x1F97A}, new[]{0x1F97C, 0x1F9A2}, new[]{0x1F9B0, 0x1F9B9}, new[]{0x1F9C0, 0x1F9C2}, new[]{0x1F9D0, 0x1F9FF}, new[]{0x20000, 0x2FFFD}, new[]{0x30000, 0x3FFFD}},
        //*A */new[]{new[]{0x00A1, 0x00A1}, new[]{0x00A4, 0x00A4}, new[]{0x00A7, 0x00A8}, new[]{0x00AA, 0x00AA}, new[]{0x00AD, 0x00AE}, new[]{0x00B0, 0x00B4}, new[]{0x00B6, 0x00BA}, new[]{0x00BC, 0x00BF}, new[]{0x00C6, 0x00C6}, new[]{0x00D0, 0x00D0}, new[]{0x00D7, 0x00D8}, new[]{0x00DE, 0x00E1}, new[]{0x00E6, 0x00E6}, new[]{0x00E8, 0x00EA}, new[]{0x00EC, 0x00ED}, new[]{0x00F0, 0x00F0}, new[]{0x00F2, 0x00F3}, new[]{0x00F7, 0x00FA}, new[]{0x00FC, 0x00FC}, new[]{0x00FE, 0x00FE}, new[]{0x0101, 0x0101}, new[]{0x0111, 0x0111}, new[]{0x0113, 0x0113}, new[]{0x011B, 0x011B}, new[]{0x0126, 0x0127}, new[]{0x012B, 0x012B}, new[]{0x0131, 0x0133}, new[]{0x0138, 0x0138}, new[]{0x013F, 0x0142}, new[]{0x0144, 0x0144}, new[]{0x0148, 0x014B}, new[]{0x014D, 0x014D}, new[]{0x0152, 0x0153}, new[]{0x0166, 0x0167}, new[]{0x016B, 0x016B}, new[]{0x01CE, 0x01CE}, new[]{0x01D0, 0x01D0}, new[]{0x01D2, 0x01D2}, new[]{0x01D4, 0x01D4}, new[]{0x01D6, 0x01D6}, new[]{0x01D8, 0x01D8}, new[]{0x01DA, 0x01DA}, new[]{0x01DC, 0x01DC}, new[]{0x0251, 0x0251}, new[]{0x0261, 0x0261}, new[]{0x02C4, 0x02C4}, new[]{0x02C7, 0x02C7}, new[]{0x02C9, 0x02CB}, new[]{0x02CD, 0x02CD}, new[]{0x02D0, 0x02D0}, new[]{0x02D8, 0x02DB}, new[]{0x02DD, 0x02DD}, new[]{0x02DF, 0x02DF}, new[]{0x0300, 0x036F}, new[]{0x0391, 0x03A1}, new[]{0x03A3, 0x03A9}, new[]{0x03B1, 0x03C1}, new[]{0x03C3, 0x03C9}, new[]{0x0401, 0x0401}, new[]{0x0410, 0x044F}, new[]{0x0451, 0x0451}, new[]{0x2010, 0x2010}, new[]{0x2013, 0x2016}, new[]{0x2018, 0x2019}, new[]{0x201C, 0x201D}, new[]{0x2020, 0x2022}, new[]{0x2024, 0x2027}, new[]{0x2030, 0x2030}, new[]{0x2032, 0x2033}, new[]{0x2035, 0x2035}, new[]{0x203B, 0x203B}, new[]{0x203E, 0x203E}, new[]{0x2074, 0x2074}, new[]{0x207F, 0x207F}, new[]{0x2081, 0x2084}, new[]{0x20AC, 0x20AC}, new[]{0x2103, 0x2103}, new[]{0x2105, 0x2105}, new[]{0x2109, 0x2109}, new[]{0x2113, 0x2113}, new[]{0x2116, 0x2116}, new[]{0x2121, 0x2122}, new[]{0x2126, 0x2126}, new[]{0x212B, 0x212B}, new[]{0x2153, 0x2154}, new[]{0x215B, 0x215E}, new[]{0x2160, 0x216B}, new[]{0x2170, 0x2179}, new[]{0x2189, 0x2189}, new[]{0x2190, 0x2199}, new[]{0x21B8, 0x21B9}, new[]{0x21D2, 0x21D2}, new[]{0x21D4, 0x21D4}, new[]{0x21E7, 0x21E7}, new[]{0x2200, 0x2200}, new[]{0x2202, 0x2203}, new[]{0x2207, 0x2208}, new[]{0x220B, 0x220B}, new[]{0x220F, 0x220F}, new[]{0x2211, 0x2211}, new[]{0x2215, 0x2215}, new[]{0x221A, 0x221A}, new[]{0x221D, 0x2220}, new[]{0x2223, 0x2223}, new[]{0x2225, 0x2225}, new[]{0x2227, 0x222C}, new[]{0x222E, 0x222E}, new[]{0x2234, 0x2237}, new[]{0x223C, 0x223D}, new[]{0x2248, 0x2248}, new[]{0x224C, 0x224C}, new[]{0x2252, 0x2252}, new[]{0x2260, 0x2261}, new[]{0x2264, 0x2267}, new[]{0x226A, 0x226B}, new[]{0x226E, 0x226F}, new[]{0x2282, 0x2283}, new[]{0x2286, 0x2287}, new[]{0x2295, 0x2295}, new[]{0x2299, 0x2299}, new[]{0x22A5, 0x22A5}, new[]{0x22BF, 0x22BF}, new[]{0x2312, 0x2312}, new[]{0x2460, 0x24E9}, new[]{0x24EB, 0x254B}, new[]{0x2550, 0x2573}, new[]{0x2580, 0x258F}, new[]{0x2592, 0x2595}, new[]{0x25A0, 0x25A1}, new[]{0x25A3, 0x25A9}, new[]{0x25B2, 0x25B3}, new[]{0x25B6, 0x25B7}, new[]{0x25BC, 0x25BD}, new[]{0x25C0, 0x25C1}, new[]{0x25C6, 0x25C8}, new[]{0x25CB, 0x25CB}, new[]{0x25CE, 0x25D1}, new[]{0x25E2, 0x25E5}, new[]{0x25EF, 0x25EF}, new[]{0x2605, 0x2606}, new[]{0x2609, 0x2609}, new[]{0x260E, 0x260F}, new[]{0x261C, 0x261C}, new[]{0x261E, 0x261E}, new[]{0x2640, 0x2640}, new[]{0x2642, 0x2642}, new[]{0x2660, 0x2661}, new[]{0x2663, 0x2665}, new[]{0x2667, 0x266A}, new[]{0x266C, 0x266D}, new[]{0x266F, 0x266F}, new[]{0x269E, 0x269F}, new[]{0x26BF, 0x26BF}, new[]{0x26C6, 0x26CD}, new[]{0x26CF, 0x26D3}, new[]{0x26D5, 0x26E1}, new[]{0x26E3, 0x26E3}, new[]{0x26E8, 0x26E9}, new[]{0x26EB, 0x26F1}, new[]{0x26F4, 0x26F4}, new[]{0x26F6, 0x26F9}, new[]{0x26FB, 0x26FC}, new[]{0x26FE, 0x26FF}, new[]{0x273D, 0x273D}, new[]{0x2776, 0x277F}, new[]{0x2B56, 0x2B59}, new[]{0x3248, 0x324F}, new[]{0xE000, 0xF8FF}, new[]{0xFE00, 0xFE0F}, new[]{0xFFFD, 0xFFFD}, new[]{0x1F100, 0x1F10A}, new[]{0x1F110, 0x1F12D}, new[]{0x1F130, 0x1F169}, new[]{0x1F170, 0x1F18D}, new[]{0x1F18F, 0x1F190}, new[]{0x1F19B, 0x1F1AC}, new[]{0xE0100, 0xE01EF}, new[]{0xF0000, 0xFFFFD}, new[]{0x100000, 0x10FFFD}},

        //*0*/new[]{new[]{0x0000, 0x001F}, new[]{0xFE6C, 0xFF00}, new[]{0x007F, 0x00A0}, new[]{0x00A9, 0x00A9}, new[]{0x00AB, 0x00AB}, new[]{0x00B5, 0x00B5}, new[]{0x00BB, 0x00BB}, new[]{0x00C0, 0x00C5}, new[]{0x00C7, 0x00CF}, new[]{0x00D1, 0x00D6}, new[]{0x00D9, 0x00DD}, new[]{0x00E2, 0x00E5}, new[]{0x00E7, 0x00E7}, new[]{0x00EB, 0x00EB}, new[]{0x00EE, 0x00EF}, new[]{0x00F1, 0x00F1}, new[]{0x00F4, 0x00F6}, new[]{0x00FB, 0x00FB}, new[]{0x00FD, 0x00FD}, new[]{0x00FF, 0x0100}, new[]{0x0102, 0x0110}, new[]{0x0112, 0x0112}, new[]{0x0114, 0x011A}, new[]{0x011C, 0x0125}, new[]{0x0128, 0x012A}, new[]{0x012C, 0x0130}, new[]{0x0134, 0x0137}, new[]{0x0139, 0x013E}, new[]{0x0143, 0x0143}, new[]{0x0145, 0x0147}, new[]{0x014C, 0x014C}, new[]{0x014E, 0x0151}, new[]{0x0154, 0x0165}, new[]{0x0168, 0x016A}, new[]{0x016C, 0x01CD}, new[]{0x01CF, 0x01CF}, new[]{0x01D1, 0x01D1}, new[]{0x01D3, 0x01D3}, new[]{0x01D5, 0x01D5}, new[]{0x01D7, 0x01D7}, new[]{0x01D9, 0x01D9}, new[]{0x01DB, 0x01DB}, new[]{0x01DD, 0x0250}, new[]{0x0252, 0x0260}, new[]{0x0262, 0x02C3}, new[]{0x02C5, 0x02C6}, new[]{0x02C8, 0x02C8}, new[]{0x02CC, 0x02CC}, new[]{0x02CE, 0x02CF}, new[]{0x02D1, 0x02D7}, new[]{0x02DC, 0x02DC}, new[]{0x02DE, 0x02DE}, new[]{0x02E0, 0x02FF}, new[]{0x0370, 0x0390}, new[]{0x03A2, 0x03A2}, new[]{0x03AA, 0x03B0}, new[]{0x03C2, 0x03C2}, new[]{0x03CA, 0x0400}, new[]{0x0402, 0x040F}, new[]{0x0450, 0x0450}, new[]{0x0452, 0x10FF}, new[]{0x1160, 0x200F}, new[]{0x2011, 0x2012}, new[]{0x2017, 0x2017}, new[]{0x201A, 0x201B}, new[]{0x201E, 0x201F}, new[]{0x2023, 0x2023}, new[]{0x2028, 0x202F}, new[]{0x2031, 0x2031}, new[]{0x2034, 0x2034}, new[]{0x2036, 0x203A}, new[]{0x203C, 0x203D}, new[]{0x203F, 0x2073}, new[]{0x2075, 0x207E}, new[]{0x2080, 0x2080}, new[]{0x2085, 0x20A8}, new[]{0x20AA, 0x20AB}, new[]{0x20AD, 0x2102}, new[]{0x2104, 0x2104}, new[]{0x2106, 0x2108}, new[]{0x210A, 0x2112}, new[]{0x2114, 0x2115}, new[]{0x2117, 0x2120}, new[]{0x2123, 0x2125}, new[]{0x2127, 0x212A}, new[]{0x212C, 0x2152}, new[]{0x2155, 0x215A}, new[]{0x215F, 0x215F}, new[]{0x216C, 0x216F}, new[]{0x217A, 0x2188}, new[]{0x218A, 0x218F}, new[]{0x219A, 0x21B7}, new[]{0x21BA, 0x21D1}, new[]{0x21D3, 0x21D3}, new[]{0x21D5, 0x21E6}, new[]{0x21E8, 0x21FF}, new[]{0x2201, 0x2201}, new[]{0x2204, 0x2206}, new[]{0x2209, 0x220A}, new[]{0x220C, 0x220E}, new[]{0x2210, 0x2210}, new[]{0x2212, 0x2214}, new[]{0x2216, 0x2219}, new[]{0x221B, 0x221C}, new[]{0x2221, 0x2222}, new[]{0x2224, 0x2224}, new[]{0x2226, 0x2226}, new[]{0x222D, 0x222D}, new[]{0x222F, 0x2233}, new[]{0x2238, 0x223B}, new[]{0x223E, 0x2247}, new[]{0x2249, 0x224B}, new[]{0x224D, 0x2251}, new[]{0x2253, 0x225F}, new[]{0x2262, 0x2263}, new[]{0x2268, 0x2269}, new[]{0x226C, 0x226D}, new[]{0x2270, 0x2281}, new[]{0x2284, 0x2285}, new[]{0x2288, 0x2294}, new[]{0x2296, 0x2298}, new[]{0x229A, 0x22A4}, new[]{0x22A6, 0x22BE}, new[]{0x22C0, 0x2311}, new[]{0x2313, 0x2319}, new[]{0x231C, 0x2328}, new[]{0x232B, 0x23E8}, new[]{0x23ED, 0x23EF}, new[]{0x23F1, 0x23F2}, new[]{0x23F4, 0x245F}, new[]{0x24EA, 0x24EA}, new[]{0x254C, 0x254F}, new[]{0x2574, 0x257F}, new[]{0x2590, 0x2591}, new[]{0x2596, 0x259F}, new[]{0x25A2, 0x25A2}, new[]{0x25AA, 0x25B1}, new[]{0x25B4, 0x25B5}, new[]{0x25B8, 0x25BB}, new[]{0x25BE, 0x25BF}, new[]{0x25C2, 0x25C5}, new[]{0x25C9, 0x25CA}, new[]{0x25CC, 0x25CD}, new[]{0x25D2, 0x25E1}, new[]{0x25E6, 0x25EE}, new[]{0x25F0, 0x25FC}, new[]{0x25FF, 0x2604}, new[]{0x2607, 0x2608}, new[]{0x260A, 0x260D}, new[]{0x2610, 0x2613}, new[]{0x2616, 0x261B}, new[]{0x261D, 0x261D}, new[]{0x261F, 0x263F}, new[]{0x2641, 0x2641}, new[]{0x2643, 0x2647}, new[]{0x2654, 0x265F}, new[]{0x2662, 0x2662}, new[]{0x2666, 0x2666}, new[]{0x266B, 0x266B}, new[]{0x266E, 0x266E}, new[]{0x2670, 0x267E}, new[]{0x2680, 0x2692}, new[]{0x2694, 0x269D}, new[]{0x26A0, 0x26A0}, new[]{0x26A2, 0x26A9}, new[]{0x26AC, 0x26BC}, new[]{0x26C0, 0x26C3}, new[]{0x26E2, 0x26E2}, new[]{0x26E4, 0x26E7}, new[]{0x2700, 0x2704}, new[]{0x2706, 0x2709}, new[]{0x270C, 0x2727}, new[]{0x2729, 0x273C}, new[]{0x273E, 0x274B}, new[]{0x274D, 0x274D}, new[]{0x274F, 0x2752}, new[]{0x2756, 0x2756}, new[]{0x2758, 0x2775}, new[]{0x2780, 0x2794}, new[]{0x2798, 0x27AF}, new[]{0x27B1, 0x27BE}, new[]{0x27C0, 0x27E5}, new[]{0x27EE, 0x2984}, new[]{0x2987, 0x2B1A}, new[]{0x2B1D, 0x2B4F}, new[]{0x2B51, 0x2B54}, new[]{0x2B5A, 0x2E7F}, new[]{0x2E9A, 0x2E9A}, new[]{0x2EF4, 0x2EFF}, new[]{0x2FD6, 0x2FEF}, new[]{0x2FFC, 0x2FFF}, new[]{0x303F, 0x3040}, new[]{0x3097, 0x3098}, new[]{0x3100, 0x3104}, new[]{0x3130, 0x3130}, new[]{0x318F, 0x318F}, new[]{0x31BB, 0x31BF}, new[]{0x31E4, 0x31EF}, new[]{0x321F, 0x321F}, new[]{0x32FF, 0x32FF}, new[]{0x4DC0, 0x4DFF}, new[]{0xA48D, 0xA48F}, new[]{0xA4C7, 0xA95F}, new[]{0xA97D, 0xABFF}, new[]{0xD7A4, 0xDFFF}, new[]{0xFB00, 0xFDFF}, new[]{0xFE1A, 0xFE2F}, new[]{0xFE53, 0xFE53}, new[]{0xFE67, 0xFE67}, new[]{0xFFBF, 0xFFC1}, new[]{0xFFC8, 0xFFC9}, new[]{0xFFD0, 0xFFD1}, new[]{0xFFD8, 0xFFD9}, new[]{0xFFDD, 0xFFDF}, new[]{0xFFE7, 0xFFE7}, new[]{0xFFEF, 0xFFFC}, new[]{0xFFFE, 0x16FDF}, new[]{0x16FE2, 0x16FFF}, new[]{0x187F2, 0x187FF}, new[]{0x18AF3, 0x1AFFF}, new[]{0x1B11F, 0x1B16F}, new[]{0x1B2FC, 0x1F003}, new[]{0x1F005, 0x1F0CE}, new[]{0x1F0D0, 0x1F0FF}, new[]{0x1F10B, 0x1F10F}, new[]{0x1F12E, 0x1F12F}, new[]{0x1F16A, 0x1F16F}, new[]{0x1F1AD, 0x1F1FF}, new[]{0x1F203, 0x1F20F}, new[]{0x1F23C, 0x1F23F}, new[]{0x1F249, 0x1F24F}, new[]{0x1F252, 0x1F25F}, new[]{0x1F266, 0x1F2FF}, new[]{0x1F321, 0x1F32C}, new[]{0x1F336, 0x1F336}, new[]{0x1F37D, 0x1F37D}, new[]{0x1F394, 0x1F39F}, new[]{0x1F3CB, 0x1F3CE}, new[]{0x1F3D4, 0x1F3DF}, new[]{0x1F3F1, 0x1F3F3}, new[]{0x1F3F5, 0x1F3F7}, new[]{0x1F43F, 0x1F43F}, new[]{0x1F441, 0x1F441}, new[]{0x1F4FD, 0x1F4FE}, new[]{0x1F53E, 0x1F54A}, new[]{0x1F54F, 0x1F54F}, new[]{0x1F568, 0x1F579}, new[]{0x1F57B, 0x1F594}, new[]{0x1F597, 0x1F5A3}, new[]{0x1F5A5, 0x1F5FA}, new[]{0x1F650, 0x1F67F}, new[]{0x1F6C6, 0x1F6CB}, new[]{0x1F6CD, 0x1F6CF}, new[]{0x1F6D3, 0x1F6EA}, new[]{0x1F6ED, 0x1F6F3}, new[]{0x1F6FA, 0x1F90F}, new[]{0x1F93F, 0x1F93F}, new[]{0x1F971, 0x1F972}, new[]{0x1F977, 0x1F979}, new[]{0x1F97B, 0x1F97B}, new[]{0x1F9A3, 0x1F9AF}, new[]{0x1F9BA, 0x1F9BF}, new[]{0x1F9C3, 0x1F9CF}, new[]{0x1FA00, 0x1FFFF}, new[]{0x2FFFE, 0x2FFFF}, new[]{0x3FFFE, 0xE00FF}, new[]{0xE01F0, 0xEFFFF}, new[]{0xFFFFE, 0xFFFFF}, new[]{0x10FFFE, 0x10FFFF}},
        //*1*/new[]{new[]{0x0020, 0x007E}, new[]{0x00A2, 0x00A3}, new[]{0x00A5, 0x00A6}, new[]{0x00AC, 0x00AC}, new[]{0x00AF, 0x00AF}, new[]{0x20A9, 0x20A9}, new[]{0x27E6, 0x27ED}, new[]{0x2985, 0x2986}, new[]{0xFF61, 0xFFBE}, new[]{0xFFC2, 0xFFC7}, new[]{0xFFCA, 0xFFCF}, new[]{0xFFD2, 0xFFD7}, new[]{0xFFDA, 0xFFDC}, new[]{0xFFE8, 0xFFEE}},
        //*2*/new[]{new[]{0x4E00, 0xA48C}, new[]{0xFF01, 0xFF60}, new[]{0xFFE0, 0xFFE6}, new[]{0x3000, 0x303E}, new[]{0x3041, 0x3096}, new[]{0x3099, 0x30FF}, new[]{0x31C0, 0x31E3}, new[]{0x2F00, 0x2FD5}, new[]{0x2E80, 0x2E99}, new[]{0x2E9B, 0x2EF3}, new[]{0x31F0, 0x321E}, new[]{0x3300, 0x4DBF}, new[]{0xE000, 0xFAFF}, new[]{0xFE30, 0xFE52}, new[]{0x3105, 0x312F}, new[]{0x3190, 0x31BA}, new[]{0xAC00, 0xD7A3}, new[]{0x1100, 0x115F}, new[]{0xA960, 0xA97C}, new[]{0x3131, 0x318E}, new[]{0x00A1, 0x00A1}, new[]{0x00A4, 0x00A4}, new[]{0x00A7, 0x00A8}, new[]{0x00AA, 0x00AA}, new[]{0x00AD, 0x00AE}, new[]{0x00B0, 0x00B4}, new[]{0x00B6, 0x00BA}, new[]{0x00BC, 0x00BF}, new[]{0x00C6, 0x00C6}, new[]{0x00D0, 0x00D0}, new[]{0x00D7, 0x00D8}, new[]{0x00DE, 0x00E1}, new[]{0x00E6, 0x00E6}, new[]{0x00E8, 0x00EA}, new[]{0x00EC, 0x00ED}, new[]{0x00F0, 0x00F0}, new[]{0x00F2, 0x00F3}, new[]{0x00F7, 0x00FA}, new[]{0x00FC, 0x00FC}, new[]{0x00FE, 0x00FE}, new[]{0x0101, 0x0101}, new[]{0x0111, 0x0111}, new[]{0x0113, 0x0113}, new[]{0x011B, 0x011B}, new[]{0x0126, 0x0127}, new[]{0x012B, 0x012B}, new[]{0x0131, 0x0133}, new[]{0x0138, 0x0138}, new[]{0x013F, 0x0142}, new[]{0x0144, 0x0144}, new[]{0x0148, 0x014B}, new[]{0x014D, 0x014D}, new[]{0x0152, 0x0153}, new[]{0x0166, 0x0167}, new[]{0x016B, 0x016B}, new[]{0x01CE, 0x01CE}, new[]{0x01D0, 0x01D0}, new[]{0x01D2, 0x01D2}, new[]{0x01D4, 0x01D4}, new[]{0x01D6, 0x01D6}, new[]{0x01D8, 0x01D8}, new[]{0x01DA, 0x01DA}, new[]{0x01DC, 0x01DC}, new[]{0x0251, 0x0251}, new[]{0x0261, 0x0261}, new[]{0x02C4, 0x02C4}, new[]{0x02C7, 0x02C7}, new[]{0x02C9, 0x02CB}, new[]{0x02CD, 0x02CD}, new[]{0x02D0, 0x02D0}, new[]{0x02D8, 0x02DB}, new[]{0x02DD, 0x02DD}, new[]{0x02DF, 0x02DF}, new[]{0x0300, 0x036F}, new[]{0x0391, 0x03A1}, new[]{0x03A3, 0x03A9}, new[]{0x03B1, 0x03C1}, new[]{0x03C3, 0x03C9}, new[]{0x0401, 0x0401}, new[]{0x0410, 0x044F}, new[]{0x0451, 0x0451}, new[]{0x2010, 0x2010}, new[]{0x2013, 0x2016}, new[]{0x2018, 0x2019}, new[]{0x201C, 0x201D}, new[]{0x2020, 0x2022}, new[]{0x2024, 0x2027}, new[]{0x2030, 0x2030}, new[]{0x2032, 0x2033}, new[]{0x2035, 0x2035}, new[]{0x203B, 0x203B}, new[]{0x203E, 0x203E}, new[]{0x2074, 0x2074}, new[]{0x207F, 0x207F}, new[]{0x2081, 0x2084}, new[]{0x20AC, 0x20AC}, new[]{0x2103, 0x2103}, new[]{0x2105, 0x2105}, new[]{0x2109, 0x2109}, new[]{0x2113, 0x2113}, new[]{0x2116, 0x2116}, new[]{0x2121, 0x2122}, new[]{0x2126, 0x2126}, new[]{0x212B, 0x212B}, new[]{0x2153, 0x2154}, new[]{0x215B, 0x215E}, new[]{0x2160, 0x216B}, new[]{0x2170, 0x2179}, new[]{0x2189, 0x2189}, new[]{0x2190, 0x2199}, new[]{0x21B8, 0x21B9}, new[]{0x21D2, 0x21D2}, new[]{0x21D4, 0x21D4}, new[]{0x21E7, 0x21E7}, new[]{0x2200, 0x2200}, new[]{0x2202, 0x2203}, new[]{0x2207, 0x2208}, new[]{0x220B, 0x220B}, new[]{0x220F, 0x220F}, new[]{0x2211, 0x2211}, new[]{0x2215, 0x2215}, new[]{0x221A, 0x221A}, new[]{0x221D, 0x2220}, new[]{0x2223, 0x2223}, new[]{0x2225, 0x2225}, new[]{0x2227, 0x222C}, new[]{0x222E, 0x222E}, new[]{0x2234, 0x2237}, new[]{0x223C, 0x223D}, new[]{0x2248, 0x2248}, new[]{0x224C, 0x224C}, new[]{0x2252, 0x2252}, new[]{0x2260, 0x2261}, new[]{0x2264, 0x2267}, new[]{0x226A, 0x226B}, new[]{0x226E, 0x226F}, new[]{0x2282, 0x2283}, new[]{0x2286, 0x2287}, new[]{0x2295, 0x2295}, new[]{0x2299, 0x2299}, new[]{0x22A5, 0x22A5}, new[]{0x22BF, 0x22BF}, new[]{0x2312, 0x2312}, new[]{0x231A, 0x231B}, new[]{0x2329, 0x232A}, new[]{0x23E9, 0x23EC}, new[]{0x23F0, 0x23F0}, new[]{0x23F3, 0x23F3}, new[]{0x2460, 0x24E9}, new[]{0x24EB, 0x254B}, new[]{0x2550, 0x2573}, new[]{0x2580, 0x258F}, new[]{0x2592, 0x2595}, new[]{0x25A0, 0x25A1}, new[]{0x25A3, 0x25A9}, new[]{0x25B2, 0x25B3}, new[]{0x25B6, 0x25B7}, new[]{0x25BC, 0x25BD}, new[]{0x25C0, 0x25C1}, new[]{0x25C6, 0x25C8}, new[]{0x25CB, 0x25CB}, new[]{0x25CE, 0x25D1}, new[]{0x25E2, 0x25E5}, new[]{0x25EF, 0x25EF}, new[]{0x25FD, 0x25FE}, new[]{0x2605, 0x2606}, new[]{0x2609, 0x2609}, new[]{0x260E, 0x260F}, new[]{0x2614, 0x2615}, new[]{0x261C, 0x261C}, new[]{0x261E, 0x261E}, new[]{0x2640, 0x2640}, new[]{0x2642, 0x2642}, new[]{0x2648, 0x2653}, new[]{0x2660, 0x2661}, new[]{0x2663, 0x2665}, new[]{0x2667, 0x266A}, new[]{0x266C, 0x266D}, new[]{0x266F, 0x266F}, new[]{0x267F, 0x267F}, new[]{0x2693, 0x2693}, new[]{0x269E, 0x269F}, new[]{0x26A1, 0x26A1}, new[]{0x26AA, 0x26AB}, new[]{0x26BD, 0x26BF}, new[]{0x26C4, 0x26E1}, new[]{0x26E3, 0x26E3}, new[]{0x26E8, 0x26FF}, new[]{0x2705, 0x2705}, new[]{0x270A, 0x270B}, new[]{0x2728, 0x2728}, new[]{0x273D, 0x273D}, new[]{0x274C, 0x274C}, new[]{0x274E, 0x274E}, new[]{0x2753, 0x2755}, new[]{0x2757, 0x2757}, new[]{0x2776, 0x277F}, new[]{0x2795, 0x2797}, new[]{0x27B0, 0x27B0}, new[]{0x27BF, 0x27BF}, new[]{0x2B1B, 0x2B1C}, new[]{0x2B50, 0x2B50}, new[]{0x2B55, 0x2B59}, new[]{0x2FF0, 0x2FFB}, new[]{0x3220, 0x32FE}, new[]{0xA490, 0xA4C6}, new[]{0xFE00, 0xFE19}, new[]{0xFE54, 0xFE66}, new[]{0xFE68, 0xFE6B}, new[]{0xFFFD, 0xFFFD}, new[]{0x16FE0, 0x16FE1}, new[]{0x17000, 0x187F1}, new[]{0x18800, 0x18AF2}, new[]{0x1B000, 0x1B11E}, new[]{0x1B170, 0x1B2FB}, new[]{0x1F004, 0x1F004}, new[]{0x1F0CF, 0x1F0CF}, new[]{0x1F100, 0x1F10A}, new[]{0x1F110, 0x1F12D}, new[]{0x1F130, 0x1F169}, new[]{0x1F170, 0x1F1AC}, new[]{0x1F200, 0x1F202}, new[]{0x1F210, 0x1F23B}, new[]{0x1F240, 0x1F248}, new[]{0x1F250, 0x1F251}, new[]{0x1F260, 0x1F265}, new[]{0x1F300, 0x1F320}, new[]{0x1F32D, 0x1F335}, new[]{0x1F337, 0x1F37C}, new[]{0x1F37E, 0x1F393}, new[]{0x1F3A0, 0x1F3CA}, new[]{0x1F3CF, 0x1F3D3}, new[]{0x1F3E0, 0x1F3F0}, new[]{0x1F3F4, 0x1F3F4}, new[]{0x1F3F8, 0x1F43E}, new[]{0x1F440, 0x1F440}, new[]{0x1F442, 0x1F4FC}, new[]{0x1F4FF, 0x1F53D}, new[]{0x1F54B, 0x1F54E}, new[]{0x1F550, 0x1F567}, new[]{0x1F57A, 0x1F57A}, new[]{0x1F595, 0x1F596}, new[]{0x1F5A4, 0x1F5A4}, new[]{0x1F5FB, 0x1F64F}, new[]{0x1F680, 0x1F6C5}, new[]{0x1F6CC, 0x1F6CC}, new[]{0x1F6D0, 0x1F6D2}, new[]{0x1F6EB, 0x1F6EC}, new[]{0x1F6F4, 0x1F6F9}, new[]{0x1F910, 0x1F93E}, new[]{0x1F940, 0x1F970}, new[]{0x1F973, 0x1F976}, new[]{0x1F97A, 0x1F97A}, new[]{0x1F97C, 0x1F9A2}, new[]{0x1F9B0, 0x1F9B9}, new[]{0x1F9C0, 0x1F9C2}, new[]{0x1F9D0, 0x1F9FF}, new[]{0x20000, 0x2FFFD}, new[]{0x30000, 0x3FFFD}, new[]{0xE0100, 0xE01EF}, new[]{0xF0000, 0xFFFFD}, new[]{0x100000, 0x10FFFD}},
    }

This is the code to download and rearrange code points by characters' width:

        private void ButtonDownloadEastAsainWidth_Click(object sender, RoutedEventArgs e)
        {
            using (sender.Lock())
            {
                const string url = "http://www.unicode.org/Public/UCD/latest/ucd/EastAsianWidth.txt";
                textBoxLog.Text = new WebClient().DownloadString(url);
            }
        }
        private void ButtonRearrangeEastAsainWidth_Click(object sender, RoutedEventArgs e)
        {
            //Compact adjacent pieces which have same widths
            List<int[]> CompactByWidthProp(IEnumerable<int[]> el)
            {
                var l = el.ToList();
                for (var i = l.Count - 1; i > 0; --i)
                {
                    if (l[i - 1][0] == l[i][0] && l[i - 1][2] + 1 == l[i][1])
                    {
                        l[i - 1][2] = l[i][2];
                        l.RemoveAt(i);
                    }
                }
                return l;
            }
            //Compact pieces
            List<int[]> Compact(IEnumerable<int[]> el)
            {
                var l = el.ToList();
                for (var i = l.Count - 1; i > 0; --i)
                {
                    if (l[i - 1][2] + 1 == l[i][1])
                    {
                        l[i - 1][2] = l[i][2];
                        l.RemoveAt(i);
                    }
                }
                return l;
            }
            //Generate code
            string MakeCode(string k, IEnumerable<int[]> wl) => $"//*{k}*/new[]{{" + wl.Select(w => $"new[]{{0x{w[1]:X4}, 0x{w[2]:X4}" + "}").JoinStrings(", ") + "},";

            //Split width list
            var lines = textBoxLog.Text.Split(new[] {'\n', '\r'}, StringSplitOptions.RemoveEmptyEntries);
            if (0 == lines.Length) return;
            //Filename and version
            var ver = lines.FirstOrDefault(l => l.StartsWith("# EastAsianWidth-") && l.EndsWith(".txt"));
            if (null != ver) ver = "//" + ver;
            //Date time info
            var date = lines.FirstOrDefault(l => l.StartsWith("# Date: "));
            if (null != date) date = "//" + date;

            //Predefined characters' widths categories and width value
            var widthDefinitionOrder = new[] {"N", "Na", "H", "F", "W", "A"};
            var widths = new[] {0, 1, 1, 2, 2, 2};
            //Analyse
            var lns = CompactByWidthProp(lines
                .Where(l => '#' != l[0]) //skip comments
                .Select(l =>
                {
                    var p = l.IndexOf('#');
                    var info = (-1 != p ? l.Substring(0, p) : l).Split(';');
                    if (2 != info.Length) return null;

                    var range = info[0].Split(new[] { '.' }, StringSplitOptions.RemoveEmptyEntries);
                    var widthProp = info[1].Trim();
                    var widthIdx = Array.IndexOf(widthDefinitionOrder, widthProp);
                    if (-1 == widthIdx)
                    {
#if DEBUG
                        System.Diagnostics.Debugger.Break();
#endif
                        throw new ArgumentOutOfRangeException(widthProp, "Unkown character width category");
                    }

                    int r0, r1;
                    try
                    {
                        r0 = int.Parse(range[0], NumberStyles.HexNumber);
                        r1 = 2 == range.Length ? int.Parse(range[1], NumberStyles.HexNumber) : r0;
                    }
                    catch
                    {
                        return null;
                    }
                    return new[] {widthIdx, r0, r1};
                })
                .Where(l => null != l)
                .OrderBy(l => l[1]));
            //Computing skipped pieces
            var unassigned = new List<int[]>();
            var wN = Array.IndexOf(widthDefinitionOrder, "N"); //【N】
            int[] lr = null;
            var currentRangeIdx = 0;
            var currentRange = lns[0];
            for (var i = 0; i < 0x110000; ++i)
            {
                begin:
                if (null != currentRange && currentRange[1] <= i)
                {
                    if (i <= currentRange[2])
                    {
                        if (null != lr)
                        {
                            unassigned.Add(lr);
                            lr = null;
                        }
                    }
                    else
                    {
                        ++currentRangeIdx;
                        currentRange = currentRangeIdx < lns.Count ? lns[currentRangeIdx] : null;
                        goto begin;
                    }
                }
                else if (null == lr) lr = new[] {wN, i, i};
                else lr[2] = i;
            }
            if (null != lr) unassigned.Add(lr);
            //Combine
            lns = CompactByWidthProp(lns.Concat(unassigned).OrderBy(l => l[1]));

#if DEBUG
            //Checking
            for (var i = 1; i < lns.Count; ++i)
                if (lns[i - 1][2] + 1 != lns[i][1])
                    System.Diagnostics.Debugger.Break();
#endif
            //Generating codes
            var txt1 = lns
                .GroupBy(l => l[0])
                .OrderBy(g => g.Key)
                .Select(g =>
                {
                    var w = widthDefinitionOrder[g.Key];
                    return MakeCode(1 == w.Length ? w + ' ' : w, Compact(g));
                })
                .ConcatInsert(ver, date, "")
                .ConcatAppend("")
                ;
            //Optimize code by usage frequency
            var opt = new[]
            {
                /*0*/new[]
                {
                    new[]{0xFEFF, 0xFEFF}, //UTF8 BOM
                    new[]{0x0000, 0x001F}, //控制字符
                },
                /*1*/new[]
                {
                    new[]{0x0020, 0x007F}, //基本拉丁字母
                },
                /*2*/new[]
                {
                    new[]{0x3130, 0x318F}, //谚文兼容字母
                    new[]{0xA960, 0xA97F}, //谚文字母扩展A
                    new[]{0x1100, 0x11FF}, //谚文字母
                    new[]{0xAC00, 0xD7AF}, //谚文音节
                    new[]{0x31A0, 0x31BF}, //注音字母扩展
                    new[]{0x3100, 0x312F}, //注音字母
                    new[]{0xFE30, 0xFE4F}, //中日韩兼容形式
                    new[]{0xF900, 0xFAFF}, //中日韩兼容表意文字
                    new[]{0x3300, 0x33FF}, //中日韩字符集兼容
                    new[]{0x3400, 0x4DBF}, //中日韩统一表意文字扩展A
                    new[]{0x31F0, 0x31FF}, //日文片假名语音扩展
                    new[]{0x2E80, 0x2EFF}, //中日韩部首补充
                    new[]{0x2F00, 0x2FDF}, //康熙部首
                    new[]{0x31C0, 0x31EF}, //中日韩笔画
                    new[]{0x3000, 0x30FF}, //中日韩符号和标点 + 日文平假名 + 日文片假名
                    new[]{0xFF00, 0xFFEF}, //半角及全角形式
                    new[]{0x4E00, 0x9FFF}, //中日韩统一表意文字
                }
            };
            //Generating
            var txt2 = lns
                .GroupBy(l => widths[l[0]])
                .OrderBy(g => g.Key)
                .Select(g => MakeCode(g.Key.ToString(), Compact(g).OrderBy(w =>
                {
                    var r0 = w[1];
                    var r1 = Array.FindIndex(opt[g.Key], range => range[1] >= r0 && w[2] >= range[0]);
                    return -1 == r1 ? r0 : -(r1 + 1);
                })))
                .ConcatAppend("")
                ;

            var txt = txt1.Concat(txt2).JoinStrings();

            textBoxLog.Text = Keyboard.IsKeyDown(Key.LeftCtrl) ? txt + textBoxLog.Text : txt;
        }

qaqz111 avatar Jan 12 '19 12:01 qaqz111

Interesting, thank for the information, I was missing what the problem was but now I get it. Is the following the basic code for determining display length?

public static int GetDisplayLength(this string str, int? pos = null)
{
    return str.Take(pos ?? str.Length).Sum(x => x > (char)0xff ? 2 : 1);
}

cpmcgrath avatar Jan 13 '19 02:01 cpmcgrath

The key is this array:

public static readonly IReadOnlyList<IReadOnlyList<IReadOnlyList<int>>> CharWidths = new[]
{
    /*0*/new[]{new[]{0x0000, 0x001F}, new[]{0xFE6C, 0xFF00}, new[]{0x007F, 0x00A0}, new[]{0x00A9, 0x00A9}, new[]{0x00AB, 0x00AB}, new[]{0x00B5, 0x00B5}, new[]{0x00BB, 0x00BB}, new[]{0x00C0, 0x00C5}, new[]{0x00C7, 0x00CF}, new[]{0x00D1, 0x00D6}, new[]{0x00D9, 0x00DD}, new[]{0x00E2, 0x00E5}, new[]{0x00E7, 0x00E7}, new[]{0x00EB, 0x00EB}, new[]{0x00EE, 0x00EF}, new[]{0x00F1, 0x00F1}, new[]{0x00F4, 0x00F6}, new[]{0x00FB, 0x00FB}, new[]{0x00FD, 0x00FD}, new[]{0x00FF, 0x0100}, new[]{0x0102, 0x0110}, new[]{0x0112, 0x0112}, new[]{0x0114, 0x011A}, new[]{0x011C, 0x0125}, new[]{0x0128, 0x012A}, new[]{0x012C, 0x0130}, new[]{0x0134, 0x0137}, new[]{0x0139, 0x013E}, new[]{0x0143, 0x0143}, new[]{0x0145, 0x0147}, new[]{0x014C, 0x014C}, new[]{0x014E, 0x0151}, new[]{0x0154, 0x0165}, new[]{0x0168, 0x016A}, new[]{0x016C, 0x01CD}, new[]{0x01CF, 0x01CF}, new[]{0x01D1, 0x01D1}, new[]{0x01D3, 0x01D3}, new[]{0x01D5, 0x01D5}, new[]{0x01D7, 0x01D7}, new[]{0x01D9, 0x01D9}, new[]{0x01DB, 0x01DB}, new[]{0x01DD, 0x0250}, new[]{0x0252, 0x0260}, new[]{0x0262, 0x02C3}, new[]{0x02C5, 0x02C6}, new[]{0x02C8, 0x02C8}, new[]{0x02CC, 0x02CC}, new[]{0x02CE, 0x02CF}, new[]{0x02D1, 0x02D7}, new[]{0x02DC, 0x02DC}, new[]{0x02DE, 0x02DE}, new[]{0x02E0, 0x02FF}, new[]{0x0370, 0x0390}, new[]{0x03A2, 0x03A2}, new[]{0x03AA, 0x03B0}, new[]{0x03C2, 0x03C2}, new[]{0x03CA, 0x0400}, new[]{0x0402, 0x040F}, new[]{0x0450, 0x0450}, new[]{0x0452, 0x10FF}, new[]{0x1160, 0x200F}, new[]{0x2011, 0x2012}, new[]{0x2017, 0x2017}, new[]{0x201A, 0x201B}, new[]{0x201E, 0x201F}, new[]{0x2023, 0x2023}, new[]{0x2028, 0x202F}, new[]{0x2031, 0x2031}, new[]{0x2034, 0x2034}, new[]{0x2036, 0x203A}, new[]{0x203C, 0x203D}, new[]{0x203F, 0x2073}, new[]{0x2075, 0x207E}, new[]{0x2080, 0x2080}, new[]{0x2085, 0x20A8}, new[]{0x20AA, 0x20AB}, new[]{0x20AD, 0x2102}, new[]{0x2104, 0x2104}, new[]{0x2106, 0x2108}, new[]{0x210A, 0x2112}, new[]{0x2114, 0x2115}, new[]{0x2117, 0x2120}, new[]{0x2123, 0x2125}, new[]{0x2127, 0x212A}, new[]{0x212C, 0x2152}, new[]{0x2155, 0x215A}, new[]{0x215F, 0x215F}, new[]{0x216C, 0x216F}, new[]{0x217A, 0x2188}, new[]{0x218A, 0x218F}, new[]{0x219A, 0x21B7}, new[]{0x21BA, 0x21D1}, new[]{0x21D3, 0x21D3}, new[]{0x21D5, 0x21E6}, new[]{0x21E8, 0x21FF}, new[]{0x2201, 0x2201}, new[]{0x2204, 0x2206}, new[]{0x2209, 0x220A}, new[]{0x220C, 0x220E}, new[]{0x2210, 0x2210}, new[]{0x2212, 0x2214}, new[]{0x2216, 0x2219}, new[]{0x221B, 0x221C}, new[]{0x2221, 0x2222}, new[]{0x2224, 0x2224}, new[]{0x2226, 0x2226}, new[]{0x222D, 0x222D}, new[]{0x222F, 0x2233}, new[]{0x2238, 0x223B}, new[]{0x223E, 0x2247}, new[]{0x2249, 0x224B}, new[]{0x224D, 0x2251}, new[]{0x2253, 0x225F}, new[]{0x2262, 0x2263}, new[]{0x2268, 0x2269}, new[]{0x226C, 0x226D}, new[]{0x2270, 0x2281}, new[]{0x2284, 0x2285}, new[]{0x2288, 0x2294}, new[]{0x2296, 0x2298}, new[]{0x229A, 0x22A4}, new[]{0x22A6, 0x22BE}, new[]{0x22C0, 0x2311}, new[]{0x2313, 0x2319}, new[]{0x231C, 0x2328}, new[]{0x232B, 0x23E8}, new[]{0x23ED, 0x23EF}, new[]{0x23F1, 0x23F2}, new[]{0x23F4, 0x245F}, new[]{0x24EA, 0x24EA}, new[]{0x254C, 0x254F}, new[]{0x2574, 0x257F}, new[]{0x2590, 0x2591}, new[]{0x2596, 0x259F}, new[]{0x25A2, 0x25A2}, new[]{0x25AA, 0x25B1}, new[]{0x25B4, 0x25B5}, new[]{0x25B8, 0x25BB}, new[]{0x25BE, 0x25BF}, new[]{0x25C2, 0x25C5}, new[]{0x25C9, 0x25CA}, new[]{0x25CC, 0x25CD}, new[]{0x25D2, 0x25E1}, new[]{0x25E6, 0x25EE}, new[]{0x25F0, 0x25FC}, new[]{0x25FF, 0x2604}, new[]{0x2607, 0x2608}, new[]{0x260A, 0x260D}, new[]{0x2610, 0x2613}, new[]{0x2616, 0x261B}, new[]{0x261D, 0x261D}, new[]{0x261F, 0x263F}, new[]{0x2641, 0x2641}, new[]{0x2643, 0x2647}, new[]{0x2654, 0x265F}, new[]{0x2662, 0x2662}, new[]{0x2666, 0x2666}, new[]{0x266B, 0x266B}, new[]{0x266E, 0x266E}, new[]{0x2670, 0x267E}, new[]{0x2680, 0x2692}, new[]{0x2694, 0x269D}, new[]{0x26A0, 0x26A0}, new[]{0x26A2, 0x26A9}, new[]{0x26AC, 0x26BC}, new[]{0x26C0, 0x26C3}, new[]{0x26E2, 0x26E2}, new[]{0x26E4, 0x26E7}, new[]{0x2700, 0x2704}, new[]{0x2706, 0x2709}, new[]{0x270C, 0x2727}, new[]{0x2729, 0x273C}, new[]{0x273E, 0x274B}, new[]{0x274D, 0x274D}, new[]{0x274F, 0x2752}, new[]{0x2756, 0x2756}, new[]{0x2758, 0x2775}, new[]{0x2780, 0x2794}, new[]{0x2798, 0x27AF}, new[]{0x27B1, 0x27BE}, new[]{0x27C0, 0x27E5}, new[]{0x27EE, 0x2984}, new[]{0x2987, 0x2B1A}, new[]{0x2B1D, 0x2B4F}, new[]{0x2B51, 0x2B54}, new[]{0x2B5A, 0x2E7F}, new[]{0x2E9A, 0x2E9A}, new[]{0x2EF4, 0x2EFF}, new[]{0x2FD6, 0x2FEF}, new[]{0x2FFC, 0x2FFF}, new[]{0x303F, 0x3040}, new[]{0x3097, 0x3098}, new[]{0x3100, 0x3104}, new[]{0x3130, 0x3130}, new[]{0x318F, 0x318F}, new[]{0x31BB, 0x31BF}, new[]{0x31E4, 0x31EF}, new[]{0x321F, 0x321F}, new[]{0x32FF, 0x32FF}, new[]{0x4DC0, 0x4DFF}, new[]{0xA48D, 0xA48F}, new[]{0xA4C7, 0xA95F}, new[]{0xA97D, 0xABFF}, new[]{0xD7A4, 0xDFFF}, new[]{0xFB00, 0xFDFF}, new[]{0xFE1A, 0xFE2F}, new[]{0xFE53, 0xFE53}, new[]{0xFE67, 0xFE67}, new[]{0xFFBF, 0xFFC1}, new[]{0xFFC8, 0xFFC9}, new[]{0xFFD0, 0xFFD1}, new[]{0xFFD8, 0xFFD9}, new[]{0xFFDD, 0xFFDF}, new[]{0xFFE7, 0xFFE7}, new[]{0xFFEF, 0xFFFC}, new[]{0xFFFE, 0x16FDF}, new[]{0x16FE2, 0x16FFF}, new[]{0x187F2, 0x187FF}, new[]{0x18AF3, 0x1AFFF}, new[]{0x1B11F, 0x1B16F}, new[]{0x1B2FC, 0x1F003}, new[]{0x1F005, 0x1F0CE}, new[]{0x1F0D0, 0x1F0FF}, new[]{0x1F10B, 0x1F10F}, new[]{0x1F12E, 0x1F12F}, new[]{0x1F16A, 0x1F16F}, new[]{0x1F1AD, 0x1F1FF}, new[]{0x1F203, 0x1F20F}, new[]{0x1F23C, 0x1F23F}, new[]{0x1F249, 0x1F24F}, new[]{0x1F252, 0x1F25F}, new[]{0x1F266, 0x1F2FF}, new[]{0x1F321, 0x1F32C}, new[]{0x1F336, 0x1F336}, new[]{0x1F37D, 0x1F37D}, new[]{0x1F394, 0x1F39F}, new[]{0x1F3CB, 0x1F3CE}, new[]{0x1F3D4, 0x1F3DF}, new[]{0x1F3F1, 0x1F3F3}, new[]{0x1F3F5, 0x1F3F7}, new[]{0x1F43F, 0x1F43F}, new[]{0x1F441, 0x1F441}, new[]{0x1F4FD, 0x1F4FE}, new[]{0x1F53E, 0x1F54A}, new[]{0x1F54F, 0x1F54F}, new[]{0x1F568, 0x1F579}, new[]{0x1F57B, 0x1F594}, new[]{0x1F597, 0x1F5A3}, new[]{0x1F5A5, 0x1F5FA}, new[]{0x1F650, 0x1F67F}, new[]{0x1F6C6, 0x1F6CB}, new[]{0x1F6CD, 0x1F6CF}, new[]{0x1F6D3, 0x1F6EA}, new[]{0x1F6ED, 0x1F6F3}, new[]{0x1F6FA, 0x1F90F}, new[]{0x1F93F, 0x1F93F}, new[]{0x1F971, 0x1F972}, new[]{0x1F977, 0x1F979}, new[]{0x1F97B, 0x1F97B}, new[]{0x1F9A3, 0x1F9AF}, new[]{0x1F9BA, 0x1F9BF}, new[]{0x1F9C3, 0x1F9CF}, new[]{0x1FA00, 0x1FFFF}, new[]{0x2FFFE, 0x2FFFF}, new[]{0x3FFFE, 0xE00FF}, new[]{0xE01F0, 0xEFFFF}, new[]{0xFFFFE, 0xFFFFF}, new[]{0x10FFFE, 0x10FFFF}},
    /*1*/new[]{new[]{0x0020, 0x007E}, new[]{0x00A2, 0x00A3}, new[]{0x00A5, 0x00A6}, new[]{0x00AC, 0x00AC}, new[]{0x00AF, 0x00AF}, new[]{0x20A9, 0x20A9}, new[]{0x27E6, 0x27ED}, new[]{0x2985, 0x2986}, new[]{0xFF61, 0xFFBE}, new[]{0xFFC2, 0xFFC7}, new[]{0xFFCA, 0xFFCF}, new[]{0xFFD2, 0xFFD7}, new[]{0xFFDA, 0xFFDC}, new[]{0xFFE8, 0xFFEE}},
    /*2*/new[]{new[]{0x4E00, 0xA48C}, new[]{0xFF01, 0xFF60}, new[]{0xFFE0, 0xFFE6}, new[]{0x3000, 0x303E}, new[]{0x3041, 0x3096}, new[]{0x3099, 0x30FF}, new[]{0x31C0, 0x31E3}, new[]{0x2F00, 0x2FD5}, new[]{0x2E80, 0x2E99}, new[]{0x2E9B, 0x2EF3}, new[]{0x31F0, 0x321E}, new[]{0x3300, 0x4DBF}, new[]{0xE000, 0xFAFF}, new[]{0xFE30, 0xFE52}, new[]{0x3105, 0x312F}, new[]{0x3190, 0x31BA}, new[]{0xAC00, 0xD7A3}, new[]{0x1100, 0x115F}, new[]{0xA960, 0xA97C}, new[]{0x3131, 0x318E}, new[]{0x00A1, 0x00A1}, new[]{0x00A4, 0x00A4}, new[]{0x00A7, 0x00A8}, new[]{0x00AA, 0x00AA}, new[]{0x00AD, 0x00AE}, new[]{0x00B0, 0x00B4}, new[]{0x00B6, 0x00BA}, new[]{0x00BC, 0x00BF}, new[]{0x00C6, 0x00C6}, new[]{0x00D0, 0x00D0}, new[]{0x00D7, 0x00D8}, new[]{0x00DE, 0x00E1}, new[]{0x00E6, 0x00E6}, new[]{0x00E8, 0x00EA}, new[]{0x00EC, 0x00ED}, new[]{0x00F0, 0x00F0}, new[]{0x00F2, 0x00F3}, new[]{0x00F7, 0x00FA}, new[]{0x00FC, 0x00FC}, new[]{0x00FE, 0x00FE}, new[]{0x0101, 0x0101}, new[]{0x0111, 0x0111}, new[]{0x0113, 0x0113}, new[]{0x011B, 0x011B}, new[]{0x0126, 0x0127}, new[]{0x012B, 0x012B}, new[]{0x0131, 0x0133}, new[]{0x0138, 0x0138}, new[]{0x013F, 0x0142}, new[]{0x0144, 0x0144}, new[]{0x0148, 0x014B}, new[]{0x014D, 0x014D}, new[]{0x0152, 0x0153}, new[]{0x0166, 0x0167}, new[]{0x016B, 0x016B}, new[]{0x01CE, 0x01CE}, new[]{0x01D0, 0x01D0}, new[]{0x01D2, 0x01D2}, new[]{0x01D4, 0x01D4}, new[]{0x01D6, 0x01D6}, new[]{0x01D8, 0x01D8}, new[]{0x01DA, 0x01DA}, new[]{0x01DC, 0x01DC}, new[]{0x0251, 0x0251}, new[]{0x0261, 0x0261}, new[]{0x02C4, 0x02C4}, new[]{0x02C7, 0x02C7}, new[]{0x02C9, 0x02CB}, new[]{0x02CD, 0x02CD}, new[]{0x02D0, 0x02D0}, new[]{0x02D8, 0x02DB}, new[]{0x02DD, 0x02DD}, new[]{0x02DF, 0x02DF}, new[]{0x0300, 0x036F}, new[]{0x0391, 0x03A1}, new[]{0x03A3, 0x03A9}, new[]{0x03B1, 0x03C1}, new[]{0x03C3, 0x03C9}, new[]{0x0401, 0x0401}, new[]{0x0410, 0x044F}, new[]{0x0451, 0x0451}, new[]{0x2010, 0x2010}, new[]{0x2013, 0x2016}, new[]{0x2018, 0x2019}, new[]{0x201C, 0x201D}, new[]{0x2020, 0x2022}, new[]{0x2024, 0x2027}, new[]{0x2030, 0x2030}, new[]{0x2032, 0x2033}, new[]{0x2035, 0x2035}, new[]{0x203B, 0x203B}, new[]{0x203E, 0x203E}, new[]{0x2074, 0x2074}, new[]{0x207F, 0x207F}, new[]{0x2081, 0x2084}, new[]{0x20AC, 0x20AC}, new[]{0x2103, 0x2103}, new[]{0x2105, 0x2105}, new[]{0x2109, 0x2109}, new[]{0x2113, 0x2113}, new[]{0x2116, 0x2116}, new[]{0x2121, 0x2122}, new[]{0x2126, 0x2126}, new[]{0x212B, 0x212B}, new[]{0x2153, 0x2154}, new[]{0x215B, 0x215E}, new[]{0x2160, 0x216B}, new[]{0x2170, 0x2179}, new[]{0x2189, 0x2189}, new[]{0x2190, 0x2199}, new[]{0x21B8, 0x21B9}, new[]{0x21D2, 0x21D2}, new[]{0x21D4, 0x21D4}, new[]{0x21E7, 0x21E7}, new[]{0x2200, 0x2200}, new[]{0x2202, 0x2203}, new[]{0x2207, 0x2208}, new[]{0x220B, 0x220B}, new[]{0x220F, 0x220F}, new[]{0x2211, 0x2211}, new[]{0x2215, 0x2215}, new[]{0x221A, 0x221A}, new[]{0x221D, 0x2220}, new[]{0x2223, 0x2223}, new[]{0x2225, 0x2225}, new[]{0x2227, 0x222C}, new[]{0x222E, 0x222E}, new[]{0x2234, 0x2237}, new[]{0x223C, 0x223D}, new[]{0x2248, 0x2248}, new[]{0x224C, 0x224C}, new[]{0x2252, 0x2252}, new[]{0x2260, 0x2261}, new[]{0x2264, 0x2267}, new[]{0x226A, 0x226B}, new[]{0x226E, 0x226F}, new[]{0x2282, 0x2283}, new[]{0x2286, 0x2287}, new[]{0x2295, 0x2295}, new[]{0x2299, 0x2299}, new[]{0x22A5, 0x22A5}, new[]{0x22BF, 0x22BF}, new[]{0x2312, 0x2312}, new[]{0x231A, 0x231B}, new[]{0x2329, 0x232A}, new[]{0x23E9, 0x23EC}, new[]{0x23F0, 0x23F0}, new[]{0x23F3, 0x23F3}, new[]{0x2460, 0x24E9}, new[]{0x24EB, 0x254B}, new[]{0x2550, 0x2573}, new[]{0x2580, 0x258F}, new[]{0x2592, 0x2595}, new[]{0x25A0, 0x25A1}, new[]{0x25A3, 0x25A9}, new[]{0x25B2, 0x25B3}, new[]{0x25B6, 0x25B7}, new[]{0x25BC, 0x25BD}, new[]{0x25C0, 0x25C1}, new[]{0x25C6, 0x25C8}, new[]{0x25CB, 0x25CB}, new[]{0x25CE, 0x25D1}, new[]{0x25E2, 0x25E5}, new[]{0x25EF, 0x25EF}, new[]{0x25FD, 0x25FE}, new[]{0x2605, 0x2606}, new[]{0x2609, 0x2609}, new[]{0x260E, 0x260F}, new[]{0x2614, 0x2615}, new[]{0x261C, 0x261C}, new[]{0x261E, 0x261E}, new[]{0x2640, 0x2640}, new[]{0x2642, 0x2642}, new[]{0x2648, 0x2653}, new[]{0x2660, 0x2661}, new[]{0x2663, 0x2665}, new[]{0x2667, 0x266A}, new[]{0x266C, 0x266D}, new[]{0x266F, 0x266F}, new[]{0x267F, 0x267F}, new[]{0x2693, 0x2693}, new[]{0x269E, 0x269F}, new[]{0x26A1, 0x26A1}, new[]{0x26AA, 0x26AB}, new[]{0x26BD, 0x26BF}, new[]{0x26C4, 0x26E1}, new[]{0x26E3, 0x26E3}, new[]{0x26E8, 0x26FF}, new[]{0x2705, 0x2705}, new[]{0x270A, 0x270B}, new[]{0x2728, 0x2728}, new[]{0x273D, 0x273D}, new[]{0x274C, 0x274C}, new[]{0x274E, 0x274E}, new[]{0x2753, 0x2755}, new[]{0x2757, 0x2757}, new[]{0x2776, 0x277F}, new[]{0x2795, 0x2797}, new[]{0x27B0, 0x27B0}, new[]{0x27BF, 0x27BF}, new[]{0x2B1B, 0x2B1C}, new[]{0x2B50, 0x2B50}, new[]{0x2B55, 0x2B59}, new[]{0x2FF0, 0x2FFB}, new[]{0x3220, 0x32FE}, new[]{0xA490, 0xA4C6}, new[]{0xFE00, 0xFE19}, new[]{0xFE54, 0xFE66}, new[]{0xFE68, 0xFE6B}, new[]{0xFFFD, 0xFFFD}, new[]{0x16FE0, 0x16FE1}, new[]{0x17000, 0x187F1}, new[]{0x18800, 0x18AF2}, new[]{0x1B000, 0x1B11E}, new[]{0x1B170, 0x1B2FB}, new[]{0x1F004, 0x1F004}, new[]{0x1F0CF, 0x1F0CF}, new[]{0x1F100, 0x1F10A}, new[]{0x1F110, 0x1F12D}, new[]{0x1F130, 0x1F169}, new[]{0x1F170, 0x1F1AC}, new[]{0x1F200, 0x1F202}, new[]{0x1F210, 0x1F23B}, new[]{0x1F240, 0x1F248}, new[]{0x1F250, 0x1F251}, new[]{0x1F260, 0x1F265}, new[]{0x1F300, 0x1F320}, new[]{0x1F32D, 0x1F335}, new[]{0x1F337, 0x1F37C}, new[]{0x1F37E, 0x1F393}, new[]{0x1F3A0, 0x1F3CA}, new[]{0x1F3CF, 0x1F3D3}, new[]{0x1F3E0, 0x1F3F0}, new[]{0x1F3F4, 0x1F3F4}, new[]{0x1F3F8, 0x1F43E}, new[]{0x1F440, 0x1F440}, new[]{0x1F442, 0x1F4FC}, new[]{0x1F4FF, 0x1F53D}, new[]{0x1F54B, 0x1F54E}, new[]{0x1F550, 0x1F567}, new[]{0x1F57A, 0x1F57A}, new[]{0x1F595, 0x1F596}, new[]{0x1F5A4, 0x1F5A4}, new[]{0x1F5FB, 0x1F64F}, new[]{0x1F680, 0x1F6C5}, new[]{0x1F6CC, 0x1F6CC}, new[]{0x1F6D0, 0x1F6D2}, new[]{0x1F6EB, 0x1F6EC}, new[]{0x1F6F4, 0x1F6F9}, new[]{0x1F910, 0x1F93E}, new[]{0x1F940, 0x1F970}, new[]{0x1F973, 0x1F976}, new[]{0x1F97A, 0x1F97A}, new[]{0x1F97C, 0x1F9A2}, new[]{0x1F9B0, 0x1F9B9}, new[]{0x1F9C0, 0x1F9C2}, new[]{0x1F9D0, 0x1F9FF}, new[]{0x20000, 0x2FFFD}, new[]{0x30000, 0x3FFFD}, new[]{0xE0100, 0xE01EF}, new[]{0xF0000, 0xFFFFD}, new[]{0x100000, 0x10FFFD}},
};

So I think the code should be like this:

private static int GetCharWidth(this char c)
{
    for (var w = 0; w <= 2; ++w)
    {
        var widths = CharWidths[w];
        for (var i = 0; i < widths.Count;)
        {
            var cw = widths[i];
            if (cw[0] <= c && c <= cw[1]) return w;
            ++i;
        }
    }
    return 0; //width of unknown char (Theoretically not exsit)
}

public static int GetDisplayLength(this string str, int? pos = null)
{
    return str.Take(pos ?? str.Length).Sum(GetCharWidth);
}

qaqz111 avatar Jan 13 '19 08:01 qaqz111