From 189e63776b9f22e024c2ce0dacfcac5298c21092 Mon Sep 17 00:00:00 2001 From: "He(Heva) Wu" Date: Sun, 10 Oct 2021 22:06:30 +0900 Subject: [PATCH] Upgrade to use Unicode14.0 (#4) * Update document to fetch Unicode 14.0 file * run script to update 14.0 related code * enrich tests * Fix code format + update doc link * update changelog + podspec * update podspec to sepcify swift_version * Update Tests/EastAsianWidthTests/EastAsianFullwidthTests.swift * Update Tests/EastAsianWidthTests/EastAsianHalfwidthTests.swift * update travis settings --- .travis.yml | 2 +- CHANGELOG.md | 7 + README.md | 15 +- Scripts/EastAsianWidth.txt | 149 +++++++++++++----- Sources/EastAsianWidth/String+Extension.swift | 8 +- .../UnicodeScalar+Generated.swift | 116 ++++++++------ .../UnicodeScalar+Recommendations.swift | 2 +- .../UnicodeScalarView+Extension.swift | 8 +- .../EastAsianAmbiguousTests.swift | 10 +- .../EastAsianFullwidthTests.swift | 10 +- .../EastAsianHalfwidthTests.swift | 10 +- .../EastAsianNarrowTests.swift | 8 +- .../EastAsianNeutralTests.swift | 10 +- .../EastAsianWideTests.swift | 4 +- .../EdgeCharacters+Generated.swift | 4 +- .../EastAsianWidthTests/FullwidthTests.swift | 51 ++++-- .../EastAsianWidthTests/HalfwidthTests.swift | 70 +++++--- Tests/EastAsianWidthTests/TestUtils.swift | 120 +++++++------- UnicodeEastAsianWidth.podspec | 8 +- list | 12 ++ 20 files changed, 389 insertions(+), 235 deletions(-) create mode 100644 list diff --git a/.travis.yml b/.travis.yml index a93a9ac..fb8ad98 100644 --- a/.travis.yml +++ b/.travis.yml @@ -2,7 +2,7 @@ # * https://www.objc.io/issues/6-build-tools/travis-ci/ # * https://github.com/supermarin/xcpretty#usage -osx_image: xcode11.4.1 +osx_image: xcode12.5 language: swift # cache: cocoapods podfile: Example/Podfile diff --git a/CHANGELOG.md b/CHANGELOG.md index 66b0d9e..a4556c7 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,3 +1,10 @@ +## [v2.1.0](https://github.com/HevaWu/EastAsianWidth/releases/tag/2.1.0) + +### Changed + +- Update to use [Unicode 14.0](https://www.unicode.org/reports/tr11/tr11-39.html#Recommendations) +- Add more tests + ## [v2.0.0](https://github.com/HevaWu/EastAsianWidth/releases/tag/2.0.0) ### Changed diff --git a/README.md b/README.md index 6c0de49..8236f99 100644 --- a/README.md +++ b/README.md @@ -2,9 +2,10 @@ Parse Unicode EastAsianWidth from unicode.org & Generate related Swift file -Unicode Version: 13.0 -- https://www.unicode.org/versions/Unicode13.0.0/ch18.pdf -- https://www.unicode.org/Public/13.0.0/ucd/EastAsianWidth.txt +Unicode Version: 14.0 +- https://www.unicode.org/versions/Unicode14.0.0/ +- https://www.unicode.org/reports/tr11/tr11-39.html +- https://www.unicode.org/Public/14.0.0/ucd/EastAsianWidth.txt - http://unicode.org/reports/tr11/ [![CI Status](https://img.shields.io/travis/HevaWu/UnicodeEastAsianWidth.svg?style=flat)](https://travis-ci.org/HevaWu/UnicodeEastAsianWidth) @@ -31,10 +32,10 @@ According to Unicode guide, [East Asian Width](http://unicode.org/reports/tr11/) All we want to handle at here is the `fullwidth` & `halfwidth`, where the definition of them are(When mapping Unicode to East Asian legacy character): -> - Wide Unicode characters always map to fullwidth characters. -> - Narrow (and neutral) Unicode characters always map to halfwidth characters. -> - Halfwidth Unicode characters always map to halfwidth characters. -> - Ambiguous Unicode characters always map to fullwidth characters. +> - Wide Unicode characters `always` map to `fullwidth` characters. +> - Narrow (and neutral) Unicode characters `always` map to `halfwidth` characters. +> - Halfwidth Unicode characters `always` map to `halfwidth` characters. +> - Ambiguous Unicode characters `always` map to `fullwidth` characters. ## How to use diff --git a/Scripts/EastAsianWidth.txt b/Scripts/EastAsianWidth.txt index 6598d21..9e8dc47 100644 --- a/Scripts/EastAsianWidth.txt +++ b/Scripts/EastAsianWidth.txt @@ -1,11 +1,11 @@ -# EastAsianWidth-13.0.0.txt -# Date: 2029-01-21, 18:14:00 GMT [KW, LI] -# © 2020 Unicode®, Inc. +# EastAsianWidth-14.0.0.txt +# Date: 2021-07-06, 09:58:53 GMT [KW, LI] +# © 2021 Unicode®, Inc. # Unicode and the Unicode Logo are registered trademarks of Unicode, Inc. in the U.S. and other countries. -# For terms of use, see http://www.unicode.org/terms_of_use.html +# For terms of use, see https://www.unicode.org/terms_of_use.html # # Unicode Character Database -# For documentation, see http://www.unicode.org/reports/tr44/ +# For documentation, see https://www.unicode.org/reports/tr44/ # # East_Asian_Width Property # @@ -37,7 +37,7 @@ # with ranges of code points, the code point count in square brackets. # # For more information, see UAX #11: East Asian Width, -# at http://www.unicode.org/reports/tr11/ +# at https://www.unicode.org/reports/tr11/ # # @missing: 0000..10FFFF; N 0000..001F;N # Cc [32] .. @@ -273,7 +273,7 @@ 0610..061A;N # Mn [11] ARABIC SIGN SALLALLAHOU ALAYHE WASSALLAM..ARABIC SMALL KASRA 061B;N # Po ARABIC SEMICOLON 061C;N # Cf ARABIC LETTER MARK -061E..061F;N # Po [2] ARABIC TRIPLE DOT PUNCTUATION MARK..ARABIC QUESTION MARK +061D..061F;N # Po [3] ARABIC END OF TEXT MARK..ARABIC QUESTION MARK 0620..063F;N # Lo [32] ARABIC LETTER KASHMIRI YEH..ARABIC LETTER FARSI YEH WITH THREE DOTS ABOVE 0640;N # Lm ARABIC TATWEEL 0641..064A;N # Lo [10] ARABIC LETTER FEH..ARABIC LETTER YEH @@ -331,9 +331,14 @@ 0859..085B;N # Mn [3] MANDAIC AFFRICATION MARK..MANDAIC GEMINATION MARK 085E;N # Po MANDAIC PUNCTUATION 0860..086A;N # Lo [11] SYRIAC LETTER MALAYALAM NGA..SYRIAC LETTER MALAYALAM SSA -08A0..08B4;N # Lo [21] ARABIC LETTER BEH WITH SMALL V BELOW..ARABIC LETTER KAF WITH DOT BELOW -08B6..08C7;N # Lo [18] ARABIC LETTER BEH WITH SMALL MEEM ABOVE..ARABIC LETTER LAM WITH SMALL ARABIC LETTER TAH ABOVE -08D3..08E1;N # Mn [15] ARABIC SMALL LOW WAW..ARABIC SMALL HIGH SIGN SAFHA +0870..0887;N # Lo [24] ARABIC LETTER ALEF WITH ATTACHED FATHA..ARABIC BASELINE ROUND DOT +0888;N # Sk ARABIC RAISED ROUND DOT +0889..088E;N # Lo [6] ARABIC LETTER NOON WITH INVERTED SMALL V..ARABIC VERTICAL TAIL +0890..0891;N # Cf [2] ARABIC POUND MARK ABOVE..ARABIC PIASTRE MARK ABOVE +0898..089F;N # Mn [8] ARABIC SMALL HIGH WORD AL-JUZ..ARABIC HALF MADDA OVER MADDA +08A0..08C8;N # Lo [41] ARABIC LETTER BEH WITH SMALL V BELOW..ARABIC LETTER GRAF +08C9;N # Lm ARABIC SMALL FARSI YEH +08CA..08E1;N # Mn [24] ARABIC SMALL HIGH FARSI YEH..ARABIC SMALL HIGH SIGN SAFHA 08E2;N # Cf ARABIC DISPUTED END OF AYAH 08E3..08FF;N # Mn [29] ARABIC TURNED DAMMA BELOW..ARABIC MARK SIDEWAYS NOON GHUNNA 0900..0902;N # Mn [3] DEVANAGARI SIGN INVERTED CANDRABINDU..DEVANAGARI SIGN ANUSVARA @@ -490,6 +495,7 @@ 0C0E..0C10;N # Lo [3] TELUGU LETTER E..TELUGU LETTER AI 0C12..0C28;N # Lo [23] TELUGU LETTER O..TELUGU LETTER NA 0C2A..0C39;N # Lo [16] TELUGU LETTER PA..TELUGU LETTER HA +0C3C;N # Mn TELUGU SIGN NUKTA 0C3D;N # Lo TELUGU SIGN AVAGRAHA 0C3E..0C40;N # Mn [3] TELUGU VOWEL SIGN AA..TELUGU VOWEL SIGN II 0C41..0C44;N # Mc [4] TELUGU VOWEL SIGN U..TELUGU VOWEL SIGN VOCALIC RR @@ -497,6 +503,7 @@ 0C4A..0C4D;N # Mn [4] TELUGU VOWEL SIGN O..TELUGU SIGN VIRAMA 0C55..0C56;N # Mn [2] TELUGU LENGTH MARK..TELUGU AI LENGTH MARK 0C58..0C5A;N # Lo [3] TELUGU LETTER TSA..TELUGU LETTER RRRA +0C5D;N # Lo TELUGU LETTER NAKAARA POLLU 0C60..0C61;N # Lo [2] TELUGU LETTER VOCALIC RR..TELUGU LETTER VOCALIC LL 0C62..0C63;N # Mn [2] TELUGU VOWEL SIGN VOCALIC L..TELUGU VOWEL SIGN VOCALIC LL 0C66..0C6F;N # Nd [10] TELUGU DIGIT ZERO..TELUGU DIGIT NINE @@ -522,7 +529,7 @@ 0CCA..0CCB;N # Mc [2] KANNADA VOWEL SIGN O..KANNADA VOWEL SIGN OO 0CCC..0CCD;N # Mn [2] KANNADA VOWEL SIGN AU..KANNADA SIGN VIRAMA 0CD5..0CD6;N # Mc [2] KANNADA LENGTH MARK..KANNADA AI LENGTH MARK -0CDE;N # Lo KANNADA LETTER FA +0CDD..0CDE;N # Lo [2] KANNADA LETTER NAKAARA POLLU..KANNADA LETTER FA 0CE0..0CE1;N # Lo [2] KANNADA LETTER VOCALIC RR..KANNADA LETTER VOCALIC LL 0CE2..0CE3;N # Mn [2] KANNADA VOWEL SIGN VOCALIC L..KANNADA VOWEL SIGN VOCALIC LL 0CE6..0CEF;N # Nd [10] KANNADA DIGIT ZERO..KANNADA DIGIT NINE @@ -709,11 +716,13 @@ 16EB..16ED;N # Po [3] RUNIC SINGLE PUNCTUATION..RUNIC CROSS PUNCTUATION 16EE..16F0;N # Nl [3] RUNIC ARLAUG SYMBOL..RUNIC BELGTHOR SYMBOL 16F1..16F8;N # Lo [8] RUNIC LETTER K..RUNIC LETTER FRANKS CASKET AESC -1700..170C;N # Lo [13] TAGALOG LETTER A..TAGALOG LETTER YA -170E..1711;N # Lo [4] TAGALOG LETTER LA..TAGALOG LETTER HA +1700..1711;N # Lo [18] TAGALOG LETTER A..TAGALOG LETTER HA 1712..1714;N # Mn [3] TAGALOG VOWEL SIGN I..TAGALOG SIGN VIRAMA +1715;N # Mc TAGALOG SIGN PAMUDPOD +171F;N # Lo TAGALOG LETTER ARCHAIC RA 1720..1731;N # Lo [18] HANUNOO LETTER A..HANUNOO LETTER HA -1732..1734;N # Mn [3] HANUNOO VOWEL SIGN I..HANUNOO SIGN PAMUDPOD +1732..1733;N # Mn [2] HANUNOO VOWEL SIGN I..HANUNOO VOWEL SIGN U +1734;N # Mc HANUNOO SIGN PAMUDPOD 1735..1736;N # Po [2] PHILIPPINE SINGLE PUNCTUATION..PHILIPPINE DOUBLE PUNCTUATION 1740..1751;N # Lo [18] BUHID LETTER A..BUHID LETTER HA 1752..1753;N # Mn [2] BUHID VOWEL SIGN I..BUHID VOWEL SIGN U @@ -741,6 +750,7 @@ 1807..180A;N # Po [4] MONGOLIAN SIBE SYLLABLE BOUNDARY MARKER..MONGOLIAN NIRUGU 180B..180D;N # Mn [3] MONGOLIAN FREE VARIATION SELECTOR ONE..MONGOLIAN FREE VARIATION SELECTOR THREE 180E;N # Cf MONGOLIAN VOWEL SEPARATOR +180F;N # Mn MONGOLIAN FREE VARIATION SELECTOR FOUR 1810..1819;N # Nd [10] MONGOLIAN DIGIT ZERO..MONGOLIAN DIGIT NINE 1820..1842;N # Lo [35] MONGOLIAN LETTER A..MONGOLIAN LETTER CHI 1843;N # Lm MONGOLIAN LETTER TODO LONG VOWEL SIGN @@ -796,7 +806,7 @@ 1AA8..1AAD;N # Po [6] TAI THAM SIGN KAAN..TAI THAM SIGN CAANG 1AB0..1ABD;N # Mn [14] COMBINING DOUBLED CIRCUMFLEX ACCENT..COMBINING PARENTHESES BELOW 1ABE;N # Me COMBINING PARENTHESES OVERLAY -1ABF..1AC0;N # Mn [2] COMBINING LATIN SMALL LETTER W BELOW..COMBINING LATIN SMALL LETTER TURNED W BELOW +1ABF..1ACE;N # Mn [16] COMBINING LATIN SMALL LETTER W BELOW..COMBINING LATIN SMALL LETTER INSULAR T 1B00..1B03;N # Mn [4] BALINESE SIGN ULU RICEM..BALINESE SIGN SURANG 1B04;N # Mc BALINESE SIGN BISAH 1B05..1B33;N # Lo [47] BALINESE LETTER AKARA..BALINESE LETTER HA @@ -808,12 +818,13 @@ 1B3D..1B41;N # Mc [5] BALINESE VOWEL SIGN LA LENGA TEDUNG..BALINESE VOWEL SIGN TALING REPA TEDUNG 1B42;N # Mn BALINESE VOWEL SIGN PEPET 1B43..1B44;N # Mc [2] BALINESE VOWEL SIGN PEPET TEDUNG..BALINESE ADEG ADEG -1B45..1B4B;N # Lo [7] BALINESE LETTER KAF SASAK..BALINESE LETTER ASYURA SASAK +1B45..1B4C;N # Lo [8] BALINESE LETTER KAF SASAK..BALINESE LETTER ARCHAIC JNYA 1B50..1B59;N # Nd [10] BALINESE DIGIT ZERO..BALINESE DIGIT NINE 1B5A..1B60;N # Po [7] BALINESE PANTI..BALINESE PAMENENG 1B61..1B6A;N # So [10] BALINESE MUSICAL SYMBOL DONG..BALINESE MUSICAL SYMBOL DANG GEDE 1B6B..1B73;N # Mn [9] BALINESE MUSICAL SYMBOL COMBINING TEGEH..BALINESE MUSICAL SYMBOL COMBINING GONG 1B74..1B7C;N # So [9] BALINESE MUSICAL SYMBOL RIGHT-HAND OPEN DUG..BALINESE MUSICAL SYMBOL LEFT-HAND OPEN PING +1B7D..1B7E;N # Po [2] BALINESE PANTI LANTANG..BALINESE PAMADA LANTANG 1B80..1B81;N # Mn [2] SUNDANESE SIGN PANYECEK..SUNDANESE SIGN PANGLAYAR 1B82;N # Mc SUNDANESE SIGN PANGWISAD 1B83..1BA0;N # Lo [30] SUNDANESE LETTER A..SUNDANESE LETTER HA @@ -872,8 +883,7 @@ 1D79..1D7F;N # Ll [7] LATIN SMALL LETTER INSULAR G..LATIN SMALL LETTER UPSILON WITH STROKE 1D80..1D9A;N # Ll [27] LATIN SMALL LETTER B WITH PALATAL HOOK..LATIN SMALL LETTER EZH WITH RETROFLEX HOOK 1D9B..1DBF;N # Lm [37] MODIFIER LETTER SMALL TURNED ALPHA..MODIFIER LETTER SMALL THETA -1DC0..1DF9;N # Mn [58] COMBINING DOTTED GRAVE ACCENT..COMBINING WIDE INVERTED BRIDGE BELOW -1DFB..1DFF;N # Mn [5] COMBINING DELETION MARK..COMBINING RIGHT ARROWHEAD AND DOWN ARROWHEAD BELOW +1DC0..1DFF;N # Mn [64] COMBINING DOTTED GRAVE ACCENT..COMBINING RIGHT ARROWHEAD AND DOWN ARROWHEAD BELOW 1E00..1EFF;N # L& [256] LATIN CAPITAL LETTER A WITH RING BELOW..LATIN SMALL LETTER Y WITH LOOP 1F00..1F15;N # L& [22] GREEK SMALL LETTER ALPHA WITH PSILI..GREEK SMALL LETTER EPSILON WITH DASIA AND OXIA 1F18..1F1D;N # Lu [6] GREEK CAPITAL LETTER EPSILON WITH PSILI..GREEK CAPITAL LETTER EPSILON WITH DASIA AND OXIA @@ -965,7 +975,7 @@ 20A9;H # Sc WON SIGN 20AA..20AB;N # Sc [2] NEW SHEQEL SIGN..DONG SIGN 20AC;A # Sc EURO SIGN -20AD..20BF;N # Sc [19] KIP SIGN..BITCOIN SIGN +20AD..20C0;N # Sc [20] KIP SIGN..SOM SIGN 20D0..20DC;N # Mn [13] COMBINING LEFT HARPOON ABOVE..COMBINING FOUR DOTS ABOVE 20DD..20E0;N # Me [4] COMBINING ENCLOSING CIRCLE..COMBINING ENCLOSING CIRCLE BACKSLASH 20E1;N # Mn COMBINING LEFT RIGHT ARROW ABOVE @@ -1338,8 +1348,7 @@ 2B5A..2B73;N # So [26] SLANTED NORTH ARROW WITH HOOKED HEAD..DOWNWARDS TRIANGLE-HEADED ARROW TO BAR 2B76..2B95;N # So [32] NORTH WEST TRIANGLE-HEADED ARROW TO BAR..RIGHTWARDS BLACK ARROW 2B97..2BFF;N # So [105] SYMBOL FOR TYPE A ELECTRONICS..HELLSCHREIBER PAUSE SYMBOL -2C00..2C2E;N # Lu [47] GLAGOLITIC CAPITAL LETTER AZU..GLAGOLITIC CAPITAL LETTER LATINATE MYSLITE -2C30..2C5E;N # Ll [47] GLAGOLITIC SMALL LETTER AZU..GLAGOLITIC SMALL LETTER LATINATE MYSLITE +2C00..2C5F;N # L& [96] GLAGOLITIC CAPITAL LETTER AZU..GLAGOLITIC SMALL LETTER CAUDATE CHRIVI 2C60..2C7B;N # L& [28] LATIN CAPITAL LETTER L WITH DOUBLE BAR..LATIN LETTER SMALL CAPITAL TURNED E 2C7C..2C7D;N # Lm [2] LATIN SUBSCRIPT SMALL LETTER J..MODIFIER LETTER CAPITAL V 2C7E..2C7F;N # Lu [2] LATIN CAPITAL LETTER S WITH SWASH TAIL..LATIN CAPITAL LETTER Z WITH SWASH TAIL @@ -1407,7 +1416,16 @@ 2E42;N # Ps DOUBLE LOW-REVERSED-9 QUOTATION MARK 2E43..2E4F;N # Po [13] DASH WITH LEFT UPTURN..CORNISH VERSE DIVIDER 2E50..2E51;N # So [2] CROSS PATTY WITH RIGHT CROSSBAR..CROSS PATTY WITH LEFT CROSSBAR -2E52;N # Po TIRONIAN SIGN CAPITAL ET +2E52..2E54;N # Po [3] TIRONIAN SIGN CAPITAL ET..MEDIEVAL QUESTION MARK +2E55;N # Ps LEFT SQUARE BRACKET WITH STROKE +2E56;N # Pe RIGHT SQUARE BRACKET WITH STROKE +2E57;N # Ps LEFT SQUARE BRACKET WITH DOUBLE STROKE +2E58;N # Pe RIGHT SQUARE BRACKET WITH DOUBLE STROKE +2E59;N # Ps TOP HALF LEFT PARENTHESIS +2E5A;N # Pe TOP HALF RIGHT PARENTHESIS +2E5B;N # Ps BOTTOM HALF LEFT PARENTHESIS +2E5C;N # Pe BOTTOM HALF RIGHT PARENTHESIS +2E5D;N # Pd OBLIQUE HYPHEN 2E80..2E99;W # So [26] CJK RADICAL REPEAT..CJK RADICAL RAP 2E9B..2EF3;W # So [89] CJK RADICAL CHOKE..CJK RADICAL C-SIMPLIFIED TURTLE 2F00..2FD5;W # So [214] KANGXI RADICAL ONE..KANGXI RADICAL FLUTE @@ -1485,8 +1503,7 @@ 3300..33FF;W # So [256] SQUARE APAATO..SQUARE GAL 3400..4DBF;W # Lo [6592] CJK UNIFIED IDEOGRAPH-3400..CJK UNIFIED IDEOGRAPH-4DBF 4DC0..4DFF;N # So [64] HEXAGRAM FOR THE CREATIVE HEAVEN..HEXAGRAM FOR BEFORE COMPLETION -4E00..9FFC;W # Lo [20989] CJK UNIFIED IDEOGRAPH-4E00..CJK UNIFIED IDEOGRAPH-9FFC -9FFD..9FFF;W # Cn [3] .. +4E00..9FFF;W # Lo [20992] CJK UNIFIED IDEOGRAPH-4E00..CJK UNIFIED IDEOGRAPH-9FFF A000..A014;W # Lo [21] YI SYLLABLE IT..YI SYLLABLE E A015;W # Lm YI SYLLABLE WU A016..A48C;W # Lo [1143] YI SYLLABLE BIT..YI SYLLABLE YYR @@ -1525,8 +1542,11 @@ A788;N # Lm MODIFIER LETTER LOW CIRCUMFLEX ACCENT A789..A78A;N # Sk [2] MODIFIER LETTER COLON..MODIFIER LETTER SHORT EQUALS SIGN A78B..A78E;N # L& [4] LATIN CAPITAL LETTER SALTILLO..LATIN SMALL LETTER L WITH RETROFLEX HOOK AND BELT A78F;N # Lo LATIN LETTER SINOLOGICAL DOT -A790..A7BF;N # L& [48] LATIN CAPITAL LETTER N WITH DESCENDER..LATIN SMALL LETTER GLOTTAL U -A7C2..A7CA;N # L& [9] LATIN CAPITAL LETTER ANGLICANA W..LATIN SMALL LETTER S WITH SHORT STROKE OVERLAY +A790..A7CA;N # L& [59] LATIN CAPITAL LETTER N WITH DESCENDER..LATIN SMALL LETTER S WITH SHORT STROKE OVERLAY +A7D0..A7D1;N # L& [2] LATIN CAPITAL LETTER CLOSED INSULAR G..LATIN SMALL LETTER CLOSED INSULAR G +A7D3;N # Ll LATIN SMALL LETTER DOUBLE THORN +A7D5..A7D9;N # L& [5] LATIN SMALL LETTER DOUBLE WYNN..LATIN SMALL LETTER SIGMOID S +A7F2..A7F4;N # Lm [3] MODIFIER LETTER CAPITAL C..MODIFIER LETTER CAPITAL Q A7F5..A7F6;N # L& [2] LATIN CAPITAL LETTER REVERSED HALF H..LATIN SMALL LETTER REVERSED HALF H A7F7;N # Lo LATIN EPIGRAPHIC LETTER SIDEWAYS I A7F8..A7F9;N # Lm [2] MODIFIER LETTER CAPITAL H WITH STROKE..MODIFIER LETTER SMALL LIGATURE OE @@ -1682,15 +1702,17 @@ FB40..FB41;N # Lo [2] HEBREW LETTER NUN WITH DAGESH..HEBREW LETTER SAMEK FB43..FB44;N # Lo [2] HEBREW LETTER FINAL PE WITH DAGESH..HEBREW LETTER PE WITH DAGESH FB46..FB4F;N # Lo [10] HEBREW LETTER TSADI WITH DAGESH..HEBREW LIGATURE ALEF LAMED FB50..FBB1;N # Lo [98] ARABIC LETTER ALEF WASLA ISOLATED FORM..ARABIC LETTER YEH BARREE WITH HAMZA ABOVE FINAL FORM -FBB2..FBC1;N # Sk [16] ARABIC SYMBOL DOT ABOVE..ARABIC SYMBOL SMALL TAH BELOW +FBB2..FBC2;N # Sk [17] ARABIC SYMBOL DOT ABOVE..ARABIC SYMBOL WASLA ABOVE FBD3..FD3D;N # Lo [363] ARABIC LETTER NG ISOLATED FORM..ARABIC LIGATURE ALEF WITH FATHATAN ISOLATED FORM FD3E;N # Pe ORNATE LEFT PARENTHESIS FD3F;N # Ps ORNATE RIGHT PARENTHESIS +FD40..FD4F;N # So [16] ARABIC LIGATURE RAHIMAHU ALLAAH..ARABIC LIGATURE RAHIMAHUM ALLAAH FD50..FD8F;N # Lo [64] ARABIC LIGATURE TEH WITH JEEM WITH MEEM INITIAL FORM..ARABIC LIGATURE MEEM WITH KHAH WITH MEEM INITIAL FORM FD92..FDC7;N # Lo [54] ARABIC LIGATURE MEEM WITH JEEM WITH KHAH INITIAL FORM..ARABIC LIGATURE NOON WITH JEEM WITH YEH FINAL FORM +FDCF;N # So ARABIC LIGATURE SALAAMUHU ALAYNAA FDF0..FDFB;N # Lo [12] ARABIC LIGATURE SALLA USED AS KORANIC STOP SIGN ISOLATED FORM..ARABIC LIGATURE JALLAJALALOUHOU FDFC;N # Sc RIAL SIGN -FDFD;N # So ARABIC LIGATURE BISMILLAH AR-RAHMAN AR-RAHEEM +FDFD..FDFF;N # So [3] ARABIC LIGATURE BISMILLAH AR-RAHMAN AR-RAHEEM..ARABIC LIGATURE AZZA WA JALL FE00..FE0F;A # Mn [16] VARIATION SELECTOR-1..VARIATION SELECTOR-16 FE10..FE16;W # Po [7] PRESENTATION FORM FOR VERTICAL COMMA..PRESENTATION FORM FOR VERTICAL QUESTION MARK FE17;W # Ps PRESENTATION FORM FOR VERTICAL LEFT WHITE LENTICULAR BRACKET @@ -1839,9 +1861,20 @@ FFFD;A # So REPLACEMENT CHARACTER 10500..10527;N # Lo [40] ELBASAN LETTER A..ELBASAN LETTER KHE 10530..10563;N # Lo [52] CAUCASIAN ALBANIAN LETTER ALT..CAUCASIAN ALBANIAN LETTER KIW 1056F;N # Po CAUCASIAN ALBANIAN CITATION MARK +10570..1057A;N # Lu [11] VITHKUQI CAPITAL LETTER A..VITHKUQI CAPITAL LETTER GA +1057C..1058A;N # Lu [15] VITHKUQI CAPITAL LETTER HA..VITHKUQI CAPITAL LETTER RE +1058C..10592;N # Lu [7] VITHKUQI CAPITAL LETTER SE..VITHKUQI CAPITAL LETTER XE +10594..10595;N # Lu [2] VITHKUQI CAPITAL LETTER Y..VITHKUQI CAPITAL LETTER ZE +10597..105A1;N # Ll [11] VITHKUQI SMALL LETTER A..VITHKUQI SMALL LETTER GA +105A3..105B1;N # Ll [15] VITHKUQI SMALL LETTER HA..VITHKUQI SMALL LETTER RE +105B3..105B9;N # Ll [7] VITHKUQI SMALL LETTER SE..VITHKUQI SMALL LETTER XE +105BB..105BC;N # Ll [2] VITHKUQI SMALL LETTER Y..VITHKUQI SMALL LETTER ZE 10600..10736;N # Lo [311] LINEAR A SIGN AB001..LINEAR A SIGN A664 10740..10755;N # Lo [22] LINEAR A SIGN A701 A..LINEAR A SIGN A732 JE 10760..10767;N # Lo [8] LINEAR A SIGN A800..LINEAR A SIGN A807 +10780..10785;N # Lm [6] MODIFIER LETTER SMALL CAPITAL AA..MODIFIER LETTER SMALL B WITH HOOK +10787..107B0;N # Lm [42] MODIFIER LETTER SMALL DZ DIGRAPH..MODIFIER LETTER SMALL V WITH RIGHT HOOK +107B2..107BA;N # Lm [9] MODIFIER LETTER SMALL CAPITAL Y..MODIFIER LETTER SMALL S WITH CURL 10800..10805;N # Lo [6] CYPRIOT SYLLABLE A..CYPRIOT SYLLABLE JA 10808;N # Lo CYPRIOT SYLLABLE JO 1080A..10835;N # Lo [44] CYPRIOT SYLLABLE KA..CYPRIOT SYLLABLE WO @@ -1920,6 +1953,9 @@ FFFD;A # So REPLACEMENT CHARACTER 10F46..10F50;N # Mn [11] SOGDIAN COMBINING DOT BELOW..SOGDIAN COMBINING STROKE BELOW 10F51..10F54;N # No [4] SOGDIAN NUMBER ONE..SOGDIAN NUMBER ONE HUNDRED 10F55..10F59;N # Po [5] SOGDIAN PUNCTUATION TWO VERTICAL BARS..SOGDIAN PUNCTUATION HALF CIRCLE WITH DOT +10F70..10F81;N # Lo [18] OLD UYGHUR LETTER ALEPH..OLD UYGHUR LETTER LESH +10F82..10F85;N # Mn [4] OLD UYGHUR COMBINING DOT ABOVE..OLD UYGHUR COMBINING TWO DOTS BELOW +10F86..10F89;N # Po [4] OLD UYGHUR PUNCTUATION BAR..OLD UYGHUR PUNCTUATION FOUR DOTS 10FB0..10FC4;N # Lo [21] CHORASMIAN LETTER ALEPH..CHORASMIAN LETTER TAW 10FC5..10FCB;N # No [7] CHORASMIAN NUMBER ONE..CHORASMIAN NUMBER ONE HUNDRED 10FE0..10FF6;N # Lo [23] ELYMAIC LETTER ALEPH..ELYMAIC LIGATURE ZAYIN-YODH @@ -1931,6 +1967,10 @@ FFFD;A # So REPLACEMENT CHARACTER 11047..1104D;N # Po [7] BRAHMI DANDA..BRAHMI PUNCTUATION LOTUS 11052..11065;N # No [20] BRAHMI NUMBER ONE..BRAHMI NUMBER ONE THOUSAND 11066..1106F;N # Nd [10] BRAHMI DIGIT ZERO..BRAHMI DIGIT NINE +11070;N # Mn BRAHMI SIGN OLD TAMIL VIRAMA +11071..11072;N # Lo [2] BRAHMI LETTER OLD TAMIL SHORT E..BRAHMI LETTER OLD TAMIL SHORT O +11073..11074;N # Mn [2] BRAHMI VOWEL SIGN OLD TAMIL SHORT E..BRAHMI VOWEL SIGN OLD TAMIL SHORT O +11075;N # Lo BRAHMI LETTER OLD TAMIL LLA 1107F;N # Mn BRAHMI NUMBER JOINER 11080..11081;N # Mn [2] KAITHI SIGN CANDRABINDU..KAITHI SIGN ANUSVARA 11082;N # Mc KAITHI SIGN VISARGA @@ -1942,6 +1982,7 @@ FFFD;A # So REPLACEMENT CHARACTER 110BB..110BC;N # Po [2] KAITHI ABBREVIATION SIGN..KAITHI ENUMERATION SIGN 110BD;N # Cf KAITHI NUMBER SIGN 110BE..110C1;N # Po [4] KAITHI SECTION MARK..KAITHI DOUBLE DANDA +110C2;N # Mn KAITHI VOWEL SIGN VOCALIC R 110CD;N # Cf KAITHI NUMBER SIGN ABOVE 110D0..110E8;N # Lo [25] SORA SOMPENG LETTER SAH..SORA SOMPENG LETTER MAE 110F0..110F9;N # Nd [10] SORA SOMPENG DIGIT ZERO..SORA SOMPENG DIGIT NINE @@ -2076,6 +2117,7 @@ FFFD;A # So REPLACEMENT CHARACTER 116B6;N # Mc TAKRI SIGN VIRAMA 116B7;N # Mn TAKRI SIGN NUKTA 116B8;N # Lo TAKRI LETTER ARCHAIC KHA +116B9;N # Po TAKRI ABBREVIATION SIGN 116C0..116C9;N # Nd [10] TAKRI DIGIT ZERO..TAKRI DIGIT NINE 11700..1171A;N # Lo [27] AHOM LETTER KA..AHOM LETTER ALTERNATE BA 1171D..1171F;N # Mn [3] AHOM CONSONANT SIGN MEDIAL LA..AHOM CONSONANT SIGN MEDIAL LIGATING RA @@ -2087,6 +2129,7 @@ FFFD;A # So REPLACEMENT CHARACTER 1173A..1173B;N # No [2] AHOM NUMBER TEN..AHOM NUMBER TWENTY 1173C..1173E;N # Po [3] AHOM SIGN SMALL SECTION..AHOM SIGN RULAI 1173F;N # So AHOM SYMBOL VI +11740..11746;N # Lo [7] AHOM LETTER CA..AHOM LETTER LLA 11800..1182B;N # Lo [44] DOGRA LETTER A..DOGRA LETTER RRA 1182C..1182E;N # Mc [3] DOGRA VOWEL SIGN AA..DOGRA VOWEL SIGN II 1182F..11837;N # Mn [9] DOGRA VOWEL SIGN U..DOGRA SIGN ANUSVARA @@ -2145,6 +2188,7 @@ FFFD;A # So REPLACEMENT CHARACTER 11A9A..11A9C;N # Po [3] SOYOMBO MARK TSHEG..SOYOMBO MARK DOUBLE SHAD 11A9D;N # Lo SOYOMBO MARK PLUTA 11A9E..11AA2;N # Po [5] SOYOMBO HEAD MARK WITH MOON AND SUN AND TRIPLE FLAME..SOYOMBO TERMINAL MARK-2 +11AB0..11ABF;N # Lo [16] CANADIAN SYLLABICS NATTILIK HI..CANADIAN SYLLABICS SPA 11AC0..11AF8;N # Lo [57] PAU CIN HAU LETTER PA..PAU CIN HAU GLOTTAL STOP FINAL 11C00..11C08;N # Lo [9] BHAIKSUKI LETTER A..BHAIKSUKI LETTER VOCALIC L 11C0A..11C2E;N # Lo [37] BHAIKSUKI LETTER E..BHAIKSUKI LETTER HA @@ -2201,6 +2245,8 @@ FFFD;A # So REPLACEMENT CHARACTER 12400..1246E;N # Nl [111] CUNEIFORM NUMERIC SIGN TWO ASH..CUNEIFORM NUMERIC SIGN NINE U VARIANT FORM 12470..12474;N # Po [5] CUNEIFORM PUNCTUATION SIGN OLD ASSYRIAN WORD DIVIDER..CUNEIFORM PUNCTUATION SIGN DIAGONAL QUADCOLON 12480..12543;N # Lo [196] CUNEIFORM SIGN AB TIMES NUN TENU..CUNEIFORM SIGN ZU5 TIMES THREE DISH TENU +12F90..12FF0;N # Lo [97] CYPRO-MINOAN SIGN CM001..CYPRO-MINOAN SIGN CM114 +12FF1..12FF2;N # Po [2] CYPRO-MINOAN SIGN CM301..CYPRO-MINOAN SIGN CM302 13000..1342E;N # Lo [1071] EGYPTIAN HIEROGLYPH A001..EGYPTIAN HIEROGLYPH AA032 13430..13438;N # Cf [9] EGYPTIAN HIEROGLYPH VERTICAL JOINER..EGYPTIAN HIEROGLYPH END SEGMENT 14400..14646;N # Lo [583] ANATOLIAN HIEROGLYPH A001..ANATOLIAN HIEROGLYPH A530 @@ -2208,6 +2254,8 @@ FFFD;A # So REPLACEMENT CHARACTER 16A40..16A5E;N # Lo [31] MRO LETTER TA..MRO LETTER TEK 16A60..16A69;N # Nd [10] MRO DIGIT ZERO..MRO DIGIT NINE 16A6E..16A6F;N # Po [2] MRO DANDA..MRO DOUBLE DANDA +16A70..16ABE;N # Lo [79] TANGSA LETTER OZ..TANGSA LETTER ZA +16AC0..16AC9;N # Nd [10] TANGSA DIGIT ZERO..TANGSA DIGIT NINE 16AD0..16AED;N # Lo [30] BASSA VAH LETTER ENNI..BASSA VAH LETTER I 16AF0..16AF4;N # Mn [5] BASSA VAH COMBINING HIGH TONE..BASSA VAH COMBINING HIGH-LOW TONE 16AF5;N # Po BASSA VAH FULL STOP @@ -2240,8 +2288,11 @@ FFFD;A # So REPLACEMENT CHARACTER 18800..18AFF;W # Lo [768] TANGUT COMPONENT-001..TANGUT COMPONENT-768 18B00..18CD5;W # Lo [470] KHITAN SMALL SCRIPT CHARACTER-18B00..KHITAN SMALL SCRIPT CHARACTER-18CD5 18D00..18D08;W # Lo [9] TANGUT IDEOGRAPH-18D00..TANGUT IDEOGRAPH-18D08 +1AFF0..1AFF3;W # Lm [4] KATAKANA LETTER MINNAN TONE-2..KATAKANA LETTER MINNAN TONE-5 +1AFF5..1AFFB;W # Lm [7] KATAKANA LETTER MINNAN TONE-7..KATAKANA LETTER MINNAN NASALIZED TONE-5 +1AFFD..1AFFE;W # Lm [2] KATAKANA LETTER MINNAN NASALIZED TONE-7..KATAKANA LETTER MINNAN NASALIZED TONE-8 1B000..1B0FF;W # Lo [256] KATAKANA LETTER ARCHAIC E..HENTAIGANA LETTER RE-2 -1B100..1B11E;W # Lo [31] HENTAIGANA LETTER RE-3..HENTAIGANA LETTER N-MU-MO-2 +1B100..1B122;W # Lo [35] HENTAIGANA LETTER RE-3..KATAKANA LETTER ARCHAIC WU 1B150..1B152;W # Lo [3] HIRAGANA LETTER SMALL WI..HIRAGANA LETTER SMALL WO 1B164..1B167;W # Lo [4] KATAKANA LETTER SMALL WI..KATAKANA LETTER SMALL N 1B170..1B2FB;W # Lo [396] NUSHU CHARACTER-1B170..NUSHU CHARACTER-1B2FB @@ -2253,6 +2304,9 @@ FFFD;A # So REPLACEMENT CHARACTER 1BC9D..1BC9E;N # Mn [2] DUPLOYAN THICK LETTER SELECTOR..DUPLOYAN DOUBLE MARK 1BC9F;N # Po DUPLOYAN PUNCTUATION CHINOOK FULL STOP 1BCA0..1BCA3;N # Cf [4] SHORTHAND FORMAT LETTER OVERLAP..SHORTHAND FORMAT UP STEP +1CF00..1CF2D;N # Mn [46] ZNAMENNY COMBINING MARK GORAZDO NIZKO S KRYZHEM ON LEFT..ZNAMENNY COMBINING MARK KRYZH ON LEFT +1CF30..1CF46;N # Mn [23] ZNAMENNY COMBINING TONAL RANGE MARK MRACHNO..ZNAMENNY PRIZNAK MODIFIER ROG +1CF50..1CFC3;N # So [116] ZNAMENNY NEUME KRYUK..ZNAMENNY NEUME PAUK 1D000..1D0F5;N # So [246] BYZANTINE MUSICAL SYMBOL PSILI..BYZANTINE MUSICAL SYMBOL GORGON NEO KATO 1D100..1D126;N # So [39] MUSICAL SYMBOL SINGLE BARLINE..MUSICAL SYMBOL DRUM CLEF-2 1D129..1D164;N # So [60] MUSICAL SYMBOL MULTIPLE MEASURE REST..MUSICAL SYMBOL ONE HUNDRED TWENTY-EIGHTH NOTE @@ -2266,7 +2320,7 @@ FFFD;A # So REPLACEMENT CHARACTER 1D185..1D18B;N # Mn [7] MUSICAL SYMBOL COMBINING DOIT..MUSICAL SYMBOL COMBINING TRIPLE TONGUE 1D18C..1D1A9;N # So [30] MUSICAL SYMBOL RINFORZANDO..MUSICAL SYMBOL DEGREE SLASH 1D1AA..1D1AD;N # Mn [4] MUSICAL SYMBOL COMBINING DOWN BOW..MUSICAL SYMBOL COMBINING SNAP PIZZICATO -1D1AE..1D1E8;N # So [59] MUSICAL SYMBOL PEDAL MARK..MUSICAL SYMBOL KIEVAN FLAT SIGN +1D1AE..1D1EA;N # So [61] MUSICAL SYMBOL PEDAL MARK..MUSICAL SYMBOL KORON 1D200..1D241;N # So [66] GREEK VOCAL NOTATION SYMBOL-1..GREEK INSTRUMENTAL NOTATION SYMBOL-54 1D242..1D244;N # Mn [3] COMBINING GREEK MUSICAL TRISEME..COMBINING GREEK MUSICAL PENTASEME 1D245;N # So GREEK MUSICAL LEIMMA @@ -2326,6 +2380,9 @@ FFFD;A # So REPLACEMENT CHARACTER 1DA87..1DA8B;N # Po [5] SIGNWRITING COMMA..SIGNWRITING PARENTHESIS 1DA9B..1DA9F;N # Mn [5] SIGNWRITING FILL MODIFIER-2..SIGNWRITING FILL MODIFIER-6 1DAA1..1DAAF;N # Mn [15] SIGNWRITING ROTATION MODIFIER-2..SIGNWRITING ROTATION MODIFIER-16 +1DF00..1DF09;N # Ll [10] LATIN SMALL LETTER FENG DIGRAPH WITH TRILL..LATIN SMALL LETTER T WITH HOOK AND RETROFLEX HOOK +1DF0A;N # Lo LATIN LETTER RETROFLEX CLICK WITH RETROFLEX HOOK +1DF0B..1DF1E;N # Ll [20] LATIN SMALL LETTER ESH WITH DOUBLE BAR..LATIN SMALL LETTER S WITH CURL 1E000..1E006;N # Mn [7] COMBINING GLAGOLITIC LETTER AZU..COMBINING GLAGOLITIC LETTER ZHIVETE 1E008..1E018;N # Mn [17] COMBINING GLAGOLITIC LETTER ZEMLJA..COMBINING GLAGOLITIC LETTER HERU 1E01B..1E021;N # Mn [7] COMBINING GLAGOLITIC LETTER SHTA..COMBINING GLAGOLITIC LETTER YATI @@ -2337,10 +2394,16 @@ FFFD;A # So REPLACEMENT CHARACTER 1E140..1E149;N # Nd [10] NYIAKENG PUACHUE HMONG DIGIT ZERO..NYIAKENG PUACHUE HMONG DIGIT NINE 1E14E;N # Lo NYIAKENG PUACHUE HMONG LOGOGRAM NYAJ 1E14F;N # So NYIAKENG PUACHUE HMONG CIRCLED CA +1E290..1E2AD;N # Lo [30] TOTO LETTER PA..TOTO LETTER A +1E2AE;N # Mn TOTO SIGN RISING TONE 1E2C0..1E2EB;N # Lo [44] WANCHO LETTER AA..WANCHO LETTER YIH 1E2EC..1E2EF;N # Mn [4] WANCHO TONE TUP..WANCHO TONE KOINI 1E2F0..1E2F9;N # Nd [10] WANCHO DIGIT ZERO..WANCHO DIGIT NINE 1E2FF;N # Sc WANCHO NGUN SIGN +1E7E0..1E7E6;N # Lo [7] ETHIOPIC SYLLABLE HHYA..ETHIOPIC SYLLABLE HHYO +1E7E8..1E7EB;N # Lo [4] ETHIOPIC SYLLABLE GURAGE HHWA..ETHIOPIC SYLLABLE HHWE +1E7ED..1E7EE;N # Lo [2] ETHIOPIC SYLLABLE GURAGE MWI..ETHIOPIC SYLLABLE GURAGE MWEE +1E7F0..1E7FE;N # Lo [15] ETHIOPIC SYLLABLE GURAGE QWI..ETHIOPIC SYLLABLE GURAGE PWEE 1E800..1E8C4;N # Lo [197] MENDE KIKAKUI SYLLABLE M001 KI..MENDE KIKAKUI SYLLABLE M060 NYON 1E8C7..1E8CF;N # No [9] MENDE KIKAKUI DIGIT ONE..MENDE KIKAKUI DIGIT NINE 1E8D0..1E8D6;N # Mn [7] MENDE KIKAKUI COMBINING NUMBER TEENS..MENDE KIKAKUI COMBINING NUMBER MILLIONS @@ -2465,6 +2528,7 @@ FFFD;A # So REPLACEMENT CHARACTER 1F6D0..1F6D2;W # So [3] PLACE OF WORSHIP..SHOPPING TROLLEY 1F6D3..1F6D4;N # So [2] STUPA..PAGODA 1F6D5..1F6D7;W # So [3] HINDU TEMPLE..ELEVATOR +1F6DD..1F6DF;W # So [3] PLAYGROUND SLIDE..RING BUOY 1F6E0..1F6EA;N # So [11] HAMMER AND WRENCH..NORTHEAST-POINTING AIRPLANE 1F6EB..1F6EC;W # So [2] AIRPLANE DEPARTURE..AIRPLANE ARRIVING 1F6F0..1F6F3;N # So [4] SATELLITE..PASSENGER SHIP @@ -2472,6 +2536,7 @@ FFFD;A # So REPLACEMENT CHARACTER 1F700..1F773;N # So [116] ALCHEMICAL SYMBOL FOR QUINTESSENCE..ALCHEMICAL SYMBOL FOR HALF OUNCE 1F780..1F7D8;N # So [89] BLACK LEFT-POINTING ISOSCELES RIGHT TRIANGLE..NEGATIVE CIRCLED SQUARE 1F7E0..1F7EB;W # So [12] LARGE ORANGE CIRCLE..LARGE BROWN SQUARE +1F7F0;W # So HEAVY EQUALS SIGN 1F800..1F80B;N # So [12] LEFTWARDS ARROW WITH SMALL TRIANGLE ARROWHEAD..DOWNWARDS ARROW WITH LARGE TRIANGLE ARROWHEAD 1F810..1F847;N # So [56] LEFTWARDS ARROW WITH SMALL EQUILATERAL ARROWHEAD..DOWNWARDS HEAVY ARROW 1F850..1F859;N # So [10] LEFTWARDS SANS-SERIF ARROW..UP DOWN SANS-SERIF ARROW @@ -2483,25 +2548,25 @@ FFFD;A # So REPLACEMENT CHARACTER 1F93B;N # So MODERN PENTATHLON 1F93C..1F945;W # So [10] WRESTLERS..GOAL NET 1F946;N # So RIFLE -1F947..1F978;W # So [50] FIRST PLACE MEDAL..DISGUISED FACE -1F97A..1F9CB;W # So [82] FACE WITH PLEADING EYES..BUBBLE TEA -1F9CD..1F9FF;W # So [51] STANDING PERSON..NAZAR AMULET +1F947..1F9FF;W # So [185] FIRST PLACE MEDAL..NAZAR AMULET 1FA00..1FA53;N # So [84] NEUTRAL CHESS KING..BLACK CHESS KNIGHT-BISHOP 1FA60..1FA6D;N # So [14] XIANGQI RED GENERAL..XIANGQI BLACK SOLDIER 1FA70..1FA74;W # So [5] BALLET SHOES..THONG SANDAL -1FA78..1FA7A;W # So [3] DROP OF BLOOD..STETHOSCOPE +1FA78..1FA7C;W # So [5] DROP OF BLOOD..CRUTCH 1FA80..1FA86;W # So [7] YO-YO..NESTING DOLLS -1FA90..1FAA8;W # So [25] RINGED PLANET..ROCK -1FAB0..1FAB6;W # So [7] FLY..FEATHER -1FAC0..1FAC2;W # So [3] ANATOMICAL HEART..PEOPLE HUGGING -1FAD0..1FAD6;W # So [7] BLUEBERRIES..TEAPOT +1FA90..1FAAC;W # So [29] RINGED PLANET..HAMSA +1FAB0..1FABA;W # So [11] FLY..NEST WITH EGGS +1FAC0..1FAC5;W # So [6] ANATOMICAL HEART..PERSON WITH CROWN +1FAD0..1FAD9;W # So [10] BLUEBERRIES..JAR +1FAE0..1FAE7;W # So [8] MELTING FACE..BUBBLES +1FAF0..1FAF6;W # So [7] HAND WITH INDEX FINGER AND THUMB CROSSED..HEART HANDS 1FB00..1FB92;N # So [147] BLOCK SEXTANT-1..UPPER HALF INVERSE MEDIUM SHADE AND LOWER HALF BLOCK 1FB94..1FBCA;N # So [55] LEFT HALF INVERSE MEDIUM SHADE AND RIGHT HALF BLOCK..WHITE UP-POINTING CHEVRON 1FBF0..1FBF9;N # Nd [10] SEGMENTED DIGIT ZERO..SEGMENTED DIGIT NINE -20000..2A6DD;W # Lo [42718] CJK UNIFIED IDEOGRAPH-20000..CJK UNIFIED IDEOGRAPH-2A6DD -2A6DE..2A6FF;W # Cn [34] .. -2A700..2B734;W # Lo [4149] CJK UNIFIED IDEOGRAPH-2A700..CJK UNIFIED IDEOGRAPH-2B734 -2B735..2B73F;W # Cn [11] .. +20000..2A6DF;W # Lo [42720] CJK UNIFIED IDEOGRAPH-20000..CJK UNIFIED IDEOGRAPH-2A6DF +2A6E0..2A6FF;W # Cn [32] .. +2A700..2B738;W # Lo [4153] CJK UNIFIED IDEOGRAPH-2A700..CJK UNIFIED IDEOGRAPH-2B738 +2B739..2B73F;W # Cn [7] .. 2B740..2B81D;W # Lo [222] CJK UNIFIED IDEOGRAPH-2B740..CJK UNIFIED IDEOGRAPH-2B81D 2B81E..2B81F;W # Cn [2] .. 2B820..2CEA1;W # Lo [5762] CJK UNIFIED IDEOGRAPH-2B820..CJK UNIFIED IDEOGRAPH-2CEA1 diff --git a/Sources/EastAsianWidth/String+Extension.swift b/Sources/EastAsianWidth/String+Extension.swift index 7c2891f..d9ee476 100644 --- a/Sources/EastAsianWidth/String+Extension.swift +++ b/Sources/EastAsianWidth/String+Extension.swift @@ -51,9 +51,11 @@ public extension String { return unicodeScalars.contains { $0.isHalfwidth } } - /// Characters count up by O(n). - /// If the character is ASCII code then count is 1, or else count is 2. - /// Return value is sum of characters count. + /// EastAsianCode count + /// + /// Go through each character. + /// If the character is ASCII code, count is 1. + /// Else count is 2. var fullwidthHalfwidthCount: Int { return unicodeScalars.countByEastAsianWidth() } diff --git a/Sources/EastAsianWidth/UnicodeScalar+Generated.swift b/Sources/EastAsianWidth/UnicodeScalar+Generated.swift index a7b5fb0..a5907ae 100644 --- a/Sources/EastAsianWidth/UnicodeScalar+Generated.swift +++ b/Sources/EastAsianWidth/UnicodeScalar+Generated.swift @@ -94,7 +94,10 @@ public extension UnicodeScalar { case 0x17000...0x187f7: return true case 0x18800...0x18cd5: return true case 0x18d00...0x18d08: return true - case 0x1b000...0x1b11e: return true + case 0x1aff0...0x1aff3: return true + case 0x1aff5...0x1affb: return true + case 0x1affd...0x1affe: return true + case 0x1b000...0x1b122: return true case 0x1b150...0x1b152: return true case 0x1b164...0x1b167: return true case 0x1b170...0x1b2fb: return true @@ -129,21 +132,23 @@ public extension UnicodeScalar { case 0x1f6cc...0x1f6cc: return true case 0x1f6d0...0x1f6d2: return true case 0x1f6d5...0x1f6d7: return true + case 0x1f6dd...0x1f6df: return true case 0x1f6eb...0x1f6ec: return true case 0x1f6f4...0x1f6fc: return true case 0x1f7e0...0x1f7eb: return true + case 0x1f7f0...0x1f7f0: return true case 0x1f90c...0x1f93a: return true case 0x1f93c...0x1f945: return true - case 0x1f947...0x1f978: return true - case 0x1f97a...0x1f9cb: return true - case 0x1f9cd...0x1f9ff: return true + case 0x1f947...0x1f9ff: return true case 0x1fa70...0x1fa74: return true - case 0x1fa78...0x1fa7a: return true + case 0x1fa78...0x1fa7c: return true case 0x1fa80...0x1fa86: return true - case 0x1fa90...0x1faa8: return true - case 0x1fab0...0x1fab6: return true - case 0x1fac0...0x1fac2: return true - case 0x1fad0...0x1fad6: return true + case 0x1fa90...0x1faac: return true + case 0x1fab0...0x1faba: return true + case 0x1fac0...0x1fac5: return true + case 0x1fad0...0x1fad9: return true + case 0x1fae0...0x1fae7: return true + case 0x1faf0...0x1faf6: return true case 0x20000...0x2fffd: return true case 0x30000...0x3fffd: return true default: return false @@ -419,8 +424,7 @@ public extension UnicodeScalar { case 0x591...0x5c7: return true case 0x5d0...0x5ea: return true case 0x5ef...0x5f4: return true - case 0x600...0x61c: return true - case 0x61e...0x70d: return true + case 0x600...0x70d: return true case 0x70f...0x74a: return true case 0x74d...0x7b1: return true case 0x7c0...0x7fa: return true @@ -429,9 +433,9 @@ public extension UnicodeScalar { case 0x840...0x85b: return true case 0x85e...0x85e: return true case 0x860...0x86a: return true - case 0x8a0...0x8b4: return true - case 0x8b6...0x8c7: return true - case 0x8d3...0x983: return true + case 0x870...0x88e: return true + case 0x890...0x891: return true + case 0x898...0x983: return true case 0x985...0x98c: return true case 0x98f...0x990: return true case 0x993...0x9a8: return true @@ -509,11 +513,12 @@ public extension UnicodeScalar { case 0xc0e...0xc10: return true case 0xc12...0xc28: return true case 0xc2a...0xc39: return true - case 0xc3d...0xc44: return true + case 0xc3c...0xc44: return true case 0xc46...0xc48: return true case 0xc4a...0xc4d: return true case 0xc55...0xc56: return true case 0xc58...0xc5a: return true + case 0xc5d...0xc5d: return true case 0xc60...0xc63: return true case 0xc66...0xc6f: return true case 0xc77...0xc8c: return true @@ -525,7 +530,7 @@ public extension UnicodeScalar { case 0xcc6...0xcc8: return true case 0xcca...0xccd: return true case 0xcd5...0xcd6: return true - case 0xcde...0xcde: return true + case 0xcdd...0xcde: return true case 0xce0...0xce3: return true case 0xce6...0xcef: return true case 0xcf1...0xcf2: return true @@ -593,9 +598,8 @@ public extension UnicodeScalar { case 0x13f8...0x13fd: return true case 0x1400...0x169c: return true case 0x16a0...0x16f8: return true - case 0x1700...0x170c: return true - case 0x170e...0x1714: return true - case 0x1720...0x1736: return true + case 0x1700...0x1715: return true + case 0x171f...0x1736: return true case 0x1740...0x1753: return true case 0x1760...0x176c: return true case 0x176e...0x1770: return true @@ -603,8 +607,7 @@ public extension UnicodeScalar { case 0x1780...0x17dd: return true case 0x17e0...0x17e9: return true case 0x17f0...0x17f9: return true - case 0x1800...0x180e: return true - case 0x1810...0x1819: return true + case 0x1800...0x1819: return true case 0x1820...0x1878: return true case 0x1880...0x18aa: return true case 0x18b0...0x18f5: return true @@ -623,9 +626,9 @@ public extension UnicodeScalar { case 0x1a7f...0x1a89: return true case 0x1a90...0x1a99: return true case 0x1aa0...0x1aad: return true - case 0x1ab0...0x1ac0: return true - case 0x1b00...0x1b4b: return true - case 0x1b50...0x1b7c: return true + case 0x1ab0...0x1ace: return true + case 0x1b00...0x1b4c: return true + case 0x1b50...0x1b7e: return true case 0x1b80...0x1bf3: return true case 0x1bfc...0x1c37: return true case 0x1c3b...0x1c49: return true @@ -633,8 +636,7 @@ public extension UnicodeScalar { case 0x1c90...0x1cba: return true case 0x1cbd...0x1cc7: return true case 0x1cd0...0x1cfa: return true - case 0x1d00...0x1df9: return true - case 0x1dfb...0x1f15: return true + case 0x1d00...0x1f15: return true case 0x1f18...0x1f1d: return true case 0x1f20...0x1f45: return true case 0x1f48...0x1f4d: return true @@ -669,7 +671,7 @@ public extension UnicodeScalar { case 0x2090...0x209c: return true case 0x20a0...0x20a8: return true case 0x20aa...0x20ab: return true - case 0x20ad...0x20bf: return true + case 0x20ad...0x20c0: return true case 0x20d0...0x20f0: return true case 0x2100...0x2102: return true case 0x2104...0x2104: return true @@ -783,9 +785,7 @@ public extension UnicodeScalar { case 0x2b51...0x2b54: return true case 0x2b5a...0x2b73: return true case 0x2b76...0x2b95: return true - case 0x2b97...0x2c2e: return true - case 0x2c30...0x2c5e: return true - case 0x2c60...0x2cf3: return true + case 0x2b97...0x2cf3: return true case 0x2cf9...0x2d25: return true case 0x2d27...0x2d27: return true case 0x2d2d...0x2d2d: return true @@ -800,14 +800,16 @@ public extension UnicodeScalar { case 0x2dc8...0x2dce: return true case 0x2dd0...0x2dd6: return true case 0x2dd8...0x2dde: return true - case 0x2de0...0x2e52: return true + case 0x2de0...0x2e5d: return true case 0x303f...0x303f: return true case 0x4dc0...0x4dff: return true case 0xa4d0...0xa62b: return true case 0xa640...0xa6f7: return true - case 0xa700...0xa7bf: return true - case 0xa7c2...0xa7ca: return true - case 0xa7f5...0xa82c: return true + case 0xa700...0xa7ca: return true + case 0xa7d0...0xa7d1: return true + case 0xa7d3...0xa7d3: return true + case 0xa7d5...0xa7d9: return true + case 0xa7f2...0xa82c: return true case 0xa830...0xa839: return true case 0xa840...0xa877: return true case 0xa880...0xa8c5: return true @@ -840,11 +842,11 @@ public extension UnicodeScalar { case 0xfb3e...0xfb3e: return true case 0xfb40...0xfb41: return true case 0xfb43...0xfb44: return true - case 0xfb46...0xfbc1: return true - case 0xfbd3...0xfd3f: return true - case 0xfd50...0xfd8f: return true + case 0xfb46...0xfbc2: return true + case 0xfbd3...0xfd8f: return true case 0xfd92...0xfdc7: return true - case 0xfdf0...0xfdfd: return true + case 0xfdcf...0xfdcf: return true + case 0xfdf0...0xfdff: return true case 0xfe20...0xfe2f: return true case 0xfe70...0xfe74: return true case 0xfe76...0xfefc: return true @@ -878,10 +880,20 @@ public extension UnicodeScalar { case 0x104d8...0x104fb: return true case 0x10500...0x10527: return true case 0x10530...0x10563: return true - case 0x1056f...0x1056f: return true + case 0x1056f...0x1057a: return true + case 0x1057c...0x1058a: return true + case 0x1058c...0x10592: return true + case 0x10594...0x10595: return true + case 0x10597...0x105a1: return true + case 0x105a3...0x105b1: return true + case 0x105b3...0x105b9: return true + case 0x105bb...0x105bc: return true case 0x10600...0x10736: return true case 0x10740...0x10755: return true case 0x10760...0x10767: return true + case 0x10780...0x10785: return true + case 0x10787...0x107b0: return true + case 0x107b2...0x107ba: return true case 0x10800...0x10805: return true case 0x10808...0x10808: return true case 0x1080a...0x10835: return true @@ -925,11 +937,12 @@ public extension UnicodeScalar { case 0x10eb0...0x10eb1: return true case 0x10f00...0x10f27: return true case 0x10f30...0x10f59: return true + case 0x10f70...0x10f89: return true case 0x10fb0...0x10fcb: return true case 0x10fe0...0x10ff6: return true case 0x11000...0x1104d: return true - case 0x11052...0x1106f: return true - case 0x1107f...0x110c1: return true + case 0x11052...0x11075: return true + case 0x1107f...0x110c2: return true case 0x110cd...0x110cd: return true case 0x110d0...0x110e8: return true case 0x110f0...0x110f9: return true @@ -971,11 +984,11 @@ public extension UnicodeScalar { case 0x11600...0x11644: return true case 0x11650...0x11659: return true case 0x11660...0x1166c: return true - case 0x11680...0x116b8: return true + case 0x11680...0x116b9: return true case 0x116c0...0x116c9: return true case 0x11700...0x1171a: return true case 0x1171d...0x1172b: return true - case 0x11730...0x1173f: return true + case 0x11730...0x11746: return true case 0x11800...0x1183b: return true case 0x118a0...0x118f2: return true case 0x118ff...0x11906: return true @@ -991,7 +1004,7 @@ public extension UnicodeScalar { case 0x119da...0x119e4: return true case 0x11a00...0x11a47: return true case 0x11a50...0x11aa2: return true - case 0x11ac0...0x11af8: return true + case 0x11ab0...0x11af8: return true case 0x11c00...0x11c08: return true case 0x11c0a...0x11c36: return true case 0x11c38...0x11c45: return true @@ -1019,13 +1032,15 @@ public extension UnicodeScalar { case 0x12400...0x1246e: return true case 0x12470...0x12474: return true case 0x12480...0x12543: return true + case 0x12f90...0x12ff2: return true case 0x13000...0x1342e: return true case 0x13430...0x13438: return true case 0x14400...0x14646: return true case 0x16800...0x16a38: return true case 0x16a40...0x16a5e: return true case 0x16a60...0x16a69: return true - case 0x16a6e...0x16a6f: return true + case 0x16a6e...0x16abe: return true + case 0x16ac0...0x16ac9: return true case 0x16ad0...0x16aed: return true case 0x16af0...0x16af5: return true case 0x16b00...0x16b45: return true @@ -1042,9 +1057,12 @@ public extension UnicodeScalar { case 0x1bc80...0x1bc88: return true case 0x1bc90...0x1bc99: return true case 0x1bc9c...0x1bca3: return true + case 0x1cf00...0x1cf2d: return true + case 0x1cf30...0x1cf46: return true + case 0x1cf50...0x1cfc3: return true case 0x1d000...0x1d0f5: return true case 0x1d100...0x1d126: return true - case 0x1d129...0x1d1e8: return true + case 0x1d129...0x1d1ea: return true case 0x1d200...0x1d245: return true case 0x1d2e0...0x1d2f3: return true case 0x1d300...0x1d356: return true @@ -1072,6 +1090,7 @@ public extension UnicodeScalar { case 0x1d7ce...0x1da8b: return true case 0x1da9b...0x1da9f: return true case 0x1daa1...0x1daaf: return true + case 0x1df00...0x1df1e: return true case 0x1e000...0x1e006: return true case 0x1e008...0x1e018: return true case 0x1e01b...0x1e021: return true @@ -1081,8 +1100,13 @@ public extension UnicodeScalar { case 0x1e130...0x1e13d: return true case 0x1e140...0x1e149: return true case 0x1e14e...0x1e14f: return true + case 0x1e290...0x1e2ae: return true case 0x1e2c0...0x1e2f9: return true case 0x1e2ff...0x1e2ff: return true + case 0x1e7e0...0x1e7e6: return true + case 0x1e7e8...0x1e7eb: return true + case 0x1e7ed...0x1e7ee: return true + case 0x1e7f0...0x1e7fe: return true case 0x1e800...0x1e8c4: return true case 0x1e8c7...0x1e8d6: return true case 0x1e900...0x1e94b: return true diff --git a/Sources/EastAsianWidth/UnicodeScalar+Recommendations.swift b/Sources/EastAsianWidth/UnicodeScalar+Recommendations.swift index 91b13be..b63ab55 100644 --- a/Sources/EastAsianWidth/UnicodeScalar+Recommendations.swift +++ b/Sources/EastAsianWidth/UnicodeScalar+Recommendations.swift @@ -15,7 +15,7 @@ public extension UnicodeScalar { /// - Halfwidth Unicode characters always map to halfwidth characters. /// - Ambiguous Unicode characters always map to fullwidth characters. /// - /// https://unicode.org/reports/tr11/#Recommendations + /// https://www.unicode.org/reports/tr11/tr11-39.html#Recommendations var isFullwidth: Bool { return isEastAsianFullwidth diff --git a/Sources/EastAsianWidth/UnicodeScalarView+Extension.swift b/Sources/EastAsianWidth/UnicodeScalarView+Extension.swift index 86e7386..b0bb630 100644 --- a/Sources/EastAsianWidth/UnicodeScalarView+Extension.swift +++ b/Sources/EastAsianWidth/UnicodeScalarView+Extension.swift @@ -9,15 +9,15 @@ import Foundation public extension String.UnicodeScalarView { func countByEastAsianWidth(halfwidthAs: Int = 1, - fullwidthAs: Int = 2, - markEastAsianAmbiguousAsFullwidth: Bool = false) -> Int { - + fullwidthAs: Int = 2, + markEastAsianAmbiguousAsFullwidth: Bool = false) -> Int { + if markEastAsianAmbiguousAsFullwidth { return reduce(into: 0) { res, scalar in res += scalar.isFullwidthOrAmbiguous ? fullwidthAs : halfwidthAs } } - + return reduce(into: 0) { res, scalar in res += scalar.isFullwidth ? fullwidthAs : halfwidthAs } diff --git a/Tests/EastAsianWidthTests/EastAsianAmbiguousTests.swift b/Tests/EastAsianWidthTests/EastAsianAmbiguousTests.swift index 205287b..387f71b 100644 --- a/Tests/EastAsianWidthTests/EastAsianAmbiguousTests.swift +++ b/Tests/EastAsianWidthTests/EastAsianAmbiguousTests.swift @@ -11,14 +11,14 @@ import EastAsianWidth // https://github.com/ukitaka/EastAsianWidth.swift/blob/master/Tests/EastAsianWidthTests/TestUtils.swift final class EastAsianAmbiguousTests: XCTestCase { func testEdgeCases() { - EastAsianAmbiguousEdgeUnicodeScalar.forEach(AssertEastAsianAmbiguous) + EastAsianAmbiguousEdgeUnicodeScalar.forEach(testScalarEastAsianAmbiguous(_:)) } func testNonEastAsianAmbiguousCharacters() { - AssertNotEastAsianAmbiguous("Hello") - AssertNotEastAsianAmbiguous("こんにちわ") - AssertNotEastAsianAmbiguous("안녕하세요") - AssertNotEastAsianAmbiguous("你好") + testStringNotEastAsianAmbiguous("Hello") + testStringNotEastAsianAmbiguous("こんにちわ") + testStringNotEastAsianAmbiguous("안녕하세요") + testStringNotEastAsianAmbiguous("你好") } func testContainsEastAsianAmbiguous() { diff --git a/Tests/EastAsianWidthTests/EastAsianFullwidthTests.swift b/Tests/EastAsianWidthTests/EastAsianFullwidthTests.swift index 6b6adc3..a61a292 100644 --- a/Tests/EastAsianWidthTests/EastAsianFullwidthTests.swift +++ b/Tests/EastAsianWidthTests/EastAsianFullwidthTests.swift @@ -11,14 +11,14 @@ import EastAsianWidth // https://github.com/ukitaka/EastAsianWidth.swift/blob/master/Tests/EastAsianWidthTests/EastAsianFullwidthTests.swift class EastAsianFullwidthTests: XCTestCase { func testEdgeCases() { - EastAsianFullwidthEdgeUnicodeScalar.forEach(AssertEastAsianFullwidth) + EastAsianFullwidthEdgeUnicodeScalar.forEach(testScalarEastAsianFullwidth) } func testNonEastAsianFullwidthCharacters() { - AssertNotEastAsianFullwidth("Hello") - AssertNotEastAsianFullwidth("こんにちわ") - AssertNotEastAsianFullwidth("안녕하세요") - AssertNotEastAsianFullwidth("你好") + testStringNotEastAsianFullwidth("Hello") + testStringNotEastAsianFullwidth("こんにちわ") + testStringNotEastAsianFullwidth("안녕하세요") + testStringNotEastAsianFullwidth("你好") } func testContainsAsianFullwidth() { diff --git a/Tests/EastAsianWidthTests/EastAsianHalfwidthTests.swift b/Tests/EastAsianWidthTests/EastAsianHalfwidthTests.swift index bdf2b8f..6fa17fd 100644 --- a/Tests/EastAsianWidthTests/EastAsianHalfwidthTests.swift +++ b/Tests/EastAsianWidthTests/EastAsianHalfwidthTests.swift @@ -11,14 +11,14 @@ import EastAsianWidth // https://github.com/ukitaka/EastAsianWidth.swift/blob/master/Tests/EastAsianWidthTests/EastAsianHalfwidthTests.swift class EastAsianHalfwidthTests: XCTestCase { func testEdgeCases() { - EastAsianHalfwidthEdgeUnicodeScalar.forEach(AssertEastAsianHalfwidth) + EastAsianHalfwidthEdgeUnicodeScalar.forEach(testScalarEastAsianHalfwidth) } func testNonEastAsianHalfwidthCharacters() { - AssertNotEastAsianHalfwidth("Hello") - AssertNotEastAsianHalfwidth("こんにちわ") - AssertNotEastAsianHalfwidth("안녕하세요") - AssertNotEastAsianHalfwidth("你好") + testStringNotEastAsianHalfwidth("Hello") + testStringNotEastAsianHalfwidth("こんにちわ") + testStringNotEastAsianHalfwidth("안녕하세요") + testStringNotEastAsianHalfwidth("你好") } func testContainsEastAsianHalfwidth() { diff --git a/Tests/EastAsianWidthTests/EastAsianNarrowTests.swift b/Tests/EastAsianWidthTests/EastAsianNarrowTests.swift index 54562d8..d57dff6 100644 --- a/Tests/EastAsianWidthTests/EastAsianNarrowTests.swift +++ b/Tests/EastAsianWidthTests/EastAsianNarrowTests.swift @@ -11,13 +11,13 @@ import EastAsianWidth // https://github.com/ukitaka/EastAsianWidth.swift/blob/master/Tests/EastAsianWidthTests/EastAsianNarrowTests.swift class EastAsianNarrowTests: XCTestCase { func testEdgeCases() { - EastAsianNarrowEdgeUnicodeScalar.forEach(AssertEastAsianNarrow) + EastAsianNarrowEdgeUnicodeScalar.forEach(testScalarEastAsianNarrow(_:)) } func testNonEastAsianNarrowCharacters() { - AssertNotEastAsianNarrow("こんにちわ") - AssertNotEastAsianNarrow("안녕하세요") - AssertNotEastAsianNarrow("你好") + testStringNotEastAsianNarrow("こんにちわ") + testStringNotEastAsianNarrow("안녕하세요") + testStringNotEastAsianNarrow("你好") } func testContainsEastAsianNarrow() { diff --git a/Tests/EastAsianWidthTests/EastAsianNeutralTests.swift b/Tests/EastAsianWidthTests/EastAsianNeutralTests.swift index 5c2c168..05888e7 100644 --- a/Tests/EastAsianWidthTests/EastAsianNeutralTests.swift +++ b/Tests/EastAsianWidthTests/EastAsianNeutralTests.swift @@ -11,14 +11,14 @@ import EastAsianWidth // https://github.com/ukitaka/EastAsianWidth.swift/blob/master/Tests/EastAsianWidthTests/EastAsianNeutralTests.swift class EastAsianNeutralTests: XCTestCase { func testEdgeCases() { - EastAsianNeutralEdgeUnicodeScalar.forEach(AssertEastAsianNeutral) + EastAsianNeutralEdgeUnicodeScalar.forEach(testScalarEastAsianNeutral) } func testNonEastAsianNeutralCharacters() { - AssertNotEastAsianNeutral("Hello") - AssertNotEastAsianNeutral("こんにちわ") - AssertNotEastAsianNeutral("안녕하세요") - AssertNotEastAsianNeutral("你好") + testStringNotEastAsianNeutral("Hello") + testStringNotEastAsianNeutral("こんにちわ") + testStringNotEastAsianNeutral("안녕하세요") + testStringNotEastAsianNeutral("你好") } func testContainsEastAsianNeutral() { diff --git a/Tests/EastAsianWidthTests/EastAsianWideTests.swift b/Tests/EastAsianWidthTests/EastAsianWideTests.swift index ab9b9c3..a6c0554 100644 --- a/Tests/EastAsianWidthTests/EastAsianWideTests.swift +++ b/Tests/EastAsianWidthTests/EastAsianWideTests.swift @@ -11,11 +11,11 @@ import EastAsianWidth // https://github.com/ukitaka/EastAsianWidth.swift/blob/master/Tests/EastAsianWidthTests/EastAsianWideTests.swift class EastAsianWideTests: XCTestCase { func testEdgeCases() { - EastAsianWideEdgeUnicodeScalar.forEach(AssertEastAsianWide) + EastAsianWideEdgeUnicodeScalar.forEach(testScalarEastAsianWide) } func testNonEastAsianWideCharacters() { - AssertNotEastAsianWide("Hello") + testStringNotEastAsianWide("Hello") } func testContainsEastAsianWide() { diff --git a/Tests/EastAsianWidthTests/EdgeCharacters+Generated.swift b/Tests/EastAsianWidthTests/EdgeCharacters+Generated.swift index 8b595da..8449f80 100644 --- a/Tests/EastAsianWidthTests/EdgeCharacters+Generated.swift +++ b/Tests/EastAsianWidthTests/EdgeCharacters+Generated.swift @@ -20,7 +20,7 @@ let EastAsianHalfwidthEdgeRawScalarValue: [UInt32] = [ let EastAsianHalfwidthEdgeUnicodeScalar: [UnicodeScalar] = EastAsianHalfwidthEdgeRawScalarValue.compactMap(UnicodeScalar.init) let EastAsianWideEdgeRawScalarValue: [UInt32] = [ - 0x1100,0x231a,0x231b,0x2329,0x232a,0x23e9,0x23ec,0x23f0,0x23f3,0x25fd,0x25fe,0x2614,0x2615,0x2648,0x2653,0x267f,0x2693,0x26a1,0x26aa,0x26ab,0x26bd,0x26be,0x26c4,0x26c5,0x26ce,0x26d4,0x26ea,0x26f2,0x26f3,0x26f5,0x26fa,0x26fd,0x2705,0x270a,0x270b,0x2728,0x274c,0x274e,0x2753,0x2755,0x2757,0x2795,0x2797,0x27b0,0x27bf,0x2b1b,0x2b1c,0x2b50,0x2b55,0x2e80,0x2e99,0x2e9b,0x2ef3,0x2f00,0x2fd5,0x2ff0,0x2ffb,0x3001,0x303e,0x3041,0x3096,0x3099,0x30ff,0x3105,0x312f,0x3131,0x318e,0x3190,0x31e3,0x31f0,0x321e,0x3220,0x3247,0x3250,0x4dbf,0x4e00,0xa48c,0xa490,0xa4c6,0xa960,0xa97c,0xac00,0xd7a3,0xf900,0xfaff,0xfe10,0xfe19,0xfe30,0xfe52,0xfe54,0xfe66,0xfe68,0xfe6b,0x16fe0,0x16fe4,0x16ff0,0x16ff1,0x17000,0x187f7,0x18800,0x18cd5,0x18d00,0x18d08,0x1b000,0x1b11e,0x1b150,0x1b152,0x1b164,0x1b167,0x1b170,0x1b2fb,0x1f004,0x1f0cf,0x1f18e,0x1f191,0x1f19a,0x1f200,0x1f202,0x1f210,0x1f23b,0x1f240,0x1f248,0x1f250,0x1f251,0x1f260,0x1f265,0x1f300,0x1f320,0x1f32d,0x1f335,0x1f337,0x1f37c,0x1f37e,0x1f393,0x1f3a0,0x1f3ca,0x1f3cf,0x1f3d3,0x1f3e0,0x1f3f0,0x1f3f4,0x1f3f8,0x1f43e,0x1f440,0x1f442,0x1f4fc,0x1f4ff,0x1f53d,0x1f54b,0x1f54e,0x1f550,0x1f567,0x1f57a,0x1f595,0x1f596,0x1f5a4,0x1f5fb,0x1f64f,0x1f680,0x1f6c5,0x1f6cc,0x1f6d0,0x1f6d2,0x1f6d5,0x1f6d7,0x1f6eb,0x1f6ec,0x1f6f4,0x1f6fc,0x1f7e0,0x1f7eb,0x1f90c,0x1f93a,0x1f93c,0x1f945,0x1f947,0x1f978,0x1f97a,0x1f9cb,0x1f9cd,0x1f9ff,0x1fa70,0x1fa74,0x1fa78,0x1fa7a,0x1fa80,0x1fa86,0x1fa90,0x1faa8,0x1fab0,0x1fab6,0x1fac0,0x1fac2,0x1fad0,0x1fad6,0x20000,0x2fffd,0x30000,0x3fffd, + 0x1100,0x231a,0x231b,0x2329,0x232a,0x23e9,0x23ec,0x23f0,0x23f3,0x25fd,0x25fe,0x2614,0x2615,0x2648,0x2653,0x267f,0x2693,0x26a1,0x26aa,0x26ab,0x26bd,0x26be,0x26c4,0x26c5,0x26ce,0x26d4,0x26ea,0x26f2,0x26f3,0x26f5,0x26fa,0x26fd,0x2705,0x270a,0x270b,0x2728,0x274c,0x274e,0x2753,0x2755,0x2757,0x2795,0x2797,0x27b0,0x27bf,0x2b1b,0x2b1c,0x2b50,0x2b55,0x2e80,0x2e99,0x2e9b,0x2ef3,0x2f00,0x2fd5,0x2ff0,0x2ffb,0x3001,0x303e,0x3041,0x3096,0x3099,0x30ff,0x3105,0x312f,0x3131,0x318e,0x3190,0x31e3,0x31f0,0x321e,0x3220,0x3247,0x3250,0x4dbf,0x4e00,0xa48c,0xa490,0xa4c6,0xa960,0xa97c,0xac00,0xd7a3,0xf900,0xfaff,0xfe10,0xfe19,0xfe30,0xfe52,0xfe54,0xfe66,0xfe68,0xfe6b,0x16fe0,0x16fe4,0x16ff0,0x16ff1,0x17000,0x187f7,0x18800,0x18cd5,0x18d00,0x18d08,0x1aff0,0x1aff3,0x1aff5,0x1affb,0x1affd,0x1affe,0x1b000,0x1b122,0x1b150,0x1b152,0x1b164,0x1b167,0x1b170,0x1b2fb,0x1f004,0x1f0cf,0x1f18e,0x1f191,0x1f19a,0x1f200,0x1f202,0x1f210,0x1f23b,0x1f240,0x1f248,0x1f250,0x1f251,0x1f260,0x1f265,0x1f300,0x1f320,0x1f32d,0x1f335,0x1f337,0x1f37c,0x1f37e,0x1f393,0x1f3a0,0x1f3ca,0x1f3cf,0x1f3d3,0x1f3e0,0x1f3f0,0x1f3f4,0x1f3f8,0x1f43e,0x1f440,0x1f442,0x1f4fc,0x1f4ff,0x1f53d,0x1f54b,0x1f54e,0x1f550,0x1f567,0x1f57a,0x1f595,0x1f596,0x1f5a4,0x1f5fb,0x1f64f,0x1f680,0x1f6c5,0x1f6cc,0x1f6d0,0x1f6d2,0x1f6d5,0x1f6d7,0x1f6dd,0x1f6df,0x1f6eb,0x1f6ec,0x1f6f4,0x1f6fc,0x1f7e0,0x1f7eb,0x1f7f0,0x1f90c,0x1f93a,0x1f93c,0x1f945,0x1f947,0x1f9ff,0x1fa70,0x1fa74,0x1fa78,0x1fa7c,0x1fa80,0x1fa86,0x1fa90,0x1faac,0x1fab0,0x1faba,0x1fac0,0x1fac5,0x1fad0,0x1fad9,0x1fae0,0x1fae7,0x1faf0,0x1faf6,0x20000,0x2fffd,0x30000,0x3fffd, ] let EastAsianWideEdgeUnicodeScalar: [UnicodeScalar] = EastAsianWideEdgeRawScalarValue.compactMap(UnicodeScalar.init) @@ -38,7 +38,7 @@ let EastAsianAmbiguousEdgeRawScalarValue: [UInt32] = [ let EastAsianAmbiguousEdgeUnicodeScalar: [UnicodeScalar] = EastAsianAmbiguousEdgeRawScalarValue.compactMap(UnicodeScalar.init) let EastAsianNeutralEdgeRawScalarValue: [UInt32] = [ - 0x0,0x7f,0xa0,0xa9,0xab,0xb5,0xbb,0xc0,0xc5,0xc7,0xcf,0xd1,0xd6,0xd9,0xdd,0xe2,0xe5,0xe7,0xeb,0xee,0xef,0xf1,0xf4,0xf6,0xfb,0xfd,0xff,0x100,0x102,0x110,0x112,0x114,0x11a,0x11c,0x125,0x128,0x12a,0x12c,0x130,0x134,0x137,0x139,0x13e,0x143,0x145,0x147,0x14c,0x14e,0x151,0x154,0x165,0x168,0x16a,0x16c,0x1cd,0x1cf,0x1d1,0x1d3,0x1d5,0x1d7,0x1d9,0x1db,0x1dd,0x250,0x252,0x260,0x262,0x2c3,0x2c5,0x2c6,0x2c8,0x2cc,0x2ce,0x2cf,0x2d1,0x2d7,0x2dc,0x2de,0x2e0,0x2ff,0x370,0x377,0x37a,0x37f,0x384,0x38a,0x38c,0x38e,0x390,0x3aa,0x3b0,0x3c2,0x3ca,0x400,0x402,0x40f,0x450,0x452,0x52f,0x531,0x556,0x559,0x58a,0x58d,0x58f,0x591,0x5c7,0x5d0,0x5ea,0x5ef,0x5f4,0x600,0x61c,0x61e,0x70d,0x70f,0x74a,0x74d,0x7b1,0x7c0,0x7fa,0x7fd,0x82d,0x830,0x83e,0x840,0x85b,0x85e,0x860,0x86a,0x8a0,0x8b4,0x8b6,0x8c7,0x8d3,0x983,0x985,0x98c,0x98f,0x990,0x993,0x9a8,0x9aa,0x9b0,0x9b2,0x9b6,0x9b9,0x9bc,0x9c4,0x9c7,0x9c8,0x9cb,0x9ce,0x9d7,0x9dc,0x9dd,0x9df,0x9e3,0x9e6,0x9fe,0xa01,0xa03,0xa05,0xa0a,0xa0f,0xa10,0xa13,0xa28,0xa2a,0xa30,0xa32,0xa33,0xa35,0xa36,0xa38,0xa39,0xa3c,0xa3e,0xa42,0xa47,0xa48,0xa4b,0xa4d,0xa51,0xa59,0xa5c,0xa5e,0xa66,0xa76,0xa81,0xa83,0xa85,0xa8d,0xa8f,0xa91,0xa93,0xaa8,0xaaa,0xab0,0xab2,0xab3,0xab5,0xab9,0xabc,0xac5,0xac7,0xac9,0xacb,0xacd,0xad0,0xae0,0xae3,0xae6,0xaf1,0xaf9,0xaff,0xb01,0xb03,0xb05,0xb0c,0xb0f,0xb10,0xb13,0xb28,0xb2a,0xb30,0xb32,0xb33,0xb35,0xb39,0xb3c,0xb44,0xb47,0xb48,0xb4b,0xb4d,0xb55,0xb57,0xb5c,0xb5d,0xb5f,0xb63,0xb66,0xb77,0xb82,0xb83,0xb85,0xb8a,0xb8e,0xb90,0xb92,0xb95,0xb99,0xb9a,0xb9c,0xb9e,0xb9f,0xba3,0xba4,0xba8,0xbaa,0xbae,0xbb9,0xbbe,0xbc2,0xbc6,0xbc8,0xbca,0xbcd,0xbd0,0xbd7,0xbe6,0xbfa,0xc00,0xc0c,0xc0e,0xc10,0xc12,0xc28,0xc2a,0xc39,0xc3d,0xc44,0xc46,0xc48,0xc4a,0xc4d,0xc55,0xc56,0xc58,0xc5a,0xc60,0xc63,0xc66,0xc6f,0xc77,0xc8c,0xc8e,0xc90,0xc92,0xca8,0xcaa,0xcb3,0xcb5,0xcb9,0xcbc,0xcc4,0xcc6,0xcc8,0xcca,0xccd,0xcd5,0xcd6,0xcde,0xce0,0xce3,0xce6,0xcef,0xcf1,0xcf2,0xd00,0xd0c,0xd0e,0xd10,0xd12,0xd44,0xd46,0xd48,0xd4a,0xd4f,0xd54,0xd63,0xd66,0xd7f,0xd81,0xd83,0xd85,0xd96,0xd9a,0xdb1,0xdb3,0xdbb,0xdbd,0xdc0,0xdc6,0xdca,0xdcf,0xdd4,0xdd6,0xdd8,0xddf,0xde6,0xdef,0xdf2,0xdf4,0xe01,0xe3a,0xe3f,0xe5b,0xe81,0xe82,0xe84,0xe86,0xe8a,0xe8c,0xea3,0xea5,0xea7,0xebd,0xec0,0xec4,0xec6,0xec8,0xecd,0xed0,0xed9,0xedc,0xedf,0xf00,0xf47,0xf49,0xf6c,0xf71,0xf97,0xf99,0xfbc,0xfbe,0xfcc,0xfce,0xfda,0x1000,0x10c5,0x10c7,0x10cd,0x10d0,0x10ff,0x1160,0x1248,0x124a,0x124d,0x1250,0x1256,0x1258,0x125a,0x125d,0x1260,0x1288,0x128a,0x128d,0x1290,0x12b0,0x12b2,0x12b5,0x12b8,0x12be,0x12c0,0x12c2,0x12c5,0x12c8,0x12d6,0x12d8,0x1310,0x1312,0x1315,0x1318,0x135a,0x135d,0x137c,0x1380,0x1399,0x13a0,0x13f5,0x13f8,0x13fd,0x1400,0x169c,0x16a0,0x16f8,0x1700,0x170c,0x170e,0x1714,0x1720,0x1736,0x1740,0x1753,0x1760,0x176c,0x176e,0x1770,0x1772,0x1773,0x1780,0x17dd,0x17e0,0x17e9,0x17f0,0x17f9,0x1800,0x180e,0x1810,0x1819,0x1820,0x1878,0x1880,0x18aa,0x18b0,0x18f5,0x1900,0x191e,0x1920,0x192b,0x1930,0x193b,0x1940,0x1944,0x196d,0x1970,0x1974,0x1980,0x19ab,0x19b0,0x19c9,0x19d0,0x19da,0x19de,0x1a1b,0x1a1e,0x1a5e,0x1a60,0x1a7c,0x1a7f,0x1a89,0x1a90,0x1a99,0x1aa0,0x1aad,0x1ab0,0x1ac0,0x1b00,0x1b4b,0x1b50,0x1b7c,0x1b80,0x1bf3,0x1bfc,0x1c37,0x1c3b,0x1c49,0x1c4d,0x1c88,0x1c90,0x1cba,0x1cbd,0x1cc7,0x1cd0,0x1cfa,0x1d00,0x1df9,0x1dfb,0x1f15,0x1f18,0x1f1d,0x1f20,0x1f45,0x1f48,0x1f4d,0x1f50,0x1f57,0x1f59,0x1f5b,0x1f5d,0x1f5f,0x1f7d,0x1f80,0x1fb4,0x1fb6,0x1fc4,0x1fc6,0x1fd3,0x1fd6,0x1fdb,0x1fdd,0x1fef,0x1ff2,0x1ff4,0x1ff6,0x1ffe,0x2000,0x200f,0x2011,0x2012,0x2017,0x201a,0x201b,0x201e,0x201f,0x2023,0x2028,0x202f,0x2031,0x2034,0x2036,0x203a,0x203c,0x203d,0x203f,0x2064,0x2066,0x2071,0x2075,0x207e,0x2080,0x2085,0x208e,0x2090,0x209c,0x20a0,0x20a8,0x20aa,0x20ab,0x20ad,0x20bf,0x20d0,0x20f0,0x2100,0x2102,0x2104,0x2106,0x2108,0x210a,0x2112,0x2114,0x2115,0x2117,0x2120,0x2123,0x2125,0x2127,0x212a,0x212c,0x2152,0x2155,0x215a,0x215f,0x216c,0x216f,0x217a,0x2188,0x218a,0x218b,0x219a,0x21b7,0x21ba,0x21d1,0x21d3,0x21d5,0x21e6,0x21e8,0x21ff,0x2201,0x2204,0x2206,0x2209,0x220a,0x220c,0x220e,0x2210,0x2212,0x2214,0x2216,0x2219,0x221b,0x221c,0x2221,0x2222,0x2224,0x2226,0x222d,0x222f,0x2233,0x2238,0x223b,0x223e,0x2247,0x2249,0x224b,0x224d,0x2251,0x2253,0x225f,0x2262,0x2263,0x2268,0x2269,0x226c,0x226d,0x2270,0x2281,0x2284,0x2285,0x2288,0x2294,0x2296,0x2298,0x229a,0x22a4,0x22a6,0x22be,0x22c0,0x2311,0x2313,0x2319,0x231c,0x2328,0x232b,0x23e8,0x23ed,0x23ef,0x23f1,0x23f2,0x23f4,0x2426,0x2440,0x244a,0x24ea,0x254c,0x254f,0x2574,0x257f,0x2590,0x2591,0x2596,0x259f,0x25a2,0x25aa,0x25b1,0x25b4,0x25b5,0x25b8,0x25bb,0x25be,0x25bf,0x25c2,0x25c5,0x25c9,0x25ca,0x25cc,0x25cd,0x25d2,0x25e1,0x25e6,0x25ee,0x25f0,0x25fc,0x25ff,0x2604,0x2607,0x2608,0x260a,0x260d,0x2610,0x2613,0x2616,0x261b,0x261d,0x261f,0x263f,0x2641,0x2643,0x2647,0x2654,0x265f,0x2662,0x2666,0x266b,0x266e,0x2670,0x267e,0x2680,0x2692,0x2694,0x269d,0x26a0,0x26a2,0x26a9,0x26ac,0x26bc,0x26c0,0x26c3,0x26e2,0x26e4,0x26e7,0x2700,0x2704,0x2706,0x2709,0x270c,0x2727,0x2729,0x273c,0x273e,0x274b,0x274d,0x274f,0x2752,0x2756,0x2758,0x2775,0x2780,0x2794,0x2798,0x27af,0x27b1,0x27be,0x27c0,0x27e5,0x27ee,0x2984,0x2987,0x2b1a,0x2b1d,0x2b4f,0x2b51,0x2b54,0x2b5a,0x2b73,0x2b76,0x2b95,0x2b97,0x2c2e,0x2c30,0x2c5e,0x2c60,0x2cf3,0x2cf9,0x2d25,0x2d27,0x2d2d,0x2d30,0x2d67,0x2d6f,0x2d70,0x2d7f,0x2d96,0x2da0,0x2da6,0x2da8,0x2dae,0x2db0,0x2db6,0x2db8,0x2dbe,0x2dc0,0x2dc6,0x2dc8,0x2dce,0x2dd0,0x2dd6,0x2dd8,0x2dde,0x2de0,0x2e52,0x303f,0x4dc0,0x4dff,0xa4d0,0xa62b,0xa640,0xa6f7,0xa700,0xa7bf,0xa7c2,0xa7ca,0xa7f5,0xa82c,0xa830,0xa839,0xa840,0xa877,0xa880,0xa8c5,0xa8ce,0xa8d9,0xa8e0,0xa953,0xa95f,0xa980,0xa9cd,0xa9cf,0xa9d9,0xa9de,0xa9fe,0xaa00,0xaa36,0xaa40,0xaa4d,0xaa50,0xaa59,0xaa5c,0xaac2,0xaadb,0xaaf6,0xab01,0xab06,0xab09,0xab0e,0xab11,0xab16,0xab20,0xab26,0xab28,0xab2e,0xab30,0xab6b,0xab70,0xabed,0xabf0,0xabf9,0xd7b0,0xd7c6,0xd7cb,0xd7fb,0xd800,0xdfff,0xfb00,0xfb06,0xfb13,0xfb17,0xfb1d,0xfb36,0xfb38,0xfb3c,0xfb3e,0xfb40,0xfb41,0xfb43,0xfb44,0xfb46,0xfbc1,0xfbd3,0xfd3f,0xfd50,0xfd8f,0xfd92,0xfdc7,0xfdf0,0xfdfd,0xfe20,0xfe2f,0xfe70,0xfe74,0xfe76,0xfefc,0xfeff,0xfff9,0xfffc,0x10000,0x1000b,0x1000d,0x10026,0x10028,0x1003a,0x1003c,0x1003d,0x1003f,0x1004d,0x10050,0x1005d,0x10080,0x100fa,0x10100,0x10102,0x10107,0x10133,0x10137,0x1018e,0x10190,0x1019c,0x101a0,0x101d0,0x101fd,0x10280,0x1029c,0x102a0,0x102d0,0x102e0,0x102fb,0x10300,0x10323,0x1032d,0x1034a,0x10350,0x1037a,0x10380,0x1039d,0x1039f,0x103c3,0x103c8,0x103d5,0x10400,0x1049d,0x104a0,0x104a9,0x104b0,0x104d3,0x104d8,0x104fb,0x10500,0x10527,0x10530,0x10563,0x1056f,0x10600,0x10736,0x10740,0x10755,0x10760,0x10767,0x10800,0x10805,0x10808,0x1080a,0x10835,0x10837,0x10838,0x1083c,0x1083f,0x10855,0x10857,0x1089e,0x108a7,0x108af,0x108e0,0x108f2,0x108f4,0x108f5,0x108fb,0x1091b,0x1091f,0x10939,0x1093f,0x10980,0x109b7,0x109bc,0x109cf,0x109d2,0x10a03,0x10a05,0x10a06,0x10a0c,0x10a13,0x10a15,0x10a17,0x10a19,0x10a35,0x10a38,0x10a3a,0x10a3f,0x10a48,0x10a50,0x10a58,0x10a60,0x10a9f,0x10ac0,0x10ae6,0x10aeb,0x10af6,0x10b00,0x10b35,0x10b39,0x10b55,0x10b58,0x10b72,0x10b78,0x10b91,0x10b99,0x10b9c,0x10ba9,0x10baf,0x10c00,0x10c48,0x10c80,0x10cb2,0x10cc0,0x10cf2,0x10cfa,0x10d27,0x10d30,0x10d39,0x10e60,0x10e7e,0x10e80,0x10ea9,0x10eab,0x10ead,0x10eb0,0x10eb1,0x10f00,0x10f27,0x10f30,0x10f59,0x10fb0,0x10fcb,0x10fe0,0x10ff6,0x11000,0x1104d,0x11052,0x1106f,0x1107f,0x110c1,0x110cd,0x110d0,0x110e8,0x110f0,0x110f9,0x11100,0x11134,0x11136,0x11147,0x11150,0x11176,0x11180,0x111df,0x111e1,0x111f4,0x11200,0x11211,0x11213,0x1123e,0x11280,0x11286,0x11288,0x1128a,0x1128d,0x1128f,0x1129d,0x1129f,0x112a9,0x112b0,0x112ea,0x112f0,0x112f9,0x11300,0x11303,0x11305,0x1130c,0x1130f,0x11310,0x11313,0x11328,0x1132a,0x11330,0x11332,0x11333,0x11335,0x11339,0x1133b,0x11344,0x11347,0x11348,0x1134b,0x1134d,0x11350,0x11357,0x1135d,0x11363,0x11366,0x1136c,0x11370,0x11374,0x11400,0x1145b,0x1145d,0x11461,0x11480,0x114c7,0x114d0,0x114d9,0x11580,0x115b5,0x115b8,0x115dd,0x11600,0x11644,0x11650,0x11659,0x11660,0x1166c,0x11680,0x116b8,0x116c0,0x116c9,0x11700,0x1171a,0x1171d,0x1172b,0x11730,0x1173f,0x11800,0x1183b,0x118a0,0x118f2,0x118ff,0x11906,0x11909,0x1190c,0x11913,0x11915,0x11916,0x11918,0x11935,0x11937,0x11938,0x1193b,0x11946,0x11950,0x11959,0x119a0,0x119a7,0x119aa,0x119d7,0x119da,0x119e4,0x11a00,0x11a47,0x11a50,0x11aa2,0x11ac0,0x11af8,0x11c00,0x11c08,0x11c0a,0x11c36,0x11c38,0x11c45,0x11c50,0x11c6c,0x11c70,0x11c8f,0x11c92,0x11ca7,0x11ca9,0x11cb6,0x11d00,0x11d06,0x11d08,0x11d09,0x11d0b,0x11d36,0x11d3a,0x11d3c,0x11d3d,0x11d3f,0x11d47,0x11d50,0x11d59,0x11d60,0x11d65,0x11d67,0x11d68,0x11d6a,0x11d8e,0x11d90,0x11d91,0x11d93,0x11d98,0x11da0,0x11da9,0x11ee0,0x11ef8,0x11fb0,0x11fc0,0x11ff1,0x11fff,0x12399,0x12400,0x1246e,0x12470,0x12474,0x12480,0x12543,0x13000,0x1342e,0x13430,0x13438,0x14400,0x14646,0x16800,0x16a38,0x16a40,0x16a5e,0x16a60,0x16a69,0x16a6e,0x16a6f,0x16ad0,0x16aed,0x16af0,0x16af5,0x16b00,0x16b45,0x16b50,0x16b59,0x16b5b,0x16b61,0x16b63,0x16b77,0x16b7d,0x16b8f,0x16e40,0x16e9a,0x16f00,0x16f4a,0x16f4f,0x16f87,0x16f8f,0x16f9f,0x1bc00,0x1bc6a,0x1bc70,0x1bc7c,0x1bc80,0x1bc88,0x1bc90,0x1bc99,0x1bc9c,0x1bca3,0x1d000,0x1d0f5,0x1d100,0x1d126,0x1d129,0x1d1e8,0x1d200,0x1d245,0x1d2e0,0x1d2f3,0x1d300,0x1d356,0x1d360,0x1d378,0x1d400,0x1d454,0x1d456,0x1d49c,0x1d49e,0x1d49f,0x1d4a2,0x1d4a5,0x1d4a6,0x1d4a9,0x1d4ac,0x1d4ae,0x1d4b9,0x1d4bb,0x1d4bd,0x1d4c3,0x1d4c5,0x1d505,0x1d507,0x1d50a,0x1d50d,0x1d514,0x1d516,0x1d51c,0x1d51e,0x1d539,0x1d53b,0x1d53e,0x1d540,0x1d544,0x1d546,0x1d54a,0x1d550,0x1d552,0x1d6a5,0x1d6a8,0x1d7cb,0x1d7ce,0x1da8b,0x1da9b,0x1da9f,0x1daa1,0x1daaf,0x1e000,0x1e006,0x1e008,0x1e018,0x1e01b,0x1e021,0x1e023,0x1e024,0x1e026,0x1e02a,0x1e100,0x1e12c,0x1e130,0x1e13d,0x1e140,0x1e149,0x1e14e,0x1e14f,0x1e2c0,0x1e2f9,0x1e2ff,0x1e800,0x1e8c4,0x1e8c7,0x1e8d6,0x1e900,0x1e94b,0x1e950,0x1e959,0x1e95e,0x1e95f,0x1ec71,0x1ecb4,0x1ed01,0x1ed3d,0x1ee00,0x1ee03,0x1ee05,0x1ee1f,0x1ee21,0x1ee22,0x1ee24,0x1ee27,0x1ee29,0x1ee32,0x1ee34,0x1ee37,0x1ee39,0x1ee3b,0x1ee42,0x1ee47,0x1ee49,0x1ee4b,0x1ee4d,0x1ee4f,0x1ee51,0x1ee52,0x1ee54,0x1ee57,0x1ee59,0x1ee5b,0x1ee5d,0x1ee5f,0x1ee61,0x1ee62,0x1ee64,0x1ee67,0x1ee6a,0x1ee6c,0x1ee72,0x1ee74,0x1ee77,0x1ee79,0x1ee7c,0x1ee7e,0x1ee80,0x1ee89,0x1ee8b,0x1ee9b,0x1eea1,0x1eea3,0x1eea5,0x1eea9,0x1eeab,0x1eebb,0x1eef0,0x1eef1,0x1f000,0x1f003,0x1f005,0x1f02b,0x1f030,0x1f093,0x1f0a0,0x1f0ae,0x1f0b1,0x1f0bf,0x1f0c1,0x1f0ce,0x1f0d1,0x1f0f5,0x1f10b,0x1f10f,0x1f12e,0x1f12f,0x1f16a,0x1f16f,0x1f1ad,0x1f1e6,0x1f1ff,0x1f321,0x1f32c,0x1f336,0x1f37d,0x1f394,0x1f39f,0x1f3cb,0x1f3ce,0x1f3d4,0x1f3df,0x1f3f1,0x1f3f3,0x1f3f5,0x1f3f7,0x1f43f,0x1f441,0x1f4fd,0x1f4fe,0x1f53e,0x1f54a,0x1f54f,0x1f568,0x1f579,0x1f57b,0x1f594,0x1f597,0x1f5a3,0x1f5a5,0x1f5fa,0x1f650,0x1f67f,0x1f6c6,0x1f6cb,0x1f6cd,0x1f6cf,0x1f6d3,0x1f6d4,0x1f6e0,0x1f6ea,0x1f6f0,0x1f6f3,0x1f700,0x1f773,0x1f780,0x1f7d8,0x1f800,0x1f80b,0x1f810,0x1f847,0x1f850,0x1f859,0x1f860,0x1f887,0x1f890,0x1f8ad,0x1f8b0,0x1f8b1,0x1f900,0x1f90b,0x1f93b,0x1f946,0x1fa00,0x1fa53,0x1fa60,0x1fa6d,0x1fb00,0x1fb92,0x1fb94,0x1fbca,0x1fbf0,0x1fbf9,0xe0001,0xe0020,0xe007f, + 0x0,0x7f,0xa0,0xa9,0xab,0xb5,0xbb,0xc0,0xc5,0xc7,0xcf,0xd1,0xd6,0xd9,0xdd,0xe2,0xe5,0xe7,0xeb,0xee,0xef,0xf1,0xf4,0xf6,0xfb,0xfd,0xff,0x100,0x102,0x110,0x112,0x114,0x11a,0x11c,0x125,0x128,0x12a,0x12c,0x130,0x134,0x137,0x139,0x13e,0x143,0x145,0x147,0x14c,0x14e,0x151,0x154,0x165,0x168,0x16a,0x16c,0x1cd,0x1cf,0x1d1,0x1d3,0x1d5,0x1d7,0x1d9,0x1db,0x1dd,0x250,0x252,0x260,0x262,0x2c3,0x2c5,0x2c6,0x2c8,0x2cc,0x2ce,0x2cf,0x2d1,0x2d7,0x2dc,0x2de,0x2e0,0x2ff,0x370,0x377,0x37a,0x37f,0x384,0x38a,0x38c,0x38e,0x390,0x3aa,0x3b0,0x3c2,0x3ca,0x400,0x402,0x40f,0x450,0x452,0x52f,0x531,0x556,0x559,0x58a,0x58d,0x58f,0x591,0x5c7,0x5d0,0x5ea,0x5ef,0x5f4,0x600,0x70d,0x70f,0x74a,0x74d,0x7b1,0x7c0,0x7fa,0x7fd,0x82d,0x830,0x83e,0x840,0x85b,0x85e,0x860,0x86a,0x870,0x88e,0x890,0x891,0x898,0x983,0x985,0x98c,0x98f,0x990,0x993,0x9a8,0x9aa,0x9b0,0x9b2,0x9b6,0x9b9,0x9bc,0x9c4,0x9c7,0x9c8,0x9cb,0x9ce,0x9d7,0x9dc,0x9dd,0x9df,0x9e3,0x9e6,0x9fe,0xa01,0xa03,0xa05,0xa0a,0xa0f,0xa10,0xa13,0xa28,0xa2a,0xa30,0xa32,0xa33,0xa35,0xa36,0xa38,0xa39,0xa3c,0xa3e,0xa42,0xa47,0xa48,0xa4b,0xa4d,0xa51,0xa59,0xa5c,0xa5e,0xa66,0xa76,0xa81,0xa83,0xa85,0xa8d,0xa8f,0xa91,0xa93,0xaa8,0xaaa,0xab0,0xab2,0xab3,0xab5,0xab9,0xabc,0xac5,0xac7,0xac9,0xacb,0xacd,0xad0,0xae0,0xae3,0xae6,0xaf1,0xaf9,0xaff,0xb01,0xb03,0xb05,0xb0c,0xb0f,0xb10,0xb13,0xb28,0xb2a,0xb30,0xb32,0xb33,0xb35,0xb39,0xb3c,0xb44,0xb47,0xb48,0xb4b,0xb4d,0xb55,0xb57,0xb5c,0xb5d,0xb5f,0xb63,0xb66,0xb77,0xb82,0xb83,0xb85,0xb8a,0xb8e,0xb90,0xb92,0xb95,0xb99,0xb9a,0xb9c,0xb9e,0xb9f,0xba3,0xba4,0xba8,0xbaa,0xbae,0xbb9,0xbbe,0xbc2,0xbc6,0xbc8,0xbca,0xbcd,0xbd0,0xbd7,0xbe6,0xbfa,0xc00,0xc0c,0xc0e,0xc10,0xc12,0xc28,0xc2a,0xc39,0xc3c,0xc44,0xc46,0xc48,0xc4a,0xc4d,0xc55,0xc56,0xc58,0xc5a,0xc5d,0xc60,0xc63,0xc66,0xc6f,0xc77,0xc8c,0xc8e,0xc90,0xc92,0xca8,0xcaa,0xcb3,0xcb5,0xcb9,0xcbc,0xcc4,0xcc6,0xcc8,0xcca,0xccd,0xcd5,0xcd6,0xcdd,0xcde,0xce0,0xce3,0xce6,0xcef,0xcf1,0xcf2,0xd00,0xd0c,0xd0e,0xd10,0xd12,0xd44,0xd46,0xd48,0xd4a,0xd4f,0xd54,0xd63,0xd66,0xd7f,0xd81,0xd83,0xd85,0xd96,0xd9a,0xdb1,0xdb3,0xdbb,0xdbd,0xdc0,0xdc6,0xdca,0xdcf,0xdd4,0xdd6,0xdd8,0xddf,0xde6,0xdef,0xdf2,0xdf4,0xe01,0xe3a,0xe3f,0xe5b,0xe81,0xe82,0xe84,0xe86,0xe8a,0xe8c,0xea3,0xea5,0xea7,0xebd,0xec0,0xec4,0xec6,0xec8,0xecd,0xed0,0xed9,0xedc,0xedf,0xf00,0xf47,0xf49,0xf6c,0xf71,0xf97,0xf99,0xfbc,0xfbe,0xfcc,0xfce,0xfda,0x1000,0x10c5,0x10c7,0x10cd,0x10d0,0x10ff,0x1160,0x1248,0x124a,0x124d,0x1250,0x1256,0x1258,0x125a,0x125d,0x1260,0x1288,0x128a,0x128d,0x1290,0x12b0,0x12b2,0x12b5,0x12b8,0x12be,0x12c0,0x12c2,0x12c5,0x12c8,0x12d6,0x12d8,0x1310,0x1312,0x1315,0x1318,0x135a,0x135d,0x137c,0x1380,0x1399,0x13a0,0x13f5,0x13f8,0x13fd,0x1400,0x169c,0x16a0,0x16f8,0x1700,0x1715,0x171f,0x1736,0x1740,0x1753,0x1760,0x176c,0x176e,0x1770,0x1772,0x1773,0x1780,0x17dd,0x17e0,0x17e9,0x17f0,0x17f9,0x1800,0x1819,0x1820,0x1878,0x1880,0x18aa,0x18b0,0x18f5,0x1900,0x191e,0x1920,0x192b,0x1930,0x193b,0x1940,0x1944,0x196d,0x1970,0x1974,0x1980,0x19ab,0x19b0,0x19c9,0x19d0,0x19da,0x19de,0x1a1b,0x1a1e,0x1a5e,0x1a60,0x1a7c,0x1a7f,0x1a89,0x1a90,0x1a99,0x1aa0,0x1aad,0x1ab0,0x1ace,0x1b00,0x1b4c,0x1b50,0x1b7e,0x1b80,0x1bf3,0x1bfc,0x1c37,0x1c3b,0x1c49,0x1c4d,0x1c88,0x1c90,0x1cba,0x1cbd,0x1cc7,0x1cd0,0x1cfa,0x1d00,0x1f15,0x1f18,0x1f1d,0x1f20,0x1f45,0x1f48,0x1f4d,0x1f50,0x1f57,0x1f59,0x1f5b,0x1f5d,0x1f5f,0x1f7d,0x1f80,0x1fb4,0x1fb6,0x1fc4,0x1fc6,0x1fd3,0x1fd6,0x1fdb,0x1fdd,0x1fef,0x1ff2,0x1ff4,0x1ff6,0x1ffe,0x2000,0x200f,0x2011,0x2012,0x2017,0x201a,0x201b,0x201e,0x201f,0x2023,0x2028,0x202f,0x2031,0x2034,0x2036,0x203a,0x203c,0x203d,0x203f,0x2064,0x2066,0x2071,0x2075,0x207e,0x2080,0x2085,0x208e,0x2090,0x209c,0x20a0,0x20a8,0x20aa,0x20ab,0x20ad,0x20c0,0x20d0,0x20f0,0x2100,0x2102,0x2104,0x2106,0x2108,0x210a,0x2112,0x2114,0x2115,0x2117,0x2120,0x2123,0x2125,0x2127,0x212a,0x212c,0x2152,0x2155,0x215a,0x215f,0x216c,0x216f,0x217a,0x2188,0x218a,0x218b,0x219a,0x21b7,0x21ba,0x21d1,0x21d3,0x21d5,0x21e6,0x21e8,0x21ff,0x2201,0x2204,0x2206,0x2209,0x220a,0x220c,0x220e,0x2210,0x2212,0x2214,0x2216,0x2219,0x221b,0x221c,0x2221,0x2222,0x2224,0x2226,0x222d,0x222f,0x2233,0x2238,0x223b,0x223e,0x2247,0x2249,0x224b,0x224d,0x2251,0x2253,0x225f,0x2262,0x2263,0x2268,0x2269,0x226c,0x226d,0x2270,0x2281,0x2284,0x2285,0x2288,0x2294,0x2296,0x2298,0x229a,0x22a4,0x22a6,0x22be,0x22c0,0x2311,0x2313,0x2319,0x231c,0x2328,0x232b,0x23e8,0x23ed,0x23ef,0x23f1,0x23f2,0x23f4,0x2426,0x2440,0x244a,0x24ea,0x254c,0x254f,0x2574,0x257f,0x2590,0x2591,0x2596,0x259f,0x25a2,0x25aa,0x25b1,0x25b4,0x25b5,0x25b8,0x25bb,0x25be,0x25bf,0x25c2,0x25c5,0x25c9,0x25ca,0x25cc,0x25cd,0x25d2,0x25e1,0x25e6,0x25ee,0x25f0,0x25fc,0x25ff,0x2604,0x2607,0x2608,0x260a,0x260d,0x2610,0x2613,0x2616,0x261b,0x261d,0x261f,0x263f,0x2641,0x2643,0x2647,0x2654,0x265f,0x2662,0x2666,0x266b,0x266e,0x2670,0x267e,0x2680,0x2692,0x2694,0x269d,0x26a0,0x26a2,0x26a9,0x26ac,0x26bc,0x26c0,0x26c3,0x26e2,0x26e4,0x26e7,0x2700,0x2704,0x2706,0x2709,0x270c,0x2727,0x2729,0x273c,0x273e,0x274b,0x274d,0x274f,0x2752,0x2756,0x2758,0x2775,0x2780,0x2794,0x2798,0x27af,0x27b1,0x27be,0x27c0,0x27e5,0x27ee,0x2984,0x2987,0x2b1a,0x2b1d,0x2b4f,0x2b51,0x2b54,0x2b5a,0x2b73,0x2b76,0x2b95,0x2b97,0x2cf3,0x2cf9,0x2d25,0x2d27,0x2d2d,0x2d30,0x2d67,0x2d6f,0x2d70,0x2d7f,0x2d96,0x2da0,0x2da6,0x2da8,0x2dae,0x2db0,0x2db6,0x2db8,0x2dbe,0x2dc0,0x2dc6,0x2dc8,0x2dce,0x2dd0,0x2dd6,0x2dd8,0x2dde,0x2de0,0x2e5d,0x303f,0x4dc0,0x4dff,0xa4d0,0xa62b,0xa640,0xa6f7,0xa700,0xa7ca,0xa7d0,0xa7d1,0xa7d3,0xa7d5,0xa7d9,0xa7f2,0xa82c,0xa830,0xa839,0xa840,0xa877,0xa880,0xa8c5,0xa8ce,0xa8d9,0xa8e0,0xa953,0xa95f,0xa980,0xa9cd,0xa9cf,0xa9d9,0xa9de,0xa9fe,0xaa00,0xaa36,0xaa40,0xaa4d,0xaa50,0xaa59,0xaa5c,0xaac2,0xaadb,0xaaf6,0xab01,0xab06,0xab09,0xab0e,0xab11,0xab16,0xab20,0xab26,0xab28,0xab2e,0xab30,0xab6b,0xab70,0xabed,0xabf0,0xabf9,0xd7b0,0xd7c6,0xd7cb,0xd7fb,0xd800,0xdfff,0xfb00,0xfb06,0xfb13,0xfb17,0xfb1d,0xfb36,0xfb38,0xfb3c,0xfb3e,0xfb40,0xfb41,0xfb43,0xfb44,0xfb46,0xfbc2,0xfbd3,0xfd8f,0xfd92,0xfdc7,0xfdcf,0xfdf0,0xfdff,0xfe20,0xfe2f,0xfe70,0xfe74,0xfe76,0xfefc,0xfeff,0xfff9,0xfffc,0x10000,0x1000b,0x1000d,0x10026,0x10028,0x1003a,0x1003c,0x1003d,0x1003f,0x1004d,0x10050,0x1005d,0x10080,0x100fa,0x10100,0x10102,0x10107,0x10133,0x10137,0x1018e,0x10190,0x1019c,0x101a0,0x101d0,0x101fd,0x10280,0x1029c,0x102a0,0x102d0,0x102e0,0x102fb,0x10300,0x10323,0x1032d,0x1034a,0x10350,0x1037a,0x10380,0x1039d,0x1039f,0x103c3,0x103c8,0x103d5,0x10400,0x1049d,0x104a0,0x104a9,0x104b0,0x104d3,0x104d8,0x104fb,0x10500,0x10527,0x10530,0x10563,0x1056f,0x1057a,0x1057c,0x1058a,0x1058c,0x10592,0x10594,0x10595,0x10597,0x105a1,0x105a3,0x105b1,0x105b3,0x105b9,0x105bb,0x105bc,0x10600,0x10736,0x10740,0x10755,0x10760,0x10767,0x10780,0x10785,0x10787,0x107b0,0x107b2,0x107ba,0x10800,0x10805,0x10808,0x1080a,0x10835,0x10837,0x10838,0x1083c,0x1083f,0x10855,0x10857,0x1089e,0x108a7,0x108af,0x108e0,0x108f2,0x108f4,0x108f5,0x108fb,0x1091b,0x1091f,0x10939,0x1093f,0x10980,0x109b7,0x109bc,0x109cf,0x109d2,0x10a03,0x10a05,0x10a06,0x10a0c,0x10a13,0x10a15,0x10a17,0x10a19,0x10a35,0x10a38,0x10a3a,0x10a3f,0x10a48,0x10a50,0x10a58,0x10a60,0x10a9f,0x10ac0,0x10ae6,0x10aeb,0x10af6,0x10b00,0x10b35,0x10b39,0x10b55,0x10b58,0x10b72,0x10b78,0x10b91,0x10b99,0x10b9c,0x10ba9,0x10baf,0x10c00,0x10c48,0x10c80,0x10cb2,0x10cc0,0x10cf2,0x10cfa,0x10d27,0x10d30,0x10d39,0x10e60,0x10e7e,0x10e80,0x10ea9,0x10eab,0x10ead,0x10eb0,0x10eb1,0x10f00,0x10f27,0x10f30,0x10f59,0x10f70,0x10f89,0x10fb0,0x10fcb,0x10fe0,0x10ff6,0x11000,0x1104d,0x11052,0x11075,0x1107f,0x110c2,0x110cd,0x110d0,0x110e8,0x110f0,0x110f9,0x11100,0x11134,0x11136,0x11147,0x11150,0x11176,0x11180,0x111df,0x111e1,0x111f4,0x11200,0x11211,0x11213,0x1123e,0x11280,0x11286,0x11288,0x1128a,0x1128d,0x1128f,0x1129d,0x1129f,0x112a9,0x112b0,0x112ea,0x112f0,0x112f9,0x11300,0x11303,0x11305,0x1130c,0x1130f,0x11310,0x11313,0x11328,0x1132a,0x11330,0x11332,0x11333,0x11335,0x11339,0x1133b,0x11344,0x11347,0x11348,0x1134b,0x1134d,0x11350,0x11357,0x1135d,0x11363,0x11366,0x1136c,0x11370,0x11374,0x11400,0x1145b,0x1145d,0x11461,0x11480,0x114c7,0x114d0,0x114d9,0x11580,0x115b5,0x115b8,0x115dd,0x11600,0x11644,0x11650,0x11659,0x11660,0x1166c,0x11680,0x116b9,0x116c0,0x116c9,0x11700,0x1171a,0x1171d,0x1172b,0x11730,0x11746,0x11800,0x1183b,0x118a0,0x118f2,0x118ff,0x11906,0x11909,0x1190c,0x11913,0x11915,0x11916,0x11918,0x11935,0x11937,0x11938,0x1193b,0x11946,0x11950,0x11959,0x119a0,0x119a7,0x119aa,0x119d7,0x119da,0x119e4,0x11a00,0x11a47,0x11a50,0x11aa2,0x11ab0,0x11af8,0x11c00,0x11c08,0x11c0a,0x11c36,0x11c38,0x11c45,0x11c50,0x11c6c,0x11c70,0x11c8f,0x11c92,0x11ca7,0x11ca9,0x11cb6,0x11d00,0x11d06,0x11d08,0x11d09,0x11d0b,0x11d36,0x11d3a,0x11d3c,0x11d3d,0x11d3f,0x11d47,0x11d50,0x11d59,0x11d60,0x11d65,0x11d67,0x11d68,0x11d6a,0x11d8e,0x11d90,0x11d91,0x11d93,0x11d98,0x11da0,0x11da9,0x11ee0,0x11ef8,0x11fb0,0x11fc0,0x11ff1,0x11fff,0x12399,0x12400,0x1246e,0x12470,0x12474,0x12480,0x12543,0x12f90,0x12ff2,0x13000,0x1342e,0x13430,0x13438,0x14400,0x14646,0x16800,0x16a38,0x16a40,0x16a5e,0x16a60,0x16a69,0x16a6e,0x16abe,0x16ac0,0x16ac9,0x16ad0,0x16aed,0x16af0,0x16af5,0x16b00,0x16b45,0x16b50,0x16b59,0x16b5b,0x16b61,0x16b63,0x16b77,0x16b7d,0x16b8f,0x16e40,0x16e9a,0x16f00,0x16f4a,0x16f4f,0x16f87,0x16f8f,0x16f9f,0x1bc00,0x1bc6a,0x1bc70,0x1bc7c,0x1bc80,0x1bc88,0x1bc90,0x1bc99,0x1bc9c,0x1bca3,0x1cf00,0x1cf2d,0x1cf30,0x1cf46,0x1cf50,0x1cfc3,0x1d000,0x1d0f5,0x1d100,0x1d126,0x1d129,0x1d1ea,0x1d200,0x1d245,0x1d2e0,0x1d2f3,0x1d300,0x1d356,0x1d360,0x1d378,0x1d400,0x1d454,0x1d456,0x1d49c,0x1d49e,0x1d49f,0x1d4a2,0x1d4a5,0x1d4a6,0x1d4a9,0x1d4ac,0x1d4ae,0x1d4b9,0x1d4bb,0x1d4bd,0x1d4c3,0x1d4c5,0x1d505,0x1d507,0x1d50a,0x1d50d,0x1d514,0x1d516,0x1d51c,0x1d51e,0x1d539,0x1d53b,0x1d53e,0x1d540,0x1d544,0x1d546,0x1d54a,0x1d550,0x1d552,0x1d6a5,0x1d6a8,0x1d7cb,0x1d7ce,0x1da8b,0x1da9b,0x1da9f,0x1daa1,0x1daaf,0x1df00,0x1df1e,0x1e000,0x1e006,0x1e008,0x1e018,0x1e01b,0x1e021,0x1e023,0x1e024,0x1e026,0x1e02a,0x1e100,0x1e12c,0x1e130,0x1e13d,0x1e140,0x1e149,0x1e14e,0x1e14f,0x1e290,0x1e2ae,0x1e2c0,0x1e2f9,0x1e2ff,0x1e7e0,0x1e7e6,0x1e7e8,0x1e7eb,0x1e7ed,0x1e7ee,0x1e7f0,0x1e7fe,0x1e800,0x1e8c4,0x1e8c7,0x1e8d6,0x1e900,0x1e94b,0x1e950,0x1e959,0x1e95e,0x1e95f,0x1ec71,0x1ecb4,0x1ed01,0x1ed3d,0x1ee00,0x1ee03,0x1ee05,0x1ee1f,0x1ee21,0x1ee22,0x1ee24,0x1ee27,0x1ee29,0x1ee32,0x1ee34,0x1ee37,0x1ee39,0x1ee3b,0x1ee42,0x1ee47,0x1ee49,0x1ee4b,0x1ee4d,0x1ee4f,0x1ee51,0x1ee52,0x1ee54,0x1ee57,0x1ee59,0x1ee5b,0x1ee5d,0x1ee5f,0x1ee61,0x1ee62,0x1ee64,0x1ee67,0x1ee6a,0x1ee6c,0x1ee72,0x1ee74,0x1ee77,0x1ee79,0x1ee7c,0x1ee7e,0x1ee80,0x1ee89,0x1ee8b,0x1ee9b,0x1eea1,0x1eea3,0x1eea5,0x1eea9,0x1eeab,0x1eebb,0x1eef0,0x1eef1,0x1f000,0x1f003,0x1f005,0x1f02b,0x1f030,0x1f093,0x1f0a0,0x1f0ae,0x1f0b1,0x1f0bf,0x1f0c1,0x1f0ce,0x1f0d1,0x1f0f5,0x1f10b,0x1f10f,0x1f12e,0x1f12f,0x1f16a,0x1f16f,0x1f1ad,0x1f1e6,0x1f1ff,0x1f321,0x1f32c,0x1f336,0x1f37d,0x1f394,0x1f39f,0x1f3cb,0x1f3ce,0x1f3d4,0x1f3df,0x1f3f1,0x1f3f3,0x1f3f5,0x1f3f7,0x1f43f,0x1f441,0x1f4fd,0x1f4fe,0x1f53e,0x1f54a,0x1f54f,0x1f568,0x1f579,0x1f57b,0x1f594,0x1f597,0x1f5a3,0x1f5a5,0x1f5fa,0x1f650,0x1f67f,0x1f6c6,0x1f6cb,0x1f6cd,0x1f6cf,0x1f6d3,0x1f6d4,0x1f6e0,0x1f6ea,0x1f6f0,0x1f6f3,0x1f700,0x1f773,0x1f780,0x1f7d8,0x1f800,0x1f80b,0x1f810,0x1f847,0x1f850,0x1f859,0x1f860,0x1f887,0x1f890,0x1f8ad,0x1f8b0,0x1f8b1,0x1f900,0x1f90b,0x1f93b,0x1f946,0x1fa00,0x1fa53,0x1fa60,0x1fa6d,0x1fb00,0x1fb92,0x1fb94,0x1fbca,0x1fbf0,0x1fbf9,0xe0001,0xe0020,0xe007f, ] let EastAsianNeutralEdgeUnicodeScalar: [UnicodeScalar] = EastAsianNeutralEdgeRawScalarValue.compactMap(UnicodeScalar.init) diff --git a/Tests/EastAsianWidthTests/FullwidthTests.swift b/Tests/EastAsianWidthTests/FullwidthTests.swift index a2c5653..0152602 100644 --- a/Tests/EastAsianWidthTests/FullwidthTests.swift +++ b/Tests/EastAsianWidthTests/FullwidthTests.swift @@ -11,39 +11,60 @@ import EastAsianWidth // https://github.com/ukitaka/EastAsianWidth.swift/blob/master/Tests/EastAsianWidthTests/FullwidthTests.swift class FullwidthTests: XCTestCase { func testEdgeCases() { - EastAsianWideEdgeUnicodeScalar.forEach(AssertFullwidth) - EastAsianFullwidthEdgeUnicodeScalar.forEach(AssertFullwidth) - EastAsianWideEdgeUnicodeScalar.forEach(AssertFullwidthOrAmbiguous) - EastAsianFullwidthEdgeUnicodeScalar.forEach(AssertFullwidthOrAmbiguous) - EastAsianAmbiguousEdgeUnicodeScalar.forEach(AssertFullwidthOrAmbiguous) + EastAsianWideEdgeUnicodeScalar.forEach(testScalarFullwidth) + EastAsianFullwidthEdgeUnicodeScalar.forEach(testScalarFullwidth) + EastAsianWideEdgeUnicodeScalar.forEach(testScalarFullwidthOrAmbiguous) + EastAsianFullwidthEdgeUnicodeScalar.forEach(testScalarFullwidthOrAmbiguous) + EastAsianAmbiguousEdgeUnicodeScalar.forEach(testScalarFullwidthOrAmbiguous) } func testNonFullwidthCharacters() { - AssertNotFullwidth("Hello") - AssertNotFullwidthOrAmbiguous("Hello") + testStringNotFullwidth("ABCDE") + testStringNotFullwidth("。「」、") + testStringNotFullwidth("12345") + testStringNotFullwidth("アイウエオ") + testStringNotFullwidth("ᄀᄁᆪᄂ") } func testContainsFullwidth() { XCTAssertFalse("¡".containsFullwidthCharacters) - XCTAssertFalse("ABC".containsFullwidthCharacters) - XCTAssertTrue("ABC".containsFullwidthCharacters) + XCTAssertFalse("ABCDEabcde".containsFullwidthCharacters) + XCTAssertTrue("ABCDE".containsFullwidthCharacters) XCTAssertTrue("こんにちわ".containsFullwidthCharacters) XCTAssertTrue("你好".containsFullwidthCharacters) XCTAssertTrue("안녕하세요".containsFullwidthCharacters) XCTAssertTrue("¡".containsFullwidthOrAmbiguousCharacters) - XCTAssertFalse("ABC".containsFullwidthOrAmbiguousCharacters) - XCTAssertTrue("ABC".containsFullwidthOrAmbiguousCharacters) + XCTAssertFalse("ABCDEabcde".containsFullwidthOrAmbiguousCharacters) + XCTAssertTrue("ABCDE".containsFullwidthOrAmbiguousCharacters) XCTAssertTrue("こんにちわ".containsFullwidthOrAmbiguousCharacters) XCTAssertTrue("你好".containsFullwidthOrAmbiguousCharacters) XCTAssertTrue("안녕하세요".containsFullwidthOrAmbiguousCharacters) } + func testFullWidthKatakana() { + testStringFullwidth("あいうえお") + testStringFullwidth("かきくけこ") + testStringFullwidth("さしすせそ") + testStringFullwidth("たちつてと") + testStringFullwidth("なにぬねの") + testStringFullwidth("はひふへほ") + testStringFullwidth("まみむめも") + testStringFullwidth("やゆよ") + testStringFullwidth("わをん") + } + + func testFullWidthChinese() { + testStringFullwidth( + "蛰伏如斯,回归事、可容拿捏?宁万籁、更无红紫,尚疑窥月。褪尽金辉玄鬓迥,其间痛楚何堪窃!怕流莺、犹道慕清喉,施簧舌。历进退,谙冷热。高远意,千般别。笑风多露重,未由分说。且向疏桐轻振翼,不教高洁成孤洁。即清寒、正好入秋声,传千阕。" + ) + } + func testFullwidthHalfwidthCount() { - XCTAssertEqual("ABC".fullwidthHalfwidthCount, 3) - XCTAssertEqual("(^o^)".fullwidthHalfwidthCount, 5) + XCTAssertEqual("ABCDE".fullwidthHalfwidthCount, 5) + XCTAssertEqual("ꉂ(σ▰˃̶̀ꇴ˂̶́)σ✧".fullwidthHalfwidthCount, 16) XCTAssertEqual("あいうえお".fullwidthHalfwidthCount, 10) - XCTAssertEqual("漢字".fullwidthHalfwidthCount, 4) + XCTAssertEqual("你好".fullwidthHalfwidthCount, 4) XCTAssertEqual("mix混合".fullwidthHalfwidthCount, 7) } @@ -51,6 +72,8 @@ class FullwidthTests: XCTestCase { ("testEdgeCases", testEdgeCases), ("testNonFullwidthCharacters", testNonFullwidthCharacters), ("testContainsFullwidth", testContainsFullwidth), + ("testFullWidthKatakana", testFullWidthKatakana), + ("testFullWidthChinese", testFullWidthChinese), ("testFullwidthHalfwidthCount", testFullwidthHalfwidthCount) ] } diff --git a/Tests/EastAsianWidthTests/HalfwidthTests.swift b/Tests/EastAsianWidthTests/HalfwidthTests.swift index e8c2c33..e1454bc 100644 --- a/Tests/EastAsianWidthTests/HalfwidthTests.swift +++ b/Tests/EastAsianWidthTests/HalfwidthTests.swift @@ -11,58 +11,78 @@ import EastAsianWidth // https://github.com/ukitaka/EastAsianWidth.swift/blob/master/Tests/EastAsianWidthTests/TestUtils.swift class HalfwidthTests: XCTestCase { func testEdgeCases() { - EastAsianNarrowEdgeUnicodeScalar.forEach(AssertHalfwidth) - EastAsianHalfwidthEdgeUnicodeScalar.forEach(AssertHalfwidth) - EastAsianNarrowEdgeUnicodeScalar.forEach(AssertHalfwidthOrAmbiguous) - EastAsianHalfwidthEdgeUnicodeScalar.forEach(AssertHalfwidthOrAmbiguous) - EastAsianAmbiguousEdgeUnicodeScalar.forEach(AssertHalfwidthOrAmbiguous) + EastAsianNarrowEdgeUnicodeScalar.forEach(testScalarHalfwidth) + EastAsianHalfwidthEdgeUnicodeScalar.forEach(testScalarHalfwidth) + EastAsianNarrowEdgeUnicodeScalar.forEach(testScalarHalfwidthOrAmbiguous) + EastAsianHalfwidthEdgeUnicodeScalar.forEach(testScalarHalfwidthOrAmbiguous) + EastAsianAmbiguousEdgeUnicodeScalar.forEach(testScalarHalfwidthOrAmbiguous) } func testNonHalfwidthCharacters() { - AssertNotHalfwidth("あいうえお") + testStringNotHalfwidth("あいうえお") + testStringNotHalfwidth("ABCDE") + testStringNotHalfwidth("01234") + testStringNotHalfwidth("!"#$%⦅⦆") + testStringNotHalfwidth("你好") } func testContainsHalfwidth() { XCTAssertFalse("¡".containsHalfwidthCharacters) - XCTAssertTrue("ABC".containsHalfwidthCharacters) - XCTAssertFalse("ABC".containsHalfwidthCharacters) + XCTAssertTrue("ABCDEabcde".containsHalfwidthCharacters) + XCTAssertFalse("ABCDE".containsHalfwidthCharacters) XCTAssertFalse("こんにちわ".containsHalfwidthCharacters) XCTAssertFalse("你好".containsHalfwidthCharacters) XCTAssertFalse("안녕하세요".containsHalfwidthCharacters) XCTAssertTrue("¡".containsHalfwidthOrAmbiguousCharacters) - XCTAssertTrue("ABC".containsHalfwidthOrAmbiguousCharacters) - XCTAssertFalse("ABC".containsHalfwidthOrAmbiguousCharacters) + XCTAssertTrue("ABCDEabcde".containsHalfwidthOrAmbiguousCharacters) + XCTAssertFalse("ABCDE".containsHalfwidthOrAmbiguousCharacters) XCTAssertFalse("こんにちわ".containsHalfwidthOrAmbiguousCharacters) XCTAssertFalse("你好".containsHalfwidthOrAmbiguousCharacters) XCTAssertFalse("안녕하세요".containsHalfwidthOrAmbiguousCharacters) } + + func testHalfWidthPunctuation() { + testStringHalfwidth("。「」、") + } + + func testHalfwidthDigit() { + testStringHalfwidth("1234567890") + } + + func testHalfwidthEnglishLetters() { + testStringHalfwidth("abcdefghijklmnopqrstuvwxyz") + testStringHalfwidth("ABCDEFGHIJKLMNOPQRSTUVWXYZ") + } func testHalfwidthKatakana() { - AssertHalfwidth("アイウエオ") - AssertHalfwidth("カキクケコ") - AssertHalfwidth("サシスセソ") - AssertHalfwidth("タチツテト") - AssertHalfwidth("ナニヌネノ") - AssertHalfwidth("ハヒフヘホ") - AssertHalfwidth("マミムメモ") - AssertHalfwidth("ヤユヨ") - AssertHalfwidth("ワヲン") - AssertHalfwidth("ガギグゲゴ") - AssertHalfwidth("ザジズゼゾ") - AssertHalfwidth("ダヂヅデド") - AssertHalfwidth("バビブベボ") - AssertHalfwidth("パピプペポ") + testStringHalfwidth("アイウエオ") + testStringHalfwidth("カキクケコ") + testStringHalfwidth("サシスセソ") + testStringHalfwidth("タチツテト") + testStringHalfwidth("ナニヌネノ") + testStringHalfwidth("ハヒフヘホ") + testStringHalfwidth("マミムメモ") + testStringHalfwidth("ヤユヨ") + testStringHalfwidth("ワヲン") + testStringHalfwidth("ガギグゲゴ") + testStringHalfwidth("ザジズゼゾ") + testStringHalfwidth("ダヂヅデド") + testStringHalfwidth("バビブベボ") + testStringHalfwidth("パピプペポ") } func testHalfwidthHangul() { - AssertHalfwidth("ᄀᄁᆪᄂᆬᆭᄃᄄᄅᆰᆱᆲᆳᆴᆵᄚᄆᄇᄈᄡᄉᄊᄋᄌᄍᄎᄏᄐᄑ하ᅢᅣᅤᅥᅦᅧᅨᅩᅪᅫᅬᅭᅮᅯᅰᅱᅲᅳᅴᅵ") + testStringHalfwidth("ᄀᄁᆪᄂᆬᆭᄃᄄᄅᆰᆱᆲᆳᆴᆵᄚᄆᄇᄈᄡᄉᄊᄋᄌᄍᄎᄏᄐᄑ하ᅢᅣᅤᅥᅦᅧᅨᅩᅪᅫᅬᅭᅮᅯᅰᅱᅲᅳᅴᅵ") } static var allTests = [ ("testEdgeCases", testEdgeCases), ("testNonHalfwidthCharacters", testNonHalfwidthCharacters), ("testContainsHalfwidth", testContainsHalfwidth), + ("testHalfWidthPunctuation", testHalfWidthPunctuation), + ("testHalfwidthDigit", testHalfwidthDigit), + ("testHalfwidthEnglishLetters", testHalfwidthEnglishLetters), ("testHalfwidthKatakana", testHalfwidthKatakana), ("testHalfwidthHangul", testHalfwidthHangul) ] diff --git a/Tests/EastAsianWidthTests/TestUtils.swift b/Tests/EastAsianWidthTests/TestUtils.swift index 06624e2..3446e28 100644 --- a/Tests/EastAsianWidthTests/TestUtils.swift +++ b/Tests/EastAsianWidthTests/TestUtils.swift @@ -10,169 +10,169 @@ import EastAsianWidth // https://github.com/ukitaka/EastAsianWidth.swift/blob/master/Tests/EastAsianWidthTests/TestUtils.swift // MARK: - EastAsianAmbiguous -func AssertEastAsianAmbiguous(_ string: String) { - string.unicodeScalars.forEach(AssertEastAsianAmbiguous) +func testStringEastAsianAmbiguous(_ string: String) { + string.unicodeScalars.forEach(testScalarEastAsianAmbiguous) } -func AssertEastAsianAmbiguous(_ unicodeScalar: UnicodeScalar) { +func testScalarEastAsianAmbiguous(_ unicodeScalar: UnicodeScalar) { XCTAssertTrue(unicodeScalar.isEastAsianAmbiguous) } -func AssertNotEastAsianAmbiguous(_ string: String) { - string.unicodeScalars.forEach(AssertNotEastAsianAmbiguous) +func testStringNotEastAsianAmbiguous(_ string: String) { + string.unicodeScalars.forEach(testScalarNotEastAsianAmbiguous) } -func AssertNotEastAsianAmbiguous(_ unicodeScalar: UnicodeScalar) { +func testScalarNotEastAsianAmbiguous(_ unicodeScalar: UnicodeScalar) { XCTAssertFalse(unicodeScalar.isEastAsianAmbiguous) } // MARK: - EastAsianNeutral -func AssertEastAsianNeutral(_ string: String) { - string.unicodeScalars.forEach(AssertEastAsianNeutral) +func testStringEastAsianNeutral(_ string: String) { + string.unicodeScalars.forEach(testScalarEastAsianNeutral) } -func AssertEastAsianNeutral(_ unicodeScalar: UnicodeScalar) { +func testScalarEastAsianNeutral(_ unicodeScalar: UnicodeScalar) { XCTAssertTrue(unicodeScalar.isEastAsianNeutral) } -func AssertNotEastAsianNeutral(_ string: String) { - string.unicodeScalars.forEach(AssertNotEastAsianNeutral) +func testStringNotEastAsianNeutral(_ string: String) { + string.unicodeScalars.forEach(testScalarNotEastAsianNeutral) } -func AssertNotEastAsianNeutral(_ unicodeScalar: UnicodeScalar) { +func testScalarNotEastAsianNeutral(_ unicodeScalar: UnicodeScalar) { XCTAssertFalse(unicodeScalar.isEastAsianNeutral) } // MARK: - EastAsianHalfwidth -func AssertEastAsianHalfwidth(_ string: String) { - string.unicodeScalars.forEach(AssertEastAsianHalfwidth) +func testStringEastAsianHalfwidth(_ string: String) { + string.unicodeScalars.forEach(testScalarEastAsianHalfwidth) } -func AssertEastAsianHalfwidth(_ unicodeScalar: UnicodeScalar) { +func testScalarEastAsianHalfwidth(_ unicodeScalar: UnicodeScalar) { XCTAssertTrue(unicodeScalar.isEastAsianHalfwidth) } -func AssertNotEastAsianHalfwidth(_ string: String) { - string.unicodeScalars.forEach(AssertNotEastAsianHalfwidth) +func testStringNotEastAsianHalfwidth(_ string: String) { + string.unicodeScalars.forEach(testScalarNotEastAsianHalfwidth) } -func AssertNotEastAsianHalfwidth(_ unicodeScalar: UnicodeScalar) { +func testScalarNotEastAsianHalfwidth(_ unicodeScalar: UnicodeScalar) { XCTAssertFalse(unicodeScalar.isEastAsianHalfwidth) } // MARK: - EastAsianFullwidth -func AssertEastAsianFullwidth(_ string: String) { - string.unicodeScalars.forEach(AssertEastAsianFullwidth) +func testStringEastAsianFullwidth(_ string: String) { + string.unicodeScalars.forEach(testScalarEastAsianFullwidth) } -func AssertEastAsianFullwidth(_ unicodeScalar: UnicodeScalar) { +func testScalarEastAsianFullwidth(_ unicodeScalar: UnicodeScalar) { XCTAssertTrue(unicodeScalar.isEastAsianFullwidth) } -func AssertNotEastAsianFullwidth(_ string: String) { - string.unicodeScalars.forEach(AssertNotEastAsianFullwidth) +func testStringNotEastAsianFullwidth(_ string: String) { + string.unicodeScalars.forEach(testScalarNotEastAsianFullwidth) } -func AssertNotEastAsianFullwidth(_ unicodeScalar: UnicodeScalar) { +func testScalarNotEastAsianFullwidth(_ unicodeScalar: UnicodeScalar) { XCTAssertFalse(unicodeScalar.isEastAsianFullwidth) } // MARK: - EastAsianNarrow -func AssertEastAsianNarrow(_ string: String) { - string.unicodeScalars.forEach(AssertEastAsianNarrow) +func testStringEastAsianNarrow(_ string: String) { + string.unicodeScalars.forEach(testScalarEastAsianNarrow) } -func AssertEastAsianNarrow(_ unicodeScalar: UnicodeScalar) { +func testScalarEastAsianNarrow(_ unicodeScalar: UnicodeScalar) { XCTAssertTrue(unicodeScalar.isEastAsianNarrow) } -func AssertNotEastAsianNarrow(_ string: String) { - string.unicodeScalars.forEach(AssertNotEastAsianNarrow) +func testStringNotEastAsianNarrow(_ string: String) { + string.unicodeScalars.forEach(testScalarNotEastAsianNarrow) } -func AssertNotEastAsianNarrow(_ unicodeScalar: UnicodeScalar) { +func testScalarNotEastAsianNarrow(_ unicodeScalar: UnicodeScalar) { XCTAssertFalse(unicodeScalar.isEastAsianNarrow) } // MARK: - EastAsianWide -func AssertEastAsianWide(_ string: String) { - string.unicodeScalars.forEach(AssertEastAsianWide) +func testStringEastAsianWide(_ string: String) { + string.unicodeScalars.forEach(testScalarEastAsianWide) } -func AssertEastAsianWide(_ unicodeScalar: UnicodeScalar) { +func testScalarEastAsianWide(_ unicodeScalar: UnicodeScalar) { XCTAssertTrue(unicodeScalar.isEastAsianWide) } -func AssertNotEastAsianWide(_ string: String) { - string.unicodeScalars.forEach(AssertNotEastAsianWide) +func testStringNotEastAsianWide(_ string: String) { + string.unicodeScalars.forEach(testScalarNotEastAsianWide) } -func AssertNotEastAsianWide(_ unicodeScalar: UnicodeScalar) { +func testScalarNotEastAsianWide(_ unicodeScalar: UnicodeScalar) { XCTAssertFalse(unicodeScalar.isEastAsianWide) } // MARK: - Fullwidth -func AssertFullwidth(_ string: String) { - string.unicodeScalars.forEach(AssertFullwidth) +func testStringFullwidth(_ string: String) { + string.unicodeScalars.forEach(testScalarFullwidth) } -func AssertFullwidth(_ unicodeScalar: UnicodeScalar) { +func testScalarFullwidth(_ unicodeScalar: UnicodeScalar) { XCTAssertTrue(unicodeScalar.isFullwidth) } -func AssertNotFullwidth(_ string: String) { - string.unicodeScalars.forEach(AssertNotFullwidth) +func testStringNotFullwidth(_ string: String) { + string.unicodeScalars.forEach(testScalarNotFullwidth) } -func AssertNotFullwidth(_ unicodeScalar: UnicodeScalar) { +func testScalarNotFullwidth(_ unicodeScalar: UnicodeScalar) { XCTAssertFalse(unicodeScalar.isFullwidth) } -func AssertFullwidthOrAmbiguous(_ string: String) { - string.unicodeScalars.forEach(AssertFullwidthOrAmbiguous) +func testStringFullwidthOrAmbiguous(_ string: String) { + string.unicodeScalars.forEach(testScalarFullwidthOrAmbiguous) } -func AssertFullwidthOrAmbiguous(_ unicodeScalar: UnicodeScalar) { +func testScalarFullwidthOrAmbiguous(_ unicodeScalar: UnicodeScalar) { XCTAssertTrue(unicodeScalar.isFullwidthOrAmbiguous) } -func AssertNotFullwidthOrAmbiguous(_ string: String) { - string.unicodeScalars.forEach(AssertNotFullwidthOrAmbiguous) +func testStringNotFullwidthOrAmbiguous(_ string: String) { + string.unicodeScalars.forEach(testScalarNotFullwidthOrAmbiguous) } -func AssertNotFullwidthOrAmbiguous(_ unicodeScalar: UnicodeScalar) { +func testScalarNotFullwidthOrAmbiguous(_ unicodeScalar: UnicodeScalar) { XCTAssertFalse(unicodeScalar.isFullwidthOrAmbiguous) } // MARK: - Halfwidth -func AssertHalfwidth(_ string: String) { - string.unicodeScalars.forEach(AssertHalfwidth) +func testStringHalfwidth(_ string: String) { + string.unicodeScalars.forEach(testScalarHalfwidth) } -func AssertHalfwidth(_ unicodeScalar: UnicodeScalar) { +func testScalarHalfwidth(_ unicodeScalar: UnicodeScalar) { XCTAssertTrue(unicodeScalar.isHalfwidth) } -func AssertNotHalfwidth(_ string: String) { - string.unicodeScalars.forEach(AssertNotHalfwidth) +func testStringNotHalfwidth(_ string: String) { + string.unicodeScalars.forEach(testScalarNotHalfwidth) } -func AssertNotHalfwidth(_ unicodeScalar: UnicodeScalar) { +func testScalarNotHalfwidth(_ unicodeScalar: UnicodeScalar) { XCTAssertFalse(unicodeScalar.isHalfwidth) } -func AssertHalfwidthOrAmbiguous(_ string: String) { - string.unicodeScalars.forEach(AssertHalfwidthOrAmbiguous) +func testStringHalfwidthOrAmbiguous(_ string: String) { + string.unicodeScalars.forEach(testScalarHalfwidthOrAmbiguous) } -func AssertHalfwidthOrAmbiguous(_ unicodeScalar: UnicodeScalar) { +func testScalarHalfwidthOrAmbiguous(_ unicodeScalar: UnicodeScalar) { XCTAssertTrue(unicodeScalar.isHalfwidthOrAmbiguous) } -func AssertNotHalfwidthOrAmbiguous(_ string: String) { - string.unicodeScalars.forEach(AssertNotHalfwidthOrAmbiguous) +func testStringNotHalfwidthOrAmbiguous(_ string: String) { + string.unicodeScalars.forEach(testScalarNotHalfwidthOrAmbiguous) } -func AssertNotHalfwidthOrAmbiguous(_ unicodeScalar: UnicodeScalar) { +func testScalarNotHalfwidthOrAmbiguous(_ unicodeScalar: UnicodeScalar) { XCTAssertFalse(unicodeScalar.isHalfwidthOrAmbiguous) } diff --git a/UnicodeEastAsianWidth.podspec b/UnicodeEastAsianWidth.podspec index dab0eff..04185f8 100644 --- a/UnicodeEastAsianWidth.podspec +++ b/UnicodeEastAsianWidth.podspec @@ -1,7 +1,7 @@ Pod::Spec.new do |s| s.name = 'UnicodeEastAsianWidth' - s.version = '2.0.0' - s.summary = 'Transfer to check Unicode EastAsianWidth by Swift' + s.version = '2.1.0' + s.summary = 'Auto-generate Swift Unicode EastAsianWidth count checking.' s.description = <<-DESC By checking official unicode site https://home.unicode.org, try to transfer East Asian Width part to Swift code which could directly checking fullwidth & halfwifth of the characters. @@ -11,11 +11,11 @@ Pod::Spec.new do |s| s.license = { :type => 'MIT', :file => 'LICENSE' } s.author = { 'He Wu(HevaWu)' => 'hewu9375@gmail.com' } s.source = { :git => 'https://github.com/HevaWu/EastAsianWidth.git', :tag => s.version.to_s } - s.social_media_url = 'https://www.facebook.com/hevawu' + s.social_media_url = 'https://twitter.com/hewu9375' s.ios.deployment_target = '9.0' s.source_files = 'Sources/EastAsianWidth/*' s.module_name = 'EastAsianWidth' - + s.swift_version = '5.5' end diff --git a/list b/list new file mode 100644 index 0000000..fc3f294 --- /dev/null +++ b/list @@ -0,0 +1,12 @@ + +trunk +- Type: CDN +- URL: https://cdn.cocoapods.org/ +- Path: /Users/hewu/.cocoapods/repos/trunk + +UnicodeEastAsianWidth +- Type: git (tags/2.0.0^0) +- URL: https://github.com/HevaWu/EastAsianWidth +- Path: /Users/hewu/.cocoapods/repos/UnicodeEastAsianWidth + +2 repos