@@ -35,14 +35,21 @@ abstract class AbstractUnicodeString extends AbstractString
35
35
public const NFKC = \Normalizer::NFKC ;
36
36
public const NFKD = \Normalizer::NFKD ;
37
37
38
+ // all ASCII letters sorted by typical frequency of occurrence
38
39
private const ASCII = "\x20\x65\x69\x61\x73\x6E\x74\x72\x6F\x6C\x75\x64\x5D\x5B\x63\x6D\x70\x27\x0A\x67\x7C\x68\x76\x2E\x66\x62\x2C\x3A\x3D\x2D\x71\x31\x30\x43\x32\x2A\x79\x78\x29\x28\x4C\x39\x41\x53\x2F\x50\x22\x45\x6A\x4D\x49\x6B\x33\x3E\x35\x54\x3C\x44\x34\x7D\x42\x7B\x38\x46\x77\x52\x36\x37\x55\x47\x4E\x3B\x4A\x7A\x56\x23\x48\x4F\x57\x5F\x26\x21\x4B\x3F\x58\x51\x25\x59\x5C\x09\x5A\x2B\x7E\x5E\x24\x40\x60\x7F\x00\x01\x02\x03\x04\x05\x06\x07\x08\x0B\x0C\x0D\x0E\x0F\x10\x11\x12\x13\x14\x15\x16\x17\x18\x19\x1A\x1B\x1C\x1D\x1E\x1F" ;
40
+
41
+ // the subset of folded case mappings that is not in lower case mappings
39
42
private const FOLD_FROM = ['İ ' , 'µ ' , 'ſ ' , "\xCD\x85" , 'ς ' , 'ϐ ' , 'ϑ ' , 'ϕ ' , 'ϖ ' , 'ϰ ' , 'ϱ ' , 'ϵ ' , 'ẛ ' , "\xE1\xBE\xBE" , 'ß ' , 'İ ' , 'ʼn ' , 'ǰ ' , 'ΐ ' , 'ΰ ' , 'և ' , 'ẖ ' , 'ẗ ' , 'ẘ ' , 'ẙ ' , 'ẚ ' , 'ẞ ' , 'ὐ ' , 'ὒ ' , 'ὔ ' , 'ὖ ' , 'ᾀ ' , 'ᾁ ' , 'ᾂ ' , 'ᾃ ' , 'ᾄ ' , 'ᾅ ' , 'ᾆ ' , 'ᾇ ' , 'ᾈ ' , 'ᾉ ' , 'ᾊ ' , 'ᾋ ' , 'ᾌ ' , 'ᾍ ' , 'ᾎ ' , 'ᾏ ' , 'ᾐ ' , 'ᾑ ' , 'ᾒ ' , 'ᾓ ' , 'ᾔ ' , 'ᾕ ' , 'ᾖ ' , 'ᾗ ' , 'ᾘ ' , 'ᾙ ' , 'ᾚ ' , 'ᾛ ' , 'ᾜ ' , 'ᾝ ' , 'ᾞ ' , 'ᾟ ' , 'ᾠ ' , 'ᾡ ' , 'ᾢ ' , 'ᾣ ' , 'ᾤ ' , 'ᾥ ' , 'ᾦ ' , 'ᾧ ' , 'ᾨ ' , 'ᾩ ' , 'ᾪ ' , 'ᾫ ' , 'ᾬ ' , 'ᾭ ' , 'ᾮ ' , 'ᾯ ' , 'ᾲ ' , 'ᾳ ' , 'ᾴ ' , 'ᾶ ' , 'ᾷ ' , 'ᾼ ' , 'ῂ ' , 'ῃ ' , 'ῄ ' , 'ῆ ' , 'ῇ ' , 'ῌ ' , 'ῒ ' , 'ΐ ' , 'ῖ ' , 'ῗ ' , 'ῢ ' , 'ΰ ' , 'ῤ ' , 'ῦ ' , 'ῧ ' , 'ῲ ' , 'ῳ ' , 'ῴ ' , 'ῶ ' , 'ῷ ' , 'ῼ ' , 'ff ' , 'fi ' , 'fl ' , 'ffi ' , 'ffl ' , 'ſt ' , 'st ' , 'ﬓ ' , 'ﬔ ' , 'ﬕ ' , 'ﬖ ' , 'ﬗ ' ];
40
43
private const FOLD_TO = ['i̇ ' , 'μ ' , 's ' , 'ι ' , 'σ ' , 'β ' , 'θ ' , 'φ ' , 'π ' , 'κ ' , 'ρ ' , 'ε ' , 'ṡ ' , 'ι ' , 'ss ' , 'i̇ ' , 'ʼn ' , 'ǰ ' , 'ΐ ' , 'ΰ ' , 'եւ ' , 'ẖ ' , 'ẗ ' , 'ẘ ' , 'ẙ ' , 'aʾ ' , 'ss ' , 'ὐ ' , 'ὒ ' , 'ὔ ' , 'ὖ ' , 'ἀι ' , 'ἁι ' , 'ἂι ' , 'ἃι ' , 'ἄι ' , 'ἅι ' , 'ἆι ' , 'ἇι ' , 'ἀι ' , 'ἁι ' , 'ἂι ' , 'ἃι ' , 'ἄι ' , 'ἅι ' , 'ἆι ' , 'ἇι ' , 'ἠι ' , 'ἡι ' , 'ἢι ' , 'ἣι ' , 'ἤι ' , 'ἥι ' , 'ἦι ' , 'ἧι ' , 'ἠι ' , 'ἡι ' , 'ἢι ' , 'ἣι ' , 'ἤι ' , 'ἥι ' , 'ἦι ' , 'ἧι ' , 'ὠι ' , 'ὡι ' , 'ὢι ' , 'ὣι ' , 'ὤι ' , 'ὥι ' , 'ὦι ' , 'ὧι ' , 'ὠι ' , 'ὡι ' , 'ὢι ' , 'ὣι ' , 'ὤι ' , 'ὥι ' , 'ὦι ' , 'ὧι ' , 'ὰι ' , 'αι ' , 'άι ' , 'ᾶ ' , 'ᾶι ' , 'αι ' , 'ὴι ' , 'ηι ' , 'ήι ' , 'ῆ ' , 'ῆι ' , 'ηι ' , 'ῒ ' , 'ΐ ' , 'ῖ ' , 'ῗ ' , 'ῢ ' , 'ΰ ' , 'ῤ ' , 'ῦ ' , 'ῧ ' , 'ὼι ' , 'ωι ' , 'ώι ' , 'ῶ ' , 'ῶι ' , 'ωι ' , 'ff ' , 'fi ' , 'fl ' , 'ffi ' , 'ffl ' , 'st ' , 'st ' , 'մն ' , 'մե ' , 'մի ' , 'վն ' , 'մխ ' ];
44
+
45
+ // the subset of upper case mappings that map one code point to many code points
41
46
private const UPPER_FROM = ['ß ' , 'ff ' , 'fi ' , 'fl ' , 'ffi ' , 'ffl ' , 'ſt ' , 'st ' , 'և ' , 'ﬓ ' , 'ﬔ ' , 'ﬕ ' , 'ﬖ ' , 'ﬗ ' , 'ʼn ' , 'ΐ ' , 'ΰ ' , 'ǰ ' , 'ẖ ' , 'ẗ ' , 'ẘ ' , 'ẙ ' , 'ẚ ' , 'ὐ ' , 'ὒ ' , 'ὔ ' , 'ὖ ' , 'ᾶ ' , 'ῆ ' , 'ῒ ' , 'ΐ ' , 'ῖ ' , 'ῗ ' , 'ῢ ' , 'ΰ ' , 'ῤ ' , 'ῦ ' , 'ῧ ' , 'ῶ
42
47
' ];
43
48
private const UPPER_TO = ['SS ' , 'FF ' , 'FI ' , 'FL ' , 'FFI ' , 'FFL ' , 'ST ' , 'ST ' , 'ԵՒ ' , 'ՄՆ ' , 'ՄԵ ' , 'ՄԻ ' , 'ՎՆ ' , 'ՄԽ ' , 'ʼN ' , 'Ϊ́ ' , 'Ϋ́ ' , 'J̌ ' , 'H̱ ' , 'T̈ ' , 'W̊ ' , 'Y̊ ' , 'Aʾ ' , 'Υ̓ ' , 'Υ̓̀ ' , 'Υ̓́ ' , 'Υ̓͂ ' , 'Α͂ ' , 'Η͂ ' , 'Ϊ̀ ' , 'Ϊ́ ' , 'Ι͂ ' , 'Ϊ͂ ' , 'Ϋ̀ ' , 'Ϋ́ ' , 'Ρ̓ ' , 'Υ͂ ' , 'Ϋ͂ ' , 'Ω͂ ' ];
44
- private const TRANSLIT_FROM = ['Ð ' , 'Ø ' , 'Þ ' , 'ð ' , 'ø ' , 'þ ' , 'Đ ' , 'đ ' , 'Ħ ' , 'ħ ' , 'ı ' , 'ĸ ' , 'Ŋ ' , 'ŋ ' , 'Ŧ ' , 'ŧ ' , 'ƀ ' , 'Ɓ ' , 'Ƃ ' , 'ƃ ' , 'Ƈ ' , 'ƈ ' , 'Ɖ ' , 'Ɗ ' , 'Ƌ ' , 'ƌ ' , 'Ɛ ' , 'Ƒ ' , 'ƒ ' , 'Ɠ ' , 'ƕ ' , 'Ɩ ' , 'Ɨ ' , 'Ƙ ' , 'ƙ ' , 'ƚ ' , 'Ɲ ' , 'ƞ ' , 'Ƣ ' , 'ƣ ' , 'Ƥ ' , 'ƥ ' , 'ƫ ' , 'Ƭ ' , 'ƭ ' , 'Ʈ ' , 'Ʋ ' , 'Ƴ ' , 'ƴ ' , 'Ƶ ' , 'ƶ ' , 'Ǥ ' , 'ǥ ' , 'ȡ ' , 'Ȥ ' , 'ȥ ' , 'ȴ ' , 'ȵ ' , 'ȶ ' , 'ȷ ' , 'ȸ ' , 'ȹ ' , 'Ⱥ ' , 'Ȼ ' , 'ȼ ' , 'Ƚ ' , 'Ⱦ ' , 'ȿ ' , 'ɀ ' , 'Ƀ ' , 'Ʉ ' , 'Ɇ ' , 'ɇ ' , 'Ɉ ' , 'ɉ ' , 'Ɍ ' , 'ɍ ' , 'Ɏ ' , 'ɏ ' , 'ɓ ' , 'ɕ ' , 'ɖ ' , 'ɗ ' , 'ɛ ' , 'ɟ ' , 'ɠ ' , 'ɡ ' , 'ɢ ' , 'ɦ ' , 'ɧ ' , 'ɨ ' , 'ɪ ' , 'ɫ ' , 'ɬ ' , 'ɭ ' , 'ɱ ' , 'ɲ ' , 'ɳ ' , 'ɴ ' , 'ɶ ' , 'ɼ ' , 'ɽ ' , 'ɾ ' , 'ʀ ' , 'ʂ ' , 'ʈ ' , 'ʉ ' , 'ʋ ' , 'ʏ ' , 'ʐ ' , 'ʑ ' , 'ʙ ' , 'ʛ ' , 'ʜ ' , 'ʝ ' , 'ʟ ' , 'ʠ ' , 'ʣ ' , 'ʥ ' , 'ʦ ' , 'ʪ ' , 'ʫ ' , 'ᴀ ' , 'ᴁ ' , 'ᴃ ' , 'ᴄ ' , 'ᴅ ' , 'ᴆ ' , 'ᴇ ' , 'ᴊ ' , 'ᴋ ' , 'ᴌ ' , 'ᴍ ' , 'ᴏ ' , 'ᴘ ' , 'ᴛ ' , 'ᴜ ' , 'ᴠ ' , 'ᴡ ' , 'ᴢ ' , 'ᵫ ' , 'ᵬ ' , 'ᵭ ' , 'ᵮ ' , 'ᵯ ' , 'ᵰ ' , 'ᵱ ' , 'ᵲ ' , 'ᵳ ' , 'ᵴ ' , 'ᵵ ' , 'ᵶ ' , 'ᵺ ' , 'ᵻ ' , 'ᵽ ' , 'ᵾ ' , 'ᶀ ' , 'ᶁ ' , 'ᶂ ' , 'ᶃ ' , 'ᶄ ' , 'ᶅ ' , 'ᶆ ' , 'ᶇ ' , 'ᶈ ' , 'ᶉ ' , 'ᶊ ' , 'ᶌ ' , 'ᶍ ' , 'ᶎ ' , 'ᶏ ' , 'ᶑ ' , 'ᶒ ' , 'ᶓ ' , 'ᶖ ' , 'ᶙ ' , 'ẜ ' , 'ẝ ' , 'ẞ ' , 'Ỻ ' , 'ỻ ' , 'Ỽ ' , 'ỽ ' , 'Ỿ ' , 'ỿ ' , '₠ ' , '₢ ' , '₣ ' , '₤ ' , '₧ ' , '₹ ' , '℞ ' , '〇 ' , '′ ' , '〝 ' , '〞 ' , '‖ ' , '⁅ ' , '⁆ ' , '⁎ ' , '、 ' , '。 ' , '〈 ' , '〉 ' , '《 ' , '》 ' , '〔 ' , '〕 ' , '〘 ' , '〙 ' , '〚 ' , '〛 ' , '︑ ' , '︒ ' , '︹ ' , '︺ ' , '︽ ' , '︾ ' , '︿ ' , '﹀ ' , '÷ ' , '∥ ' , '⦅ ' , '⦆ ' ];
45
- private const TRANSLIT_TO = ['D ' , 'O ' , 'TH ' , 'd ' , 'o ' , 'th ' , 'D ' , 'd ' , 'H ' , 'h ' , 'i ' , 'q ' , 'N ' , 'n ' , 'T ' , 't ' , 'b ' , 'B ' , 'B ' , 'b ' , 'C ' , 'c ' , 'D ' , 'D ' , 'D ' , 'd ' , 'E ' , 'F ' , 'f ' , 'G ' , 'hv ' , 'I ' , 'I ' , 'K ' , 'k ' , 'l ' , 'N ' , 'n ' , 'OI ' , 'oi ' , 'P ' , 'p ' , 't ' , 'T ' , 't ' , 'T ' , 'V ' , 'Y ' , 'y ' , 'Z ' , 'z ' , 'G ' , 'g ' , 'd ' , 'Z ' , 'z ' , 'l ' , 'n ' , 't ' , 'j ' , 'db ' , 'qp ' , 'A ' , 'C ' , 'c ' , 'L ' , 'T ' , 's ' , 'z ' , 'B ' , 'U ' , 'E ' , 'e ' , 'J ' , 'j ' , 'R ' , 'r ' , 'Y ' , 'y ' , 'b ' , 'c ' , 'd ' , 'd ' , 'e ' , 'j ' , 'g ' , 'g ' , 'G ' , 'h ' , 'h ' , 'i ' , 'I ' , 'l ' , 'l ' , 'l ' , 'm ' , 'n ' , 'n ' , 'N ' , 'OE ' , 'r ' , 'r ' , 'r ' , 'R ' , 's ' , 't ' , 'u ' , 'v ' , 'Y ' , 'z ' , 'z ' , 'B ' , 'G ' , 'H ' , 'j ' , 'L ' , 'q ' , 'dz ' , 'dz ' , 'ts ' , 'ls ' , 'lz ' , 'A ' , 'AE ' , 'B ' , 'C ' , 'D ' , 'D ' , 'E ' , 'J ' , 'K ' , 'L ' , 'M ' , 'O ' , 'P ' , 'T ' , 'U ' , 'V ' , 'W ' , 'Z ' , 'ue ' , 'b ' , 'd ' , 'f ' , 'm ' , 'n ' , 'p ' , 'r ' , 'r ' , 's ' , 't ' , 'z ' , 'th ' , 'I ' , 'p ' , 'U ' , 'b ' , 'd ' , 'f ' , 'g ' , 'k ' , 'l ' , 'm ' , 'n ' , 'p ' , 'r ' , 's ' , 'v ' , 'x ' , 'z ' , 'a ' , 'd ' , 'e ' , 'e ' , 'i ' , 'u ' , 's ' , 's ' , 'SS ' , 'LL ' , 'll ' , 'V ' , 'v ' , 'Y ' , 'y ' , 'CE ' , 'Cr ' , 'Fr. ' , 'L. ' , 'Pts ' , 'Rs ' , 'Rx ' , '0 ' , '\'' , '" ' , '" ' , '|| ' , '[ ' , '] ' , '* ' , ', ' , '. ' , '< ' , '> ' , '<< ' , '>> ' , '[ ' , '] ' , '[ ' , '] ' , '[ ' , '] ' , ', ' , '. ' , '[ ' , '] ' , '<< ' , '>> ' , '< ' , '> ' , '/ ' , '|| ' , '(( ' , ')) ' ];
49
+
50
+ // the subset of https://github.com/unicode-org/cldr/blob/master/common/transforms/Latin-ASCII.xml that is not in NFKD
51
+ private const TRANSLIT_FROM = ['Æ ' , 'Ð ' , 'Ø ' , 'Þ ' , 'ß ' , 'æ ' , 'ð ' , 'ø ' , 'þ ' , 'Đ ' , 'đ ' , 'Ħ ' , 'ħ ' , 'ı ' , 'ĸ ' , 'Ŀ ' , 'ŀ ' , 'Ł ' , 'ł ' , 'ʼn ' , 'Ŋ ' , 'ŋ ' , 'Œ ' , 'œ ' , 'Ŧ ' , 'ŧ ' , 'ƀ ' , 'Ɓ ' , 'Ƃ ' , 'ƃ ' , 'Ƈ ' , 'ƈ ' , 'Ɖ ' , 'Ɗ ' , 'Ƌ ' , 'ƌ ' , 'Ɛ ' , 'Ƒ ' , 'ƒ ' , 'Ɠ ' , 'ƕ ' , 'Ɩ ' , 'Ɨ ' , 'Ƙ ' , 'ƙ ' , 'ƚ ' , 'Ɲ ' , 'ƞ ' , 'Ƣ ' , 'ƣ ' , 'Ƥ ' , 'ƥ ' , 'ƫ ' , 'Ƭ ' , 'ƭ ' , 'Ʈ ' , 'Ʋ ' , 'Ƴ ' , 'ƴ ' , 'Ƶ ' , 'ƶ ' , 'DŽ ' , 'Dž ' , 'dž ' , 'Ǥ ' , 'ǥ ' , 'ȡ ' , 'Ȥ ' , 'ȥ ' , 'ȴ ' , 'ȵ ' , 'ȶ ' , 'ȷ ' , 'ȸ ' , 'ȹ ' , 'Ⱥ ' , 'Ȼ ' , 'ȼ ' , 'Ƚ ' , 'Ⱦ ' , 'ȿ ' , 'ɀ ' , 'Ƀ ' , 'Ʉ ' , 'Ɇ ' , 'ɇ ' , 'Ɉ ' , 'ɉ ' , 'Ɍ ' , 'ɍ ' , 'Ɏ ' , 'ɏ ' , 'ɓ ' , 'ɕ ' , 'ɖ ' , 'ɗ ' , 'ɛ ' , 'ɟ ' , 'ɠ ' , 'ɡ ' , 'ɢ ' , 'ɦ ' , 'ɧ ' , 'ɨ ' , 'ɪ ' , 'ɫ ' , 'ɬ ' , 'ɭ ' , 'ɱ ' , 'ɲ ' , 'ɳ ' , 'ɴ ' , 'ɶ ' , 'ɼ ' , 'ɽ ' , 'ɾ ' , 'ʀ ' , 'ʂ ' , 'ʈ ' , 'ʉ ' , 'ʋ ' , 'ʏ ' , 'ʐ ' , 'ʑ ' , 'ʙ ' , 'ʛ ' , 'ʜ ' , 'ʝ ' , 'ʟ ' , 'ʠ ' , 'ʣ ' , 'ʥ ' , 'ʦ ' , 'ʪ ' , 'ʫ ' , 'ᴀ ' , 'ᴁ ' , 'ᴃ ' , 'ᴄ ' , 'ᴅ ' , 'ᴆ ' , 'ᴇ ' , 'ᴊ ' , 'ᴋ ' , 'ᴌ ' , 'ᴍ ' , 'ᴏ ' , 'ᴘ ' , 'ᴛ ' , 'ᴜ ' , 'ᴠ ' , 'ᴡ ' , 'ᴢ ' , 'ᵫ ' , 'ᵬ ' , 'ᵭ ' , 'ᵮ ' , 'ᵯ ' , 'ᵰ ' , 'ᵱ ' , 'ᵲ ' , 'ᵳ ' , 'ᵴ ' , 'ᵵ ' , 'ᵶ ' , 'ᵺ ' , 'ᵻ ' , 'ᵽ ' , 'ᵾ ' , 'ᶀ ' , 'ᶁ ' , 'ᶂ ' , 'ᶃ ' , 'ᶄ ' , 'ᶅ ' , 'ᶆ ' , 'ᶇ ' , 'ᶈ ' , 'ᶉ ' , 'ᶊ ' , 'ᶌ ' , 'ᶍ ' , 'ᶎ ' , 'ᶏ ' , 'ᶑ ' , 'ᶒ ' , 'ᶓ ' , 'ᶖ ' , 'ᶙ ' , 'ẚ ' , 'ẜ ' , 'ẝ ' , 'ẞ ' , 'Ỻ ' , 'ỻ ' , 'Ỽ ' , 'ỽ ' , 'Ỿ ' , 'ỿ ' , '© ' , '® ' , '₠ ' , '₢ ' , '₣ ' , '₤ ' , '₧ ' , '₺ ' , '₹ ' , 'ℌ ' , '℞ ' , '㎧ ' , '㎮ ' , '㏆ ' , '㏗ ' , '㏞ ' , '㏟ ' , '¼ ' , '½ ' , '¾ ' , '⅓ ' , '⅔ ' , '⅕ ' , '⅖ ' , '⅗ ' , '⅘ ' , '⅙ ' , '⅚ ' , '⅛ ' , '⅜ ' , '⅝ ' , '⅞ ' , '⅟ ' , '〇 ' , '‘ ' , '’ ' , '‚ ' , '‛ ' , '“ ' , '” ' , '„ ' , '‟ ' , '′ ' , '″ ' , '〝 ' , '〞 ' , '« ' , '» ' , '‹ ' , '› ' , '‐ ' , '‑ ' , '‒ ' , '– ' , '— ' , '― ' , '︱ ' , '︲ ' , '﹘ ' , '‖ ' , '⁄ ' , '⁅ ' , '⁆ ' , '⁎ ' , '、 ' , '。 ' , '〈 ' , '〉 ' , '《 ' , '》 ' , '〔 ' , '〕 ' , '〘 ' , '〙 ' , '〚 ' , '〛 ' , '︑ ' , '︒ ' , '︹ ' , '︺ ' , '︽ ' , '︾ ' , '︿ ' , '﹀ ' , '﹑ ' , '﹝ ' , '﹞ ' , '⦅ ' , '⦆ ' , '。 ' , '、 ' , '× ' , '÷ ' , '− ' , '∕ ' , '∖ ' , '∣ ' , '∥ ' , '≪ ' , '≫ ' , '⦅ ' , '⦆ ' ];
52
+ private const TRANSLIT_TO = ['AE ' , 'D ' , 'O ' , 'TH ' , 'ss ' , 'ae ' , 'd ' , 'o ' , 'th ' , 'D ' , 'd ' , 'H ' , 'h ' , 'i ' , 'q ' , 'L ' , 'l ' , 'L ' , 'l ' , '\'n ' , 'N ' , 'n ' , 'OE ' , 'oe ' , 'T ' , 't ' , 'b ' , 'B ' , 'B ' , 'b ' , 'C ' , 'c ' , 'D ' , 'D ' , 'D ' , 'd ' , 'E ' , 'F ' , 'f ' , 'G ' , 'hv ' , 'I ' , 'I ' , 'K ' , 'k ' , 'l ' , 'N ' , 'n ' , 'OI ' , 'oi ' , 'P ' , 'p ' , 't ' , 'T ' , 't ' , 'T ' , 'V ' , 'Y ' , 'y ' , 'Z ' , 'z ' , 'DZ ' , 'Dz ' , 'dz ' , 'G ' , 'g ' , 'd ' , 'Z ' , 'z ' , 'l ' , 'n ' , 't ' , 'j ' , 'db ' , 'qp ' , 'A ' , 'C ' , 'c ' , 'L ' , 'T ' , 's ' , 'z ' , 'B ' , 'U ' , 'E ' , 'e ' , 'J ' , 'j ' , 'R ' , 'r ' , 'Y ' , 'y ' , 'b ' , 'c ' , 'd ' , 'd ' , 'e ' , 'j ' , 'g ' , 'g ' , 'G ' , 'h ' , 'h ' , 'i ' , 'I ' , 'l ' , 'l ' , 'l ' , 'm ' , 'n ' , 'n ' , 'N ' , 'OE ' , 'r ' , 'r ' , 'r ' , 'R ' , 's ' , 't ' , 'u ' , 'v ' , 'Y ' , 'z ' , 'z ' , 'B ' , 'G ' , 'H ' , 'j ' , 'L ' , 'q ' , 'dz ' , 'dz ' , 'ts ' , 'ls ' , 'lz ' , 'A ' , 'AE ' , 'B ' , 'C ' , 'D ' , 'D ' , 'E ' , 'J ' , 'K ' , 'L ' , 'M ' , 'O ' , 'P ' , 'T ' , 'U ' , 'V ' , 'W ' , 'Z ' , 'ue ' , 'b ' , 'd ' , 'f ' , 'm ' , 'n ' , 'p ' , 'r ' , 'r ' , 's ' , 't ' , 'z ' , 'th ' , 'I ' , 'p ' , 'U ' , 'b ' , 'd ' , 'f ' , 'g ' , 'k ' , 'l ' , 'm ' , 'n ' , 'p ' , 'r ' , 's ' , 'v ' , 'x ' , 'z ' , 'a ' , 'd ' , 'e ' , 'e ' , 'i ' , 'u ' , 'a ' , 's ' , 's ' , 'SS ' , 'LL ' , 'll ' , 'V ' , 'v ' , 'Y ' , 'y ' , '(C) ' , '(R) ' , 'CE ' , 'Cr ' , 'Fr. ' , 'L. ' , 'Pts ' , 'TL ' , 'Rs ' , 'x ' , 'Rx ' , 'm/s ' , 'rad/s ' , 'C/kg ' , 'pH ' , 'V/m ' , 'A/m ' , ' 1/4 ' , ' 1/2 ' , ' 3/4 ' , ' 1/3 ' , ' 2/3 ' , ' 1/5 ' , ' 2/5 ' , ' 3/5 ' , ' 4/5 ' , ' 1/6 ' , ' 5/6 ' , ' 1/8 ' , ' 3/8 ' , ' 5/8 ' , ' 7/8 ' , ' 1/ ' , '0 ' , '\'' , '\'' , ', ' , '\'' , '" ' , '" ' , ',, ' , '" ' , '\'' , '" ' , '" ' , '" ' , '<< ' , '>> ' , '< ' , '> ' , '- ' , '- ' , '- ' , '- ' , '- ' , '- ' , '- ' , '- ' , '- ' , '|| ' , '/ ' , '[ ' , '] ' , '* ' , ', ' , '. ' , '< ' , '> ' , '<< ' , '>> ' , '[ ' , '] ' , '[ ' , '] ' , '[ ' , '] ' , ', ' , '. ' , '[ ' , '] ' , '<< ' , '>> ' , '< ' , '> ' , ', ' , '[ ' , '] ' , '(( ' , ')) ' , '. ' , ', ' , '* ' , '/ ' , '- ' , '/ ' , '\\' , '| ' , '|| ' , '<< ' , '>> ' , '(( ' , ')) ' ];
46
53
47
54
private static $ transliterators = [];
48
55
@@ -83,9 +90,11 @@ public function ascii(array $rules = []): self
83
90
84
91
if (\function_exists ('transliterator_transliterate ' )) {
85
92
array_unshift ($ rules , 'nfd ' );
93
+ $ rules [] = 'latin-ascii ' ;
86
94
$ rules [] = 'any-latin/bgn ' ;
87
95
$ rules [] = 'nfkd ' ;
88
96
} else {
97
+ array_unshift ($ rules , 'latin-ascii ' );
89
98
array_unshift ($ rules , 'nfkd ' );
90
99
}
91
100
@@ -110,6 +119,8 @@ public function ascii(array $rules = []): self
110
119
normalizer_is_normalized ($ s , self ::NFKD ) ?: $ s = normalizer_normalize ($ s , self ::NFKD );
111
120
} elseif ('[:nonspacing mark:] remove ' === $ rule ) {
112
121
$ s = preg_replace ('/\p{Mn}++/u ' , '' , $ s );
122
+ } elseif ('latin-ascii ' === $ rule ) {
123
+ $ s = str_replace (self ::TRANSLIT_FROM , self ::TRANSLIT_TO , $ s );
113
124
} elseif ('de-ascii ' === $ rule ) {
114
125
$ s = preg_replace ("/([AUO]) \u{0308}(?=\p{Ll})/u " , '$1e ' , $ s );
115
126
$ s = str_replace (["a \u{0308}" , "o \u{0308}" , "u \u{0308}" , "A \u{0308}" , "O \u{0308}" , "U \u{0308}" ], ['ae ' , 'oe ' , 'ue ' , 'AE ' , 'OE ' , 'UE ' ], $ s );
@@ -130,12 +141,10 @@ public function ascii(array $rules = []): self
130
141
$ s = $ transliterator ->transliterate ($ s );
131
142
}
132
143
} elseif (!\function_exists ('iconv ' )) {
133
- $ s = str_replace (self ::TRANSLIT_FROM , self ::TRANSLIT_TO , $ s );
134
144
$ s = preg_replace ('/[^\x00-\x7F]/u ' , '? ' , $ s );
135
145
} elseif (\ICONV_IMPL === 'glibc ' ) {
136
146
$ s = iconv ('UTF-8 ' , 'ASCII//TRANSLIT ' , $ s );
137
147
} else {
138
- $ s = str_replace (self ::TRANSLIT_FROM , self ::TRANSLIT_TO , $ s );
139
148
$ s = preg_replace_callback ('/[^\x00-\x7F]/u ' , static function ($ c ) {
140
149
$ c = iconv ('UTF-8 ' , 'ASCII//IGNORE//TRANSLIT ' , $ c [0 ]);
141
150
0 commit comments