PKZ +8 helper/data/x0ca.phpnuW+A>', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '21', '22', '23', '24', '25', '26', '27', '28', '29', '30', '31', '32', '33', '34', '35', '(g)', '(n)', '(d)', '(r)', '(m)', '(b)', '(s)', '()', '(j)', '(c)', '(k)', '(t)', '(p)', '(h)', '(ga)', '(na)', '(da)', '(ra)', '(ma)', '(ba)', '(sa)', '(a)', '(ja)', '(ca)', '(ka)', '(ta)', '(pa)', '(ha)', '[?]', '[?]', '[?]', 'KIS ', '(1) ', '(2) ', '(3) ', '(4) ', '(5) ', '(6) ', '(7) ', '(8) ', '(9) ', '(10) ', '(Yue) ', '(Huo) ', '(Shui) ', '(Mu) ', '(Jin) ', '(Tu) ', '(Ri) ', '(Zhu) ', '(You) ', '(She) ', '(Ming) ', '(Te) ', '(Cai) ', '(Zhu) ', '(Lao) ', '(Mi) ', '(Nan) ', '(Nu) ', '(Shi) ', '(You) ', '(Yin) ', '(Zhu) ', '(Xiang) ', '(Xiu) ', '(Xie) ', '(Zheng) ', '(Shang) ', '(Zhong) ', '(Xia) ', '(Zuo) ', '(You) ', '(Yi) ', '(Zong) ', '(Xue) ', '(Jian) ', '(Qi) ', '(Zi) ', '(Xie) ', '(Ye) ', '36', '37', '38', '39', '40', '41', '42', '43', '44', '45', '46', '47', '48', '49', '50', '1M', '2M', '3M', '4M', '5M', '6M', '7M', '8M', '9M', '10M', '11M', '12M', 'Hg', 'erg', 'eV', 'LTD', 'a', 'i', 'u', 'u', 'o', 'ka', 'ki', 'ku', 'ke', 'ko', 'sa', 'si', 'su', 'se', 'so', 'ta', 'ti', 'tu', 'te', 'to', 'na', 'ni', 'nu', 'ne', 'no', 'ha', 'hi', 'hu', 'he', 'ho', 'ma', 'mi', 'mu', 'me', 'mo', 'ya', 'yu', 'yo', 'ra', 'ri', 'ru', 're', 'ro', 'wa', 'wi', 'we', 'wo']; PKZ7{Mhelper/data/x0ff.phpnuW+A', '?', '@', 'A', 'B', 'C', 'D', 'E', 'F', 'G', 'H', 'I', 'J', 'K', 'L', 'M', 'N', 'O', 'P', 'Q', 'R', 'S', 'T', 'U', 'V', 'W', 'X', 'Y', 'Z', '[', '\\', ']', '^', '_', '`', 'a', 'b', 'c', 'd', 'e', 'f', 'g', 'h', 'i', 'j', 'k', 'l', 'm', 'n', 'o', 'p', 'q', 'r', 's', 't', 'u', 'v', 'w', 'x', 'y', 'z', '{', '|', '}', '~', '[?]', '[?]', '.', '[', ']', ',', '*', 'wo', 'a', 'i', 'u', 'e', 'o', 'ya', 'yu', 'yo', 'tu', '+', 'a', 'i', 'u', 'e', 'o', 'ka', 'ki', 'ku', 'ke', 'ko', 'sa', 'si', 'su', 'se', 'so', 'ta', 'ti', 'tu', 'te', 'to', 'na', 'ni', 'nu', 'ne', 'no', 'ha', 'hi', 'hu', 'he', 'ho', 'ma', 'mi', 'mu', 'me', 'mo', 'ya', 'yu', 'yo', 'ra', 'ri', 'ru', 're', 'ro', 'wa', 'n', ':', ';', '', 'g', 'gg', 'gs', 'n', 'nj', 'nh', 'd', 'dd', 'r', 'lg', 'lm', 'lb', 'ls', 'lt', 'lp', 'rh', 'm', 'b', 'bb', 'bs', 's', 'ss', '', 'j', 'jj', 'c', 'k', 't', 'p', 'h', '[?]', '[?]', '[?]', 'a', 'ae', 'ya', 'yae', 'eo', 'e', '[?]', '[?]', 'yeo', 'ye', 'o', 'wa', 'wae', 'oe', '[?]', '[?]', 'yo', 'u', 'weo', 'we', 'wi', 'yu', '[?]', '[?]', 'eu', 'yi', 'i', '[?]', '[?]', '[?]', '/C', 'PS', '!', '-', '|', 'Y=', 'W=', '[?]', '|', '-', '|', '-', '|', '#', 'O', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '{', '|', '}', '', '', '', '']; PKZ4??helper/data/x002.phpnuW+A', '^', 'V', '^', 'V', '\'', '-', '/', '\\', ',', '_', '\\', '/', ':', '.', '`', '\'', '^', 'V', '+', '-', 'V', '.', '@', ',', '~', '"', 'R', 'X', 'G', 'l', 's', 'x', '?', '', '', '', '', '', '', '', 'V', '=', '"', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]']; PKZ˛helper/data/x08c.phpnuW+A 0, 'tk' => 1, 'th' => 0, 'ps' => 0, 'or' => 0, 'mn' => 0, 'ko' => 0, 'ky' => 0, 'hy' => 1, 'bn' => 5, 'be' => 0, 'am' => 0, 'ja' => 0, 'zh' => 0, 'nl' => 1, 'it' => 1, 'mk' => 1, 'pt' => 1, 'el__greeklish' => 2, 'el' => 2, 'hi' => 2, 'sv' => 1, 'tr' => 1, 'bg' => 2, 'hu' => 1, 'my' => 5, 'hr' => 2, 'fi' => 1, 'ka' => 1, 'ru' => 1, 'ru__gost_2000_b' => 1, 'ru__passport_2013' => 1, 'uk' => 1, 'kk' => 1, 'cs' => 1, 'da' => 1, 'pl' => 1, 'ro' => 1, 'eo' => 1, 'et' => 1, 'lv' => 1, 'lt' => 1, 'no' => 1, 'vi' => 1, 'ar' => 1, 'fa' => 1, 'sr' => 1, 'sr__cyr' => 1, 'sr__lat' => 1, 'az' => 1, 'sk' => 1, 'fr' => 1, 'fr_at' => 1, 'fr_ch' => 1, 'de' => 1, 'de_at' => 1, 'de_ch' => 1, 'en' => 0, 'latin' => 3, ' ' => 1, 'msword' => 1, ]; PKZ(O3helper/data/x022.phpnuW+A=', '<=', '>=', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]']; PKZž,77helper/data/x072.phpnuW+A', '[?]', '[?]', '[?]', 'f', 'v', 'u', 'yr', 'y', 'w', 'th', 'th', 'a', 'o', 'ac', 'ae', 'o', 'o', 'o', 'oe', 'on', 'r', 'k', 'c', 'k', 'g', 'ng', 'g', 'g', 'w', 'h', 'h', 'h', 'h', 'n', 'n', 'n', 'i', 'e', 'j', 'g', 'ae', 'a', 'eo', 'p', 'z', 's', 's', 's', 'c', 'z', 't', 't', 'd', 'b', 'b', 'p', 'p', 'e', 'm', 'm', 'm', 'l', 'l', 'ng', 'ng', 'd', 'o', 'ear', 'ior', 'qu', 'qu', 'qu', 's', 'yr', 'yr', 'yr', 'q', 'x', '.', ':', '+', '17', '18', '19', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]']; PKZޕ"  helper/data/x0ae.phpnuW+A', '?', '@', 'A', 'B', 'C', 'D', 'E', 'F', 'G', 'H', 'I', 'J', 'K', 'L', 'M', 'N', 'O', 'P', 'Q', 'R', 'S', 'T', 'U', 'V', 'W', 'X', 'Y', 'Z', '[', '\\', ']', '^', '_', '`', 'a', 'b', 'c', 'd', 'e', 'f', 'g', 'h', 'i', 'j', 'k', 'l', 'm', 'n', 'o', 'p', 'q', 'r', 's', 't', 'u', 'v', 'w', 'x', 'y', 'z', '{', '|', '}', '~', '', 'EUR', // "\xc2\x80" => "\xe2\x82\xac" => EURO SIGN '', ',', 'f', ',,', // "\xc2\x84" => "\xe2\x80\x9e" => DOUBLE LOW-9 QUOTATION MARK '...', // "\xc2\x85" => "\xe2\x80\xa6" => HORIZONTAL ELLIPSIS '+', '++', // "\xc2\x87" => "\xe2\x80\xa1" => DOUBLE DAGGER '^', '%0', // "\xc2\x89" => "\xe2\x80\xb0" => PER MILLE SIGN 'S', '<', 'OE', // "\xc2\x8c" => "\xc5\x92" => LATIN CAPITAL LIGATURE OE '', 'Z', '', '', '\'', // "\xc2\x91" => "\xe2\x80\x98" => LEFT SINGLE QUOTATION MARK '\'', // "\xc2\x92" => "\xe2\x80\x99" => RIGHT SINGLE QUOTATION MARK '"', '"', '*', '-', '--', // "\xc2\x97" => "\xe2\x80\x94" => EM DASH '~', 'tm', 's', '>', 'oe', '', 'z', 'Y', ' ', '!', 'C/', 'PS', '$?', 'Y=', '|', 'SS', '"', '(c)', 'a', '<<', '!', '', '(r)', '-', 'deg', '+-', '2', '3', '\'', 'u', 'P', '*', ',', '1', 'o', '>>', '1/4', '1/2', '3/4', '?', 'A', 'A', 'A', 'A', // Not "AE" - used in languages other than German 'A', 'A', 'AE', 'C', 'E', 'E', 'E', 'E', 'I', 'I', 'I', 'I', 'D', 'N', 'O', 'O', 'O', 'O', // Not "OE" - used in languages other than German 'O', 'x', 'O', 'U', 'U', 'U', // Not "UE" - used in languages other than German 'U', 'Y', 'Th', 'ss', 'a', 'a', 'a', 'a', // Not "ae" - used in languages other than German 'a', 'a', 'ae', 'c', 'e', 'e', 'e', 'e', 'i', 'i', 'i', 'i', 'd', 'n', 'o', 'o', 'o', 'o', // Not "oe" - used in languages other than German 'o', '/', 'o', 'u', 'u', 'u', // Not "ue" - used in languages other than German 'u', 'y', 'th', 'y', ]; PKZLLhelper/data/x0b2.phpnuW+A', '.', '..', '...', '.', "\n", "\n\n", '', '', '', '', '', ' ', '%0', '%00', '\'', '\'\'', '\'\'\'', '`', '``', '```', '^', '<', '>', '*', '!!', '!?', '-', '_', '-', '^', '***', '--', '/', '-[', ']-', '??', '?!', '!?', '7', 'PP', '(]', '[)', '*', '[?]', '[?]', '[?]', '%', '~', '[?]', '[?]', '[?]', "''''", // 0x57 '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', ' ', '', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '', '', '', '', '', '', '0', 'i', '', '', '4', '5', '6', '7', '8', '9', '+', '-', '=', '(', ')', 'n', '0', '1', '2', '3', '4', '5', '6', '7', '8', '9', '+', '-', '=', '(', ')', '[?]', 'a', 'e', 'o', 'x', '[?]', 'h', 'k', 'l', 'm', 'n', 'p', 's', 't', '[?]', '[?]', '[?]', 'ECU', 'CL', 'Cr', 'Fr.', 'L.', 'mil', 'N', 'Pts', 'Rs', 'W', 'NS', 'D', 'EUR', 'K', 'T', 'Dr', 'Pf', 'P', 'G', 'A', 'UAH', 'C|', 'L', 'Sm', 'T', 'Rs', 'L', 'M', 'm', 'R', 'l', 'BTC', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '[?]', '', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', ]; PKZ)D6""helper/data/x065.phpnuW+A ', '<<', '>> ', '[', '] ', '{', '} ', '[(', ')] ', '@', 'X ', '[', '] ', '[[', ']] ', '((', ')) ', '[[', ']] ', '~ ', '``', '\'\'', ',,', '@', '1', '2', '3', '4', '5', '6', '7', '8', '9', '', '', '', '', '', '', '~', '+', '+', '+', '+', '', '@', ' // ', '+10+', '+20+', '+30+', '[?]', '[?]', '[?]', '', '', '[?]', 'a', 'a', 'i', 'i', 'u', 'u', 'e', 'e', 'o', 'o', 'ka', 'ga', 'ki', 'gi', 'ku', 'gu', 'ke', 'ge', 'ko', 'go', 'sa', 'za', 'shi', // 0x57 'zi', 'su', 'zu', 'se', 'ze', 'so', 'zo', 'ta', 'da', 'chi', // 0x61 'di', 'tsu', // 0x63 'tsu', // 0x64 'du', 'te', 'de', 'to', 'do', 'na', 'ni', 'nu', 'ne', 'no', 'ha', 'ba', 'pa', 'hi', 'bi', 'pi', 'hu', 'bu', 'pu', 'he', 'be', 'pe', 'ho', 'bo', 'po', 'ma', 'mi', 'mu', 'me', 'mo', 'ya', 'ya', 'yu', 'yu', 'yo', 'yo', 'ra', 'ri', 'ru', 're', 'ro', 'wa', 'wa', 'wi', 'we', 'wo', 'n', 'vu', '[?]', '[?]', '[?]', '[?]', '', '', '', '', '"', '"', '[?]', '[?]', 'a', 'a', 'i', 'i', 'u', 'u', 'e', 'e', 'o', 'o', 'ka', 'ga', 'ki', 'gi', 'ku', 'gu', 'ke', 'ge', 'ko', 'go', 'sa', 'za', 'shi', // 0xb7 'zi', 'su', 'zu', 'se', 'ze', 'so', 'zo', 'ta', 'da', 'chi', // 0xc1 'di', 'tsu', // 0xc3 'tsu', // 0xc4 'du', 'te', 'de', 'to', 'do', 'na', 'ni', 'nu', 'ne', 'no', 'ha', 'ba', 'pa', 'hi', 'bi', 'pi', 'hu', 'bu', 'pu', 'he', 'be', 'pe', 'ho', 'bo', 'po', 'ma', 'mi', 'mu', 'me', 'mo', 'ya', 'ya', 'yu', 'yu', 'yo', 'yo', 'ra', 'ri', 'ru', 're', 'ro', 'wa', 'wa', 'wi', 'we', 'wo', 'n', 'vu', 'ka', 'ke', 'va', 'vi', 've', 'vo', '', '', '"', '"', ]; PKZD''helper/data/x06c.phpnuW+A ', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]']; PKZ<<helper/data/x07f.phpnuW+A [ '=' => ' gelijk ', '%' => ' procent ', '∑' => ' som ', '∆' => ' delta ', '∞' => ' oneindig ', '♥' => ' love ', '&' => ' en ', '+' => ' plus ', ], // Italian 'it' => [ '=' => ' uguale ', '%' => ' percent ', '∑' => ' somma ', '∆' => ' delta ', '∞' => ' infinito ', '♥' => ' amore ', '&' => ' e ', '+' => ' piu ', ], // Macedonian 'mk' => [ '=' => ' ednakva ', '%' => ' procenti ', '∑' => ' zbir ', '∆' => ' delta ', '∞' => ' beskonecnost ', '♥' => ' loveubov ', '&' => ' i ', '+' => ' plus ', ], // Portuguese (Brazil) 'pt' => [ '=' => ' igual ', '%' => ' por cento ', '∑' => ' soma ', '∆' => ' delta ', '∞' => ' infinito ', '♥' => ' amor ', '&' => ' e ', '+' => ' mais ', ], // Greek(lish) (Elláda) 'el__greeklish' => [ '=' => ' isos ', '%' => ' tois ekato ', '∑' => ' athroisma ', '∆' => ' delta ', '∞' => ' apeiro ', '♥' => ' agape ', '&' => ' kai ', '+' => ' syn ', ], // Greek (Elláda) 'el' => [ '=' => ' isos ', '%' => ' tois ekato ', '∑' => ' athroisma ', '∆' => ' delta ', '∞' => ' apeiro ', '♥' => ' agape ', '&' => ' kai ', '+' => ' syn ', ], // Hindi 'hi' => [ '=' => ' samana ', '%' => ' paratisata ', '∑' => ' yoga ', '∆' => ' dalata ', '∞' => ' anata ', '♥' => ' payara ', '&' => ' aura ', '+' => ' palasa ', ], // Armenian 'hy' => [ '=' => ' havasar ', '%' => ' tvokvos ', '∑' => ' gvoumar ', '∆' => ' delta ', '∞' => ' ansahmanvouthyvoun ', '♥' => ' ser ', '&' => ' ev ', '+' => ' gvoumarats ', ], // Swedish 'sv' => [ '=' => ' lika ', '%' => ' procent ', '∑' => ' summa ', '∆' => ' delta ', '∞' => ' oandlighet ', '♥' => ' alskar ', '&' => ' och ', '+' => ' plus ', ], // Turkmen 'tk' => [ '=' => ' den ', '%' => ' yuzde ', '∑' => ' jem ', '∆' => ' delta ', '∞' => ' mudimilik ', '♥' => ' soygi ', '&' => ' we ', '+' => ' yzy ', ], // Turkish 'tr' => [ '=' => ' esit ', '%' => ' yuzde ', '∑' => ' Toplam ', '∆' => ' delta ', '∞' => ' sonsuzluk ', '♥' => ' ask ', '&' => ' ve ', '+' => ' arti ', ], // Bulgarian 'bg' => [ '=' => ' raven ', '%' => ' na sto ', '∑' => ' suma ', '∆' => ' delta ', '∞' => ' bezkrajnost ', '♥' => ' obicam ', '&' => ' i ', '+' => ' plus ', ], // Hungarian 'hu' => [ '=' => ' Egyenlo ', '%' => ' Szazalek ', '∑' => ' osszeg ', '∆' => ' delta ', '∞' => ' vegtelenitett ', '♥' => ' love ', '&' => ' Es ', '+' => ' Plusz ', ], // Myanmar (Burmese) 'my' => [ '=' => ' ttn:ttnnym? ', '%' => ' raakhngnn:k ', '∑' => ' ld ', '∆' => ' m?cwk?n:pe? ', '∞' => ' ach:m ', '♥' => ' mettttaa ', '&' => ' n ', '+' => ' ape?ng: ', ], // Croatian (Hrvatska) 'hr' => [ '=' => ' Jednaki ', '%' => ' Posto ', '∑' => ' zbroj ', '∆' => ' Delta ', '∞' => ' beskonacno ', '♥' => ' ljubav ', '&' => ' I ', '+' => ' Plus ', ], // Finnish 'fi' => [ '=' => ' Sama ', '%' => ' Prosenttia ', '∑' => ' sum ', '∆' => ' delta ', '∞' => ' aareton ', '♥' => ' rakkautta ', '&' => ' Ja ', '+' => ' Plus ', ], // Georgian (Kartvelian) 'ka' => [ '=' => ' tanasts\'ori ', '%' => ' p\'rotsent\'i ', '∑' => ' tankha ', '∆' => ' delt\'a ', '∞' => ' usasrulo ', '♥' => ' siq\'varuli ', '&' => ' da ', '+' => ' p\'lus ', ], // Russian 'ru' => [ '=' => ' ravnyj ', '%' => ' procent ', '∑' => ' summa ', '∆' => ' del\'ta ', '∞' => ' beskonecnost\' ', '♥' => ' lublu ', '&' => ' i ', '+' => ' plus ', ], // Russian - GOST 7.79-2000(B) 'ru__gost_2000_b' => [ '=' => ' ravnyj ', '%' => ' procent ', '∑' => ' summa ', '∆' => ' del\'ta ', '∞' => ' beskonecnost\' ', '♥' => ' lublu ', '&' => ' i ', '+' => ' plus ', ], // Russian - Passport (2013), ICAO 'ru__passport_2013' => [ '=' => ' ravnyj ', '%' => ' procent ', '∑' => ' summa ', '∆' => ' del\'ta ', '∞' => ' beskonecnost\' ', '♥' => ' lublu ', '&' => ' i ', '+' => ' plus ', ], // Ukrainian 'uk' => [ '=' => ' rivnij ', '%' => ' vidsotkiv ', '∑' => ' suma ', '∆' => ' del\'ta ', '∞' => ' neskincennist\' ', '♥' => ' lubov ', '&' => ' i ', '+' => ' plus ', ], // Kazakh 'kk' => [ '=' => ' ten\' ', '%' => ' Pajyzdar ', '∑' => ' zalpy ', '∆' => ' ajyrmasylyk, ', '∞' => ' seksiz ', '♥' => ' mahabbat ', '&' => ' z@ne ', '+' => ' plus ', ], // Czech 'cs' => [ '=' => ' rovnat se ', '%' => ' procento ', '∑' => ' soucet ', '∆' => ' delta ', '∞' => ' nekonecno ', '♥' => ' laska ', '&' => ' a ', '+' => ' plus ', ], // Danish 'da' => [ '=' => ' Lige ', '%' => ' Prozent ', '∑' => ' sum ', '∆' => ' delta ', '∞' => ' uendelig ', '♥' => ' kaerlighed ', '&' => ' Og ', '+' => ' Plus ', ], // Polish 'pl' => [ '=' => ' rowny ', '%' => ' procent ', '∑' => ' suma ', '∆' => ' delta ', '∞' => ' nieskonczonosc ', '♥' => ' milosc ', '&' => ' i ', '+' => ' plus ', ], // Romanian 'ro' => [ '=' => ' egal ', '%' => ' la suta ', '∑' => ' suma ', '∆' => ' delta ', '∞' => ' infinit ', '♥' => ' dragoste ', '&' => ' si ', '+' => ' la care se adauga ', ], // Esperanto 'eo' => [ '=' => ' Egalaj ', '%' => ' Procento ', '∑' => ' sumo ', '∆' => ' delto ', '∞' => ' senfina ', '♥' => ' amo ', '&' => ' Kaj ', '+' => ' Pli ', ], // Estonian 'et' => [ '=' => ' Vordsed ', '%' => ' Protsenti ', '∑' => ' summa ', '∆' => ' o ', '∞' => ' loputut ', '♥' => ' armastus ', '&' => ' Ja ', '+' => ' Pluss ', ], // Latvian 'lv' => [ '=' => ' vienads ', '%' => ' procents ', '∑' => ' summa ', '∆' => ' delta ', '∞' => ' bezgaliba ', '♥' => ' milestiba ', '&' => ' un ', '+' => ' pluss ', ], // Lithuanian 'lt' => [ '=' => ' lygus ', '%' => ' procentu ', '∑' => ' suma ', '∆' => ' delta ', '∞' => ' begalybe ', '♥' => ' meile ', '&' => ' ir ', '+' => ' plius ', ], // Norwegian 'no' => [ '=' => ' Lik ', '%' => ' Prosent ', '∑' => ' sum ', '∆' => ' delta ', '∞' => ' uendelig ', '♥' => ' kjaerlighet ', '&' => ' Og ', '+' => ' Pluss ', ], // Vietnamese 'vi' => [ '=' => ' cong bang ', '%' => ' phan tram ', '∑' => ' tong so ', '∆' => ' dong bang ', '∞' => ' vo cuc ', '♥' => ' Yeu ', '&' => ' va ', '+' => ' them ', ], // Arabic 'ar' => [ '=' => ' mtsawy ', '%' => ' nsbh mywyh ', '∑' => ' mjmw\' ', '∆' => ' dlta ', '∞' => ' ma la nhayt ', '♥' => ' hb ', '&' => ' w ', '+' => ' zayd ', ], // Persian (Farsi) 'fa' => [ '=' => ' brabr ', '%' => ' dr sd ', '∑' => ' mjmw\' ', '∆' => ' dlta ', '∞' => ' by nhayt ', '♥' => ' \'shq ', '&' => ' w ', '+' => ' bh \'lawh ', ], // Serbian 'sr' => [ '=' => ' jednak ', '%' => ' procenat ', '∑' => ' zbir ', '∆' => ' delta ', '∞' => ' beskraj ', '♥' => ' lubav ', '&' => ' i ', '+' => ' vise ', ], // Serbian - Cyrillic 'sr__cyr' => [ '=' => ' jednak ', '%' => ' procenat ', '∑' => ' zbir ', '∆' => ' delta ', '∞' => ' beskraj ', '♥' => ' lubav ', '&' => ' i ', '+' => ' vise ', ], // Serbian - Latin 'sr__lat' => [ '=' => ' jednak ', '%' => ' procenat ', '∑' => ' zbir ', '∆' => ' delta ', '∞' => ' beskraj ', '♥' => ' lubav ', '&' => ' i ', '+' => ' vise ', ], // Azerbaijani 'az' => [ '=' => ' b@rab@r ', '%' => ' faiz ', '∑' => ' m@bl@g ', '∆' => ' delta ', '∞' => ' sonsuzluq ', '♥' => ' sevgi ', '&' => ' v@ ', '+' => ' plus ', ], // Slovak 'sk' => [ '=' => ' rovny ', '%' => ' percento ', '∑' => ' sucet ', '∆' => ' delta ', '∞' => ' infinity ', '♥' => ' milovat ', '&' => ' a ', '+' => ' viac ', ], // French 'fr' => [ '=' => ' Egal ', '%' => ' Pourcentage ', '∑' => ' somme ', '∆' => ' delta ', '∞' => ' infini ', '♥' => ' amour ', '&' => ' Et ', '+' => ' Plus ', ], // Austrian (French) 'fr_at' => [ '=' => ' Egal ', '%' => ' Pourcentage ', '∑' => ' somme ', '∆' => ' delta ', '∞' => ' infini ', '♥' => ' amour ', '&' => ' Et ', '+' => ' Plus ', ], // Switzerland (French) 'fr_ch' => [ '=' => ' Egal ', '%' => ' Pourcentage ', '∑' => ' somme ', '∆' => ' delta ', '∞' => ' infini ', '♥' => ' amour ', '&' => ' Et ', '+' => ' Plus ', ], // German 'de' => [ '=' => ' gleich ', '%' => ' Prozent ', '∑' => ' gesamt ', '∆' => ' Unterschied ', '∞' => ' undendlich ', '♥' => ' liebe ', '&' => ' und ', '+' => ' plus ', ], // Austrian (German) 'de_at' => [ '=' => ' gleich ', '%' => ' Prozent ', '∑' => ' gesamt ', '∆' => ' Unterschied ', '∞' => ' undendlich ', '♥' => ' liebe ', '&' => ' und ', '+' => ' plus ', ], // Switzerland (German) 'de_ch' => [ '=' => ' gleich ', '%' => ' Prozent ', '∑' => ' gesamt ', '∆' => ' Unterschied ', '∞' => ' undendlich ', '♥' => ' liebe ', '&' => ' und ', '+' => ' plus ', ], // Bengali (Bangla) 'bn' => [ '=' => ' Saman ', '%' => ' Satakora ', '∑' => ' Samasti ', '∆' => ' Badhip ', '∞' => ' Ananta ', '♥' => ' Valobasa ', '&' => ' Abong ', '+' => ' Songzojon ', ], // English 'en' => [ '=' => ' equal ', '%' => ' percent ', '∑' => ' sum ', '∆' => ' delta ', '∞' => ' infinity ', '♥' => ' love ', '&' => ' and ', '+' => ' plus ', ], // Currency // // url: https://en.wikipedia.org/wiki/Currency_symbol 'currency' => [ '€' => ' Euro ', '$' => ' Dollar ', '₢' => ' cruzeiro ', '₣' => ' French franc ', '£' => ' pound ', '₤' => ' lira ', // Italian '₶' => ' livre tournois ', 'ℳ' => ' mark ', '₥' => ' mill ', '₦' => ' naira ', '₧' => ' peseta ', '₨' => ' rupee ', 'රු' => ' rupee ', // Sri Lankan 'ரூ' => ' rupee ', // Sri Lankan '௹' => ' rupee ', // Tamil 'रू' => ' rupee ', // Nepalese '₹' => ' rupee ', // Indian '૱' => ' rupee ', // Gujarat '₩' => ' won ', '₪' => ' new shequel ', '₸' => ' tenge ', '₫' => ' dong ', '֏' => ' dram ', '₭' => ' kip ', '₺' => ' lira ', // Turkish '₼' => ' manat ', '₮' => ' tugrik ', '₯' => ' drachma ', '₰' => ' pfennig ', '₷' => ' spesmilo ', '₱' => ' peso ', // Philippine '﷼‎' => ' riyal ', '₲' => ' guarani ', '₾' => ' lari ', '₳' => ' austral ', '₴' => ' hryvnia ', '₽' => ' ruble ', '₵' => ' cedi ', '₡' => ' colon ', '¢' => ' cent ', '¥' => ' yen ', '円' => ' yen ', '৳' => ' taka ', '元' => ' yuan ', '﷼' => ' riyal ', '៛' => ' riel ', '₠' => ' European Currency ', '¤' => ' currency ', '฿' => ' baht ', '؋' => ' afghani ', ], // Temperature // // url: https://en.wikipedia.org/wiki/Conversion_of_units_of_temperature 'temperature' => [ '°De' => ' Delisle ', '°Re' => ' Reaumur ', // Réaumur '°Ro' => ' Romer ', // Rømer '°R' => ' Rankine ', '°C' => ' Celsius ', '°F' => ' Fahrenheit ', '°N' => ' Newton ', ], 'latin_symbols' => [ '=' => '=', '%' => '%', '∑' => '∑', '∆' => '∆', '∞' => '∞', '♥' => '♥', '&' => '&', '+' => '+', // --- '©' => ' (c) ', '®' => ' (r) ', '@' => ' (at) ', '№' => ' No. ', '℞' => ' Rx ', '[' => '[', '\' => '\\', ']' => ']', '^' => '^', '_' => '_', '`' => '`', '‐' => '-', '‑' => '-', '‒' => '-', '–' => '-', '−' => '-', '—' => '-', '―' => '-', '﹘' => '-', '│' => '|', '∖' => '\\', '∕' => '/', '⁄' => '/', '←' => '<-', '→' => '->', '↑' => '|', '↓' => '|', '⁅' => '[', '⁆' => ']', '⁎' => '*', '、' => ',', '。' => '.', '〈' => '<', '〉' => '>', '《' => '<<', '》' => '>>', '〔' => '[', '〕' => ']', '〘' => '[', '〙' => ']', '〚' => '[', '〛' => ']', '﹝' => '[', '﹞' => ']', '︹' => '[', '︺' => ']', '﹇' => '[', '﹈' => ']', '︐' => ',', '︑' => ',', '︒' => '.', '︓' => ':', '︔' => ';', '︕' => '!', '︖' => '?', '︙' => '...', '︰' => '..', '︵' => '(', '︶' => ')', '﹙' => '(', '﹚' => ')', '︷' => '{', '︸' => '}', '﹛' => '{', '﹜' => '}', '︽' => '<<', '︾' => '>>', '︿' => '<', '﹀' => '>', '×' => '*', '÷' => '/', '≪' => '<<', '≫' => '>>', '⦅' => '((', '⦆' => '))', '〇' => '0', '′' => '\'', '〝' => '"', '〞' => '"', '«' => '<<', '»' => '>>', '‘' => "'", '’' => "'", '‚' => ',', '‛' => "'", '“' => '"', '”' => '"', '„' => '"', '‟' => '"', '‹' => '<', '›' => '>', '․' => '.', '‥' => '..', '…' => '...', '″' => '"', '‴' => '\'\'\'', '‶' => '``', '‷' => '```', '‼' => '!!', '⁇' => '??', '⁈' => '?!', '⁉' => '!?', '⁗' => '````', '⩴' => '::=', '⩵' => '==', '⩶' => '===', '﹔' => ';', '﹕' => ':', '﹖' => '?', '﹗' => '!', '﹍' => '_', '﹎' => '_', '﹏' => '_', '﹐' => ',', '﹑' => ',', '﹒' => '.', '﹟' => '#', '﹠' => '&', '﹡' => '*', '﹢' => '+', '﹣' => '-', '﹤' => '<', '﹥' => '>', '﹦' => '=', '﹨' => '\\', '﹩' => '$', '﹪' => '%', '﹫' => '@', '!' => '!', '"' => '"', '#' => '#', '$' => '$', '%' => '%', '&' => '&', ''' => '\'', '(' => '(', ')' => ')', '*' => '*', '+' => '+', ',' => ',', '-' => '-', '.' => '.', '/' => '/', ':' => ':', ';' => ';', '<' => '<', '=' => '=', '>' => '>', '?' => '?', '@' => '@', '{' => '{', '|' => '|', '}' => '}', '~' => '~', '⦅' => '((', '⦆' => '))', '¬' => '!', ' ̄' => '-', '¦' => '|', '■' => '#', ], ]; PKZhelper/data/x0ad.phpnuW+A', '>', '>', '>', '>', '>', 'V', 'V', 'V', 'V', '<', '<', '<', '<', '<', '<', '*', '*', '*', '*', '*', '*', '*', '*', '*', '*', '*', '*', '*', '*', '*', '*', '*', '*', '*', '*', '*', '*', '*', '*', '*', '*', '*', '*', '*', '*', '*', '*', '*', '#', '#', '#', '#', '#', '^', '^', '^', 'O', '#', '#', '#', '#', 'O', 'O', 'O', 'O', '/', '\\\\', '\\\\', '#', '#', '#', '#', '/']; PKZJصhelper/data/x0b0.phpnuW+A{877helper/data/x001.phpnuW+A', '%', '[?]', '[?]', '>', '=', '[?]', '/', '-', '~', '\\', '/', '~', '~', '|-', '-|', '[?]', '[?]', '[?]', '[?]', '<=', '=>', '((', '))', '[?]', '[?]', '::', '[?]', '?', '\'', 'o', '.', ',', '.', ',', ';', '[?]', '[?]', '[?]', '[?]', '----', '------', 'x', '|', '[?]', '[?]', '=', ',', '"', '`--', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?] ', '[?] ', '[?] ', '[?] ', '[?] ', '[?] ', '[?] ', '[?] ', '[?] ', '[?] ', '[?] ', '[?] ', '[?] ', '[?] ', '[?] ', '[?] ', '[?] ', '[?] ', '[?] ', '[?] ', '[?] ', '[?] ', '[?] ', '[?] ', '[?] ', '[?] ', '[?]', '[?] ', '[?] ', '[?] ', '[?] ', '[?] ', '[?] ', '[?] ', '[?] ', '[?] ', '[?] ', '[?] ', '[?] ', '[?] ', '[?] ', '[?] ', '[?] ', '[?] ', '[?] ', '[?] ', '[?] ', '[?] ', '[?] ', '[?] ', '[?] ', '[?] ', '[?] ', '[?] ', '[?] ', '[?] ', '[?] ', '[?] ', '[?] ', '[?] ', '[?] ', '[?] ', '[?] ', '[?] ', '[?] ', '[?] ', '[?] ', '[?] ', '[?] ', '[?] ', '[?] ', '[?] ', '[?] ', '[?] ', '[?] ', '[?] ', '[?] ', '[?] ', '[?] ', '[?] ', '[?] ', '[?] ', '[?] ', '[?] ', '[?] ', '[?] ', '[?] ', '[?] ', '[?] ', '[?] ', '[?] ', '[?] ', '[?] ', '[?] ', '[?] ', '[?] ', '[?] ', '[?] ', '[?] ', '[?] ', '[?] ', '[?] ', '[?] ', '[?] ', '[?] ', '[?] ', '[?] ', '[?] ', '[?] ', '[?] ', '[?] ', '[?] ', '[?] ', '[?] ', '[?] ', '[?] ', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]']; PKZNGhelper/data/x067.phpnuW+A', 'n', 't', 'q', ',', '*', '5', '<', '-', 'u', '8', 'v', '.', '%', '[', '$', '+', 'x', '!', '&', ';', ':', '4', '\\', '0', 'z', '7', '(', '_', '?', 'w', ']', '#', 'y', ')', '=', '[d7]', '[d17]', '[d27]', '[d127]', '[d37]', '[d137]', '[d237]', '[d1237]', '[d47]', '[d147]', '[d247]', '[d1247]', '[d347]', '[d1347]', '[d2347]', '[d12347]', '[d57]', '[d157]', '[d257]', '[d1257]', '[d357]', '[d1357]', '[d2357]', '[d12357]', '[d457]', '[d1457]', '[d2457]', '[d12457]', '[d3457]', '[d13457]', '[d23457]', '[d123457]', '[d67]', '[d167]', '[d267]', '[d1267]', '[d367]', '[d1367]', '[d2367]', '[d12367]', '[d467]', '[d1467]', '[d2467]', '[d12467]', '[d3467]', '[d13467]', '[d23467]', '[d123467]', '[d567]', '[d1567]', '[d2567]', '[d12567]', '[d3567]', '[d13567]', '[d23567]', '[d123567]', '[d4567]', '[d14567]', '[d24567]', '[d124567]', '[d34567]', '[d134567]', '[d234567]', '[d1234567]', '[d8]', '[d18]', '[d28]', '[d128]', '[d38]', '[d138]', '[d238]', '[d1238]', '[d48]', '[d148]', '[d248]', '[d1248]', '[d348]', '[d1348]', '[d2348]', '[d12348]', '[d58]', '[d158]', '[d258]', '[d1258]', '[d358]', '[d1358]', '[d2358]', '[d12358]', '[d458]', '[d1458]', '[d2458]', '[d12458]', '[d3458]', '[d13458]', '[d23458]', '[d123458]', '[d68]', '[d168]', '[d268]', '[d1268]', '[d368]', '[d1368]', '[d2368]', '[d12368]', '[d468]', '[d1468]', '[d2468]', '[d12468]', '[d3468]', '[d13468]', '[d23468]', '[d123468]', '[d568]', '[d1568]', '[d2568]', '[d12568]', '[d3568]', '[d13568]', '[d23568]', '[d123568]', '[d4568]', '[d14568]', '[d24568]', '[d124568]', '[d34568]', '[d134568]', '[d234568]', '[d1234568]', '[d78]', '[d178]', '[d278]', '[d1278]', '[d378]', '[d1378]', '[d2378]', '[d12378]', '[d478]', '[d1478]', '[d2478]', '[d12478]', '[d3478]', '[d13478]', '[d23478]', '[d123478]', '[d578]', '[d1578]', '[d2578]', '[d12578]', '[d3578]', '[d13578]', '[d23578]', '[d123578]', '[d4578]', '[d14578]', '[d24578]', '[d124578]', '[d34578]', '[d134578]', '[d234578]', '[d1234578]', '[d678]', '[d1678]', '[d2678]', '[d12678]', '[d3678]', '[d13678]', '[d23678]', '[d123678]', '[d4678]', '[d14678]', '[d24678]', '[d124678]', '[d34678]', '[d134678]', '[d234678]', '[d1234678]', '[d5678]', '[d15678]', '[d25678]', '[d125678]', '[d35678]', '[d135678]', '[d235678]', '[d1235678]', '[d45678]', '[d145678]', '[d245678]', '[d1245678]', '[d345678]', '[d1345678]', '[d2345678]', '[d12345678]']; PKZ>+llhelper/data/x017.phpnuW+A> ', '<', '> ', '[', '] ', '{', '}', '[?]', '[?]', '[?]', '[?]', '', '', '', '', '', '', '', ',', ',', '.', '', ';', ':', '?', '!', '-', '(', ')', '{', '}', '{', '}', '#', '&', '*', '+', '-', '<', '>', '=', '', '\\', '$', '%', '@', '[?]', '[?]', '[?]', '[?]', '', '', '', '[?]', '', '[?]', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '[?]', '[?]', '']; PKZl''helper/data/x083.phpnuW+A 'w', 'x', 'y', 'z', 4 => 'A', 'B', 'C', 'D', 'E', 'F', 'G', 'H', 'I', 'J', 'K', 'L', 'M', 'N', 'O', 'P', 'Q', 'R', 'S', 'T', 'U', 'V', 'W', 'X', 'Y', 'Z', 30 => 'a', 'b', 'c', 'd', 'e', 'f', 'g', 'h', 'i', 'j', 'k', 'l', 'm', 'n', 'o', 'p', 'q', 'r', 's', 't', 'u', 'v', 'w', 'x', 'y', 'z', 56 => 'A', 'B', 'C', 'D', 'E', 'F', 'G', 'H', 'I', 'J', 'K', 'L', 'M', 'N', 'O', 'P', 'Q', 'R', 'S', 'T', 'U', 'V', 'W', 'X', 'Y', 'Z', 82 => 'a', 'b', 'c', 'd', 'e', 'f', 'g', 'h', 'i', 'j', 'k', 'l', 'm', 'n', 'o', 'p', 'q', 'r', 's', 't', 'u', 'v', 'w', 'x', 'y', 'z', 108 => 'A', 'B', 'C', 'D', 'E', 'F', 'G', 'H', 'I', 'J', 'K', 'L', 'M', 'N', 'O', 'P', 'Q', 'R', 'S', 'T', 'U', 'V', 'W', 'X', 'Y', 'Z', 134 => 'a', 'b', 'c', 'd', 'e', 'f', 'g', 'h', 'i', 'j', 'k', 'l', 'm', 'n', 'o', 'p', 'q', 'r', 's', 't', 'u', 'v', 'w', 'x', 'y', 'z', 160 => 'A', 'B', 'C', 'D', 'E', 'F', 'G', 'H', 'I', 'J', 'K', 'L', 'M', 'N', 'O', 'P', 'Q', 'R', 'S', 'T', 'U', 'V', 'W', 'X', 'Y', 'Z', 186 => 'a', 'b', 'c', 'd', 'e', 'f', 'g', 'h', 'i', 'j', 'k', 'l', 'm', 'n', 'o', 'p', 'q', 'r', 's', 't', 'u', 'v', 'w', 'x', 'y', 'z', 212 => 'A', 'B', 'C', 'D', 'E', 'F', 'G', 'H', 'I', 'J', 'K', 'L', 'M', 'N', 'O', 'P', 'Q', 'R', 'S', 'T', 'U', 'V', 'W', 'X', 'Y', 'Z', 238 => 'a', 'b', 'c', 'd', 'e', 'f', 'g', 'h', 'i', 'j', 'k', 'l', 'm', 'n', 'o', 'p', 'q', 'r', 's', 't', 'u', 'v', 'w', 'x', 'y', 'z', ]; PKZ2xlvvhelper/data/x0c9.phpnuW+AJJhelper/data/x058.phpnuW+A [ 'Á' => 'A', 'á' => 'a', 'Ä' => 'A', 'ä' => 'a', 'À' => 'A', 'à' => 'a', 'Â' => 'A', 'â' => 'a', 'É' => 'E', 'é' => 'e', 'Ë' => 'E', 'ë' => 'e', 'È' => 'E', 'è' => 'e', 'Ê' => 'E', 'ê' => 'e', 'Í' => 'I', 'í' => 'i', 'Ï' => 'I', 'ï' => 'i', 'Ì' => 'I', 'ì' => 'i', 'Î' => 'I', 'î' => 'i', 'Ó' => 'O', 'ó' => 'o', 'Ö' => 'O', 'ö' => 'o', 'Ò' => 'O', 'ò' => 'o', 'Ô' => 'O', 'ô' => 'o', 'Ú' => 'U', 'ú' => 'u', 'Ü' => 'U', 'ü' => 'u', 'Ù' => 'U', 'ù' => 'u', 'Û' => 'U', 'û' => 'u', 'Ý' => 'Y', 'ý' => 'y', 'Ÿ' => 'Y', ], // Italian 'it' => [ 'à' => 'a', 'À' => 'A', 'é' => 'e', 'É' => 'E', 'è' => 'e', 'È' => 'E', 'ì' => 'i', 'Ì' => 'I', 'Ò' => 'O', 'ò' => 'o', 'ù' => 'u', 'Ù' => 'U', ], // Macedonian 'mk' => [ 'А' => 'A', 'Б' => 'B', 'В' => 'V', 'Г' => 'G', 'Д' => 'D', 'Ѓ' => 'Gj', 'Е' => 'E', 'Ж' => 'Zh', 'З' => 'Z', 'Ѕ' => 'Dz', 'И' => 'I', 'Ј' => 'J', 'К' => 'K', 'Л' => 'L', 'Љ' => 'Lj', 'М' => 'M', 'Н' => 'N', 'Њ' => 'Nj', 'О' => 'O', 'П' => 'P', 'Р' => 'R', 'С' => 'S', 'Т' => 'T', 'Ќ' => 'Kj', 'У' => 'U', 'Ф' => 'F', 'Х' => 'H', 'Ц' => 'C', 'Ч' => 'Ch', 'Џ' => 'Dj', 'Ш' => 'Sh', 'а' => 'a', 'б' => 'b', 'в' => 'v', 'г' => 'g', 'д' => 'd', 'ѓ' => 'gj', 'е' => 'e', 'ж' => 'zh', 'з' => 'z', 'ѕ' => 'dz', 'и' => 'i', 'ј' => 'j', 'к' => 'k', 'л' => 'l', 'љ' => 'lj', 'м' => 'm', 'н' => 'n', 'њ' => 'nj', 'о' => 'o', 'п' => 'p', 'р' => 'r', 'с' => 's', 'т' => 't', 'ќ' => 'kj', 'у' => 'u', 'ф' => 'f', 'х' => 'h', 'ц' => 'c', 'ч' => 'ch', 'џ' => 'dj', 'ш' => 'sh', ], // Portuguese (Brazil) 'pt' => [ 'æ' => 'ae', 'ǽ' => 'ae', 'À' => 'A', 'Á' => 'A', 'Â' => 'A', 'Ã' => 'A', 'Å' => 'AA', 'Ǻ' => 'A', 'Ă' => 'A', 'Ǎ' => 'A', 'Æ' => 'AE', 'Ǽ' => 'AE', 'à' => 'a', 'á' => 'a', 'â' => 'a', 'ã' => 'a', 'å' => 'aa', 'ǻ' => 'a', 'ă' => 'a', 'ǎ' => 'a', 'ª' => 'a', 'Ĉ' => 'C', 'Ċ' => 'C', 'Ç' => 'C', 'ç' => 'c', 'ĉ' => 'c', 'ċ' => 'c', 'Ð' => 'Dj', 'Đ' => 'D', 'ð' => 'dj', 'đ' => 'd', 'È' => 'E', 'É' => 'E', 'Ê' => 'E', 'Ë' => 'E', 'Ĕ' => 'E', 'Ė' => 'E', 'è' => 'e', 'é' => 'e', 'ê' => 'e', 'ë' => 'e', 'ĕ' => 'e', 'ė' => 'e', 'ƒ' => 'f', 'Ĝ' => 'G', 'Ġ' => 'G', 'ĝ' => 'g', 'ġ' => 'g', 'Ĥ' => 'H', 'Ħ' => 'H', 'ĥ' => 'h', 'ħ' => 'h', 'Ì' => 'I', 'Í' => 'I', 'Î' => 'I', 'Ï' => 'I', 'Ĩ' => 'I', 'Ĭ' => 'I', 'Ǐ' => 'I', 'Į' => 'I', 'IJ' => 'IJ', 'ì' => 'i', 'í' => 'i', 'î' => 'i', 'ï' => 'i', 'ĩ' => 'i', 'ĭ' => 'i', 'ǐ' => 'i', 'į' => 'i', 'ij' => 'ij', 'Ĵ' => 'J', 'ĵ' => 'j', 'Ĺ' => 'L', 'Ľ' => 'L', 'Ŀ' => 'L', 'ĺ' => 'l', 'ľ' => 'l', 'ŀ' => 'l', 'Ñ' => 'N', 'ñ' => 'n', 'ʼn' => 'n', 'Ò' => 'O', 'Ó' => 'O', 'Ô' => 'O', 'Õ' => 'O', 'Ō' => 'O', 'Ŏ' => 'O', 'Ǒ' => 'O', 'Ő' => 'O', 'Ơ' => 'O', 'Ø' => 'OE', 'Ǿ' => 'O', 'Œ' => 'OE', 'ò' => 'o', 'ó' => 'o', 'ô' => 'o', 'õ' => 'o', 'ō' => 'o', 'ŏ' => 'o', 'ǒ' => 'o', 'ő' => 'o', 'ơ' => 'o', 'ø' => 'oe', 'ǿ' => 'o', 'º' => 'o', 'œ' => 'oe', 'Ŕ' => 'R', 'Ŗ' => 'R', 'ŕ' => 'r', 'ŗ' => 'r', 'Ŝ' => 'S', 'Ș' => 'S', 'ŝ' => 's', 'ș' => 's', 'ſ' => 's', 'Ţ' => 'T', 'Ț' => 'T', 'Ŧ' => 'T', 'Þ' => 'TH', 'ţ' => 't', 'ț' => 't', 'ŧ' => 't', 'þ' => 'th', 'Ù' => 'U', 'Ú' => 'U', 'Û' => 'U', 'Ü' => 'U', 'Ũ' => 'U', 'Ŭ' => 'U', 'Ű' => 'U', 'Ų' => 'U', 'Ư' => 'U', 'Ǔ' => 'U', 'Ǖ' => 'U', 'Ǘ' => 'U', 'Ǚ' => 'U', 'Ǜ' => 'U', 'ù' => 'u', 'ú' => 'u', 'û' => 'u', 'ü' => 'u', 'ũ' => 'u', 'ŭ' => 'u', 'ű' => 'u', 'ų' => 'u', 'ư' => 'u', 'ǔ' => 'u', 'ǖ' => 'u', 'ǘ' => 'u', 'ǚ' => 'u', 'ǜ' => 'u', 'Ŵ' => 'W', 'ŵ' => 'w', 'Ý' => 'Y', 'Ÿ' => 'Y', 'Ŷ' => 'Y', 'ý' => 'y', 'ÿ' => 'y', 'ŷ' => 'y', ], // Greek(lish) (Elláda) 'el__greeklish' => [ 'ΑΥ' => 'AU', 'ΑΎ' => 'AU', 'Αυ' => 'Au', 'Αύ' => 'Au', 'ΕΊ' => 'EI', 'ΕΙ' => 'EI', 'Ει' => 'EI', 'ΕΥ' => 'EU', 'ΕΎ' => 'EU', 'Εί' => 'Ei', 'Ευ' => 'Eu', 'Εύ' => 'Eu', 'ΟΙ' => 'OI', 'ΟΊ' => 'OI', 'ΟΥ' => 'OU', 'ΟΎ' => 'OU', 'Οι' => 'Oi', 'Οί' => 'Oi', 'Ου' => 'Ou', 'Ού' => 'Ou', 'ΥΙ' => 'YI', 'ΎΙ' => 'YI', 'Υι' => 'Yi', 'Ύι' => 'Yi', 'ΥΊ' => 'Yi', 'Υί' => 'Yi', 'αυ' => 'au', 'αύ' => 'au', 'εί' => 'ei', 'ει' => 'ei', 'ευ' => 'eu', 'εύ' => 'eu', 'οι' => 'oi', 'οί' => 'oi', 'ου' => 'ou', 'ού' => 'ou', 'υι' => 'yi', 'ύι' => 'yi', 'υί' => 'yi', 'Α' => 'A', 'Ά' => 'A', 'Β' => 'B', 'Δ' => 'D', 'Ε' => 'E', 'Έ' => 'E', 'Φ' => 'F', 'Γ' => 'G', 'Η' => 'H', 'Ή' => 'H', 'Ι' => 'I', 'Ί' => 'I', 'Ϊ' => 'I', 'Κ' => 'K', 'Ξ' => 'Ks', 'Λ' => 'L', 'Μ' => 'M', 'Ν' => 'N', 'Π' => 'N', 'Ο' => 'O', 'Ό' => 'O', 'Ψ' => 'Ps', 'Ρ' => 'R', 'Σ' => 'S', 'Τ' => 'T', 'Θ' => 'Th', 'Ω' => 'W', 'Ώ' => 'W', 'Χ' => 'X', 'ϒ' => 'Y', 'Υ' => 'Y', 'Ύ' => 'Y', 'Ϋ' => 'Y', 'Ζ' => 'Z', 'α' => 'a', 'ά' => 'a', 'β' => 'b', 'δ' => 'd', 'ε' => 'e', 'έ' => 'e', 'φ' => 'f', 'γ' => 'g', 'η' => 'h', 'ή' => 'h', 'ι' => 'i', 'ί' => 'i', 'ϊ' => 'i', 'ΐ' => 'i', 'κ' => 'k', 'ξ' => 'ks', 'λ' => 'l', 'μ' => 'm', 'ν' => 'n', 'ο' => 'o', 'ό' => 'o', 'π' => 'p', 'ψ' => 'ps', 'ρ' => 'r', 'σ' => 's', 'ς' => 's', 'τ' => 't', 'ϑ' => 'th', 'θ' => 'th', 'ϐ' => 'v', 'ω' => 'w', 'ώ' => 'w', 'χ' => 'x', 'υ' => 'y', 'ύ' => 'y', 'ΰ' => 'y', 'ϋ' => 'y', 'ζ' => 'z', ], // Greek (Elláda) 'el' => [ 'ΑΥ' => 'AU', 'Αυ' => 'Au', 'ΟΥ' => 'U', 'Ου' => 'u', 'ΕΥ' => 'EF', 'Ευ' => 'Ef', 'ΕΙ' => 'I', 'Ει' => 'I', 'ΟΙ' => 'I', 'Οι' => 'I', 'ΥΙ' => 'I', 'Υι' => 'I', 'ΑΎ' => 'AU', 'Αύ' => 'Au', 'ΟΎ' => 'OU', 'Ού' => 'Ou', 'ΕΎ' => 'EU', 'Εύ' => 'Eu', 'ΕΊ' => 'I', 'Εί' => 'I', 'ΟΊ' => 'I', 'Οί' => 'I', 'ΎΙ' => 'I', 'Ύι' => 'I', 'ΥΊ' => 'I', 'Υί' => 'I', 'αυ' => 'au', 'ου' => 'u', 'ευ' => 'ef', 'ει' => 'i', 'οι' => 'i', 'υι' => 'i', 'αύ' => 'au', 'ού' => 'ou', 'εύ' => 'eu', 'εί' => 'i', 'οί' => 'i', 'ύι' => 'i', 'υί' => 'i', 'α' => 'a', 'β' => 'v', 'γ' => 'gh', 'δ' => 'd', 'ε' => 'e', 'ζ' => 'z', 'η' => 'i', 'θ' => 'th', 'ι' => 'i', 'κ' => 'k', 'λ' => 'l', 'μ' => 'm', 'ν' => 'n', 'ξ' => 'ks', 'ο' => 'o', 'π' => 'p', 'ρ' => 'r', 'σ' => 's', 'τ' => 't', 'υ' => 'i', 'φ' => 'f', 'χ' => 'kh', 'ψ' => 'ps', 'ω' => 'o', 'ά' => 'a', 'έ' => 'e', 'ί' => 'i', 'ό' => 'o', 'ϒ' => 'Y', 'ύ' => 'y', 'ή' => 'i', 'ώ' => 'w', 'ς' => 's', 'ϊ' => 'i', 'ΰ' => 'y', 'ϋ' => 'y', 'ΐ' => 'i', 'Α' => 'A', 'Β' => 'B', 'Γ' => 'G', 'Δ' => 'D', 'Ε' => 'E', 'Ζ' => 'Z', 'Η' => 'H', 'Θ' => 'Th', 'Ι' => 'I', 'Κ' => 'K', 'Λ' => 'L', 'Μ' => 'M', 'Ν' => 'N', 'Ξ' => 'Ks', 'Ο' => 'O', 'Π' => 'P', 'Ρ' => 'R', 'Σ' => 'S', 'Τ' => 'T', 'Υ' => 'Y', 'Φ' => 'F', 'Χ' => 'X', 'Ψ' => 'Ps', 'Ω' => 'O', 'Ά' => 'A', 'Έ' => 'E', 'Ί' => 'I', 'Ό' => 'O', 'Ύ' => 'Y', 'Ή' => 'I', 'Ώ' => 'W', 'Ϊ' => 'I', 'Ϋ' => 'Y', 'ϐ' => 'v', 'ϑ' => 'th', ], // Hindi 'hi' => [ 'अ' => 'a', 'आ' => 'aa', 'ए' => 'e', 'ई' => 'ii', 'ऍ' => 'ei', 'ऎ' => 'ae', 'ऐ' => 'ai', 'इ' => 'i', 'ओ' => 'o', 'ऑ' => 'oi', 'ऒ' => 'oii', 'ऊ' => 'uu', 'औ' => 'ou', 'उ' => 'u', 'ब' => 'B', 'भ' => 'Bha', 'च' => 'Ca', 'छ' => 'Chha', 'ड' => 'Da', 'ढ' => 'Dha', 'फ' => 'Fa', 'फ़' => 'Fi', 'ग' => 'Ga', 'घ' => 'Gha', 'ग़' => 'Ghi', 'ह' => 'Ha', 'ज' => 'Ja', 'झ' => 'Jha', 'क' => 'Ka', 'ख' => 'Kha', 'ख़' => 'Khi', 'ल' => 'L', 'ळ' => 'Li', 'ऌ' => 'Li', 'ऴ' => 'Lii', 'ॡ' => 'Lii', 'म' => 'Ma', 'न' => 'Na', 'ङ' => 'Na', 'ञ' => 'Nia', 'ण' => 'Nae', 'ऩ' => 'Ni', 'ॐ' => 'oms', 'प' => 'Pa', 'क़' => 'Qi', 'र' => 'Ra', 'ऋ' => 'Ri', 'ॠ' => 'Ri', 'ऱ' => 'Ri', 'स' => 'Sa', 'श' => 'Sha', 'ष' => 'Shha', 'ट' => 'Ta', 'त' => 'Ta', 'ठ' => 'Tha', 'द' => 'Tha', 'थ' => 'Tha', 'ध' => 'Thha', 'ड़' => 'ugDha', 'ढ़' => 'ugDhha', 'व' => 'Va', 'य' => 'Ya', 'य़' => 'Yi', 'ज़' => 'Za', ], // Armenian 'hy' => [ 'Ա' => 'A', 'Բ' => 'B', 'Գ' => 'G', 'Դ' => 'D', 'Ե' => 'E', 'Զ' => 'Z', 'Է' => 'E', 'Ը' => 'Y', 'Թ' => 'Th', 'Ժ' => 'Zh', 'Ի' => 'I', 'Լ' => 'L', 'Խ' => 'Kh', 'Ծ' => 'Ts', 'Կ' => 'K', 'Հ' => 'H', 'Ձ' => 'Dz', 'Ղ' => 'Gh', 'Ճ' => 'Tch', 'Մ' => 'M', 'Յ' => 'Y', 'Ն' => 'N', 'Շ' => 'Sh', 'Ո' => 'Vo', 'Չ' => 'Ch', 'Պ' => 'P', 'Ջ' => 'J', 'Ռ' => 'R', 'Ս' => 'S', 'Վ' => 'V', 'Տ' => 'T', 'Ր' => 'R', 'Ց' => 'C', 'Ւ' => 'u', 'Փ' => 'Ph', 'Ք' => 'Q', 'և' => 'ev', 'Օ' => 'O', 'Ֆ' => 'F', 'ա' => 'a', 'բ' => 'b', 'գ' => 'g', 'դ' => 'd', 'ե' => 'e', 'զ' => 'z', 'է' => 'e', 'ը' => 'y', 'թ' => 'th', 'ժ' => 'zh', 'ի' => 'i', 'լ' => 'l', 'խ' => 'kh', 'ծ' => 'ts', 'կ' => 'k', 'հ' => 'h', 'ձ' => 'dz', 'ղ' => 'gh', 'ճ' => 'tch', 'մ' => 'm', 'յ' => 'y', 'ն' => 'n', 'շ' => 'sh', 'ո' => 'vo', 'չ' => 'ch', 'պ' => 'p', 'ջ' => 'j', 'ռ' => 'r', 'ս' => 's', 'վ' => 'v', 'տ' => 't', 'ր' => 'r', 'ց' => 'c', 'ւ' => 'u', 'փ' => 'ph', 'ք' => 'q', 'օ' => 'o', 'ֆ' => 'f', ], // Swedish 'sv' => [ 'Ä' => 'A', 'ä' => 'a', 'Å' => 'A', 'å' => 'a', 'Ö' => 'O', 'ö' => 'o', ], // Turkmen 'tk' => [ 'Ç' => 'C', 'Ä' => 'A', 'Ž' => 'Z', 'Ň' => 'N', 'Ö' => 'O', 'Ş' => 'S', 'Ü' => 'U', 'Ý' => 'Y', 'ç' => 'c', 'ä' => 'a', 'ž' => 'z', 'ň' => 'n', 'ö' => 'o', 'ş' => 's', 'ü' => 'u', 'ý' => 'y', ], // Turkish 'tr' => [ 'ň' => 'n', 'Ň' => 'N', 'ş' => 's', 'Ş' => 'S', 'ı' => 'i', 'İ' => 'I', 'ç' => 'c', 'Ç' => 'C', 'ä' => 'a', 'Ä' => 'A', 'ü' => 'u', 'Ü' => 'U', 'ö' => 'o', 'Ö' => 'O', 'ğ' => 'g', 'Ğ' => 'G', 'ý' => 'y', 'Ý' => 'Y', 'ž' => 'z', 'Ž' => 'Z', ], // Bulgarian 'bg' => [ 'ьо' => 'yo', 'А' => 'A', 'Б' => 'B', 'В' => 'V', 'Г' => 'G', 'Д' => 'D', 'Е' => 'E', 'Ж' => 'Zh', 'З' => 'Z', 'И' => 'I', 'Й' => 'Y', 'К' => 'K', 'Л' => 'L', 'М' => 'M', 'Н' => 'N', 'О' => 'O', 'П' => 'P', 'Р' => 'R', 'С' => 'S', 'Т' => 'T', 'У' => 'U', 'Ф' => 'F', 'Х' => 'H', 'Ц' => 'C', 'Ч' => 'Ch', 'Ш' => 'Sh', 'Щ' => 'Sht', 'Ъ' => 'A', 'Ь' => '', 'Ю' => 'Yu', 'Я' => 'Ya', 'а' => 'a', 'б' => 'b', 'в' => 'v', 'г' => 'g', 'д' => 'd', 'е' => 'e', 'ж' => 'zh', 'з' => 'z', 'и' => 'i', 'й' => 'y', 'к' => 'k', 'л' => 'l', 'м' => 'm', 'н' => 'n', 'о' => 'o', 'п' => 'p', 'р' => 'r', 'с' => 's', 'т' => 't', 'у' => 'u', 'ф' => 'f', 'х' => 'h', 'ц' => 'c', 'ч' => 'ch', 'ш' => 'sh', 'щ' => 'sht', 'ъ' => 'a', 'ь' => '', 'ю' => 'yu', 'я' => 'ya', ], // Hungarian 'hu' => [ 'Á' => 'A', 'Ē' => 'E', 'É' => 'E', 'Í' => 'I', 'Ó' => 'O', 'Ö' => 'O', 'Ő' => 'O', 'Ú' => 'U', 'Ü' => 'U', 'Ű' => 'U', 'á' => 'a', 'ē' => 'e', 'é' => 'e', 'í' => 'i', 'ó' => 'o', 'ö' => 'o', 'ő' => 'o', 'ú' => 'u', 'ü' => 'u', 'ű' => 'u', ], // Myanmar (Burmese) 'my' => [ 'န်ုပ်' => 'nub', 'ောင်' => 'aung', 'ိုက်' => 'aik', 'ိုဒ်' => 'ok', 'ိုင်' => 'aing', 'ိုလ်' => 'ol', 'ေါင်' => 'aung', 'သြော' => 'aw', 'ောက်' => 'auk', 'ိတ်' => 'eik', 'ုတ်' => 'ok', 'ုန်' => 'on', 'ေတ်' => 'it', 'ုဒ်' => 'ait', 'ာန်' => 'an', 'ိန်' => 'ein', 'ွတ်' => 'ut', 'ေါ်' => 'aw', 'ွန်' => 'un', 'ိပ်' => 'eik', 'ုပ်' => 'ok', 'ွပ်' => 'ut', 'ိမ်' => 'ein', 'ုမ်' => 'on', 'ော်' => 'aw', 'ွမ်' => 'un', 'က်' => 'et', 'ေါ' => 'aw', 'ော' => 'aw', 'ျွ' => 'ywa', 'ြွ' => 'yw', 'ို' => 'o', 'ုံ' => 'on', 'တ်' => 'at', 'င်' => 'in', 'ည်' => 'i', 'ဒ်' => 'd', 'န်' => 'an', 'ပ်' => 'at', 'မ်' => 'an', 'စျ' => 'za', 'ယ်' => 'e', 'ဉ်' => 'in', 'စ်' => 'it', 'ိံ' => 'ein', 'ဲ' => 'e', 'း' => '', 'ာ' => 'a', 'ါ' => 'a', 'ေ' => 'e', 'ံ' => 'an', 'ိ' => 'i', 'ီ' => 'i', 'ု' => 'u', 'ူ' => 'u', '်' => 'at', '္' => '', '့' => '', 'က' => 'k', '၉' => '9', 'တ' => 't', 'ရ' => 'ya', 'ယ' => 'y', 'မ' => 'm', 'ဘ' => 'ba', 'ဗ' => 'b', 'ဖ' => 'pa', 'ပ' => 'p', 'န' => 'n', 'ဓ' => 'da', 'ဒ' => 'd', 'ထ' => 'ta', 'ဏ' => 'na', 'ဝ' => 'w', 'ဎ' => 'da', 'ဍ' => 'd', 'ဌ' => 'ta', 'ဋ' => 't', 'ည' => 'ny', 'ဇ' => 'z', 'ဆ' => 'sa', 'စ' => 's', 'င' => 'ng', 'ဃ' => 'ga', 'ဂ' => 'g', 'လ' => 'l', 'သ' => 'th', '၈' => '8', 'ဩ' => 'aw', 'ခ' => 'kh', '၆' => '6', '၅' => '5', '၄' => '4', '၃' => '3', '၂' => '2', '၁' => '1', '၀' => '0', '၌' => 'hnaik', '၍' => 'ywae', 'ဪ' => 'aw', 'ဦ' => '-u', 'ဟ' => 'h', 'ဉ' => 'u', 'ဤ' => '-i', 'ဣ' => 'i', '၏' => '-e', 'ဧ' => 'e', 'ှ' => 'h', 'ွ' => 'w', 'ျ' => 'ya', 'ြ' => 'y', 'အ' => 'a', 'ဠ' => 'la', '၇' => '7', ], // Croatian (Hrvatska) 'hr' => [ 'DŽ' => 'DZ', 'Dž' => 'Dz', 'dž' => 'dz', 'DZ' => 'DZ', 'Dz' => 'Dz', 'dz' => 'dz', 'IJ' => 'IJ', 'ij' => 'ij', 'LJ' => 'LJ', 'Lj' => 'Lj', 'lj' => 'lj', 'NJ' => 'NJ', 'Nj' => 'Nj', 'nj' => 'nj', 'ž' => 'z', 'Ž' => 'Z', 'đ' => 'dj', 'Đ' => 'Dj', 'č' => 'c', 'Č' => 'C', 'ć' => 'c', 'Ć' => 'C', 'š' => 's', 'Š' => 'S', ], // Finnish 'fi' => [ 'Ä' => 'A', 'Ö' => 'O', 'ä' => 'a', 'ö' => 'o', ], // Georgian (Kartvelian) 'ka' => [ 'ა' => 'a', 'ბ' => 'b', 'გ' => 'g', 'დ' => 'd', 'ე' => 'e', 'ვ' => 'v', 'ზ' => 'z', 'თ' => 't', 'ი' => 'i', 'კ' => 'k', 'ლ' => 'l', 'მ' => 'm', 'ნ' => 'n', 'ო' => 'o', 'პ' => 'p', 'ჟ' => 'zh', 'რ' => 'r', 'ს' => 's', 'ტ' => 't', 'უ' => 'u', 'ფ' => 'f', 'ქ' => 'q', 'ღ' => 'gh', 'ყ' => 'y', 'შ' => 'sh', 'ჩ' => 'ch', 'ც' => 'ts', 'ძ' => 'dz', 'წ' => 'ts', 'ჭ' => 'ch', 'ხ' => 'kh', 'ჯ' => 'j', 'ჰ' => 'h', ], // Russian 'ru' => [ 'А' => 'A', 'а' => 'a', 'Б' => 'B', 'б' => 'b', 'В' => 'V', 'в' => 'v', 'Г' => 'G', 'г' => 'g', 'Д' => 'D', 'д' => 'd', 'Е' => 'E', 'е' => 'e', 'Ё' => 'Yo', 'ё' => 'yo', 'Ж' => 'Zh', 'ж' => 'zh', 'З' => 'Z', 'з' => 'z', 'И' => 'I', 'и' => 'i', 'Й' => 'Y', 'й' => 'y', 'К' => 'K', 'к' => 'k', 'Л' => 'L', 'л' => 'l', 'М' => 'M', 'м' => 'm', 'Н' => 'N', 'н' => 'n', 'О' => 'O', 'о' => 'o', 'П' => 'P', 'п' => 'p', 'Р' => 'R', 'р' => 'r', 'С' => 'S', 'с' => 's', 'Т' => 'T', 'т' => 't', 'У' => 'U', 'у' => 'u', 'Ф' => 'F', 'ф' => 'f', 'Х' => 'H', 'х' => 'h', 'Ц' => 'Ts', 'ц' => 'ts', 'Ч' => 'Ch', 'ч' => 'ch', 'ш' => 'sh', 'Ш' => 'Sh', 'Щ' => 'Sch', 'щ' => 'sch', 'Ъ' => '', 'ъ' => '', 'Ы' => 'Y', 'ы' => 'y', 'Ь' => '', 'ь' => '', 'Э' => 'E', 'э' => 'e', 'Ю' => 'Yu', 'ю' => 'yu', 'Я' => 'Ya', 'я' => 'ya', ], // Russian - GOST 7.79-2000(B) // -> https://en.m.wikipedia.org/wiki/Romanization_of_Russian#content-collapsible-block-1 'ru__gost_2000_b' => [ 'А' => 'A', 'а' => 'a', 'Б' => 'B', 'б' => 'b', 'В' => 'V', 'в' => 'v', 'Г' => 'G', 'г' => 'g', 'Д' => 'D', 'д' => 'd', 'Е' => 'E', 'е' => 'e', 'Ё' => 'Yo', 'ё' => 'yo', 'Ж' => 'Zh', 'ж' => 'zh', 'З' => 'Z', 'з' => 'z', 'И' => 'i', 'и' => 'i', 'Й' => 'i', 'й' => 'i', 'К' => 'K', 'к' => 'k', 'Л' => 'L', 'л' => 'l', 'М' => 'M', 'м' => 'm', 'Н' => 'N', 'н' => 'n', 'О' => 'O', 'о' => 'o', 'П' => 'P', 'п' => 'p', 'Р' => 'R', 'р' => 'r', 'С' => 'S', 'с' => 's', 'Т' => 'T', 'т' => 't', 'У' => 'U', 'у' => 'u', 'Ф' => 'F', 'ф' => 'f', 'Х' => 'X', 'х' => 'x', 'Ц' => 'Cz', 'ц' => 'cz', 'Ч' => 'Ch', 'ч' => 'ch', 'ш' => 'sh', 'Ш' => 'Sh', 'Щ' => 'Shh', 'щ' => 'shh', 'Ъ' => '', 'ъ' => '', 'Ы' => 'Y\'', 'ы' => 'y\'', 'Ь' => '', 'ь' => '', 'Э' => 'E\'', 'э' => 'e\'', 'Ю' => 'Yu', 'ю' => 'yu', 'Я' => 'Ya', 'я' => 'ya', 'І' => 'I', 'і' => 'i', 'Ѳ' => 'Fh', 'ѳ' => 'fh', 'Ѣ' => 'Ye', 'ѣ' => 'ye', 'Ѵ' => 'Yh', 'ѵ' => 'yh', 'Є' => '', 'є' => '', 'Ѥ' => '', 'ѥ' => '', 'Ѕ' => 'Js', 'ѕ' => 'js', 'Ꙋ' => '', 'ꙋ' => '', 'Ѡ' => '', 'ѡ' => '', 'Ѿ' => '', 'ѿ' => '', 'Ѫ' => '', 'ѫ' => '', 'Ѧ' => '', 'ѧ' => '', 'Ѭ' => '', 'ѭ' => '', 'Ѩ' => '', 'ѩ' => '', 'Ѯ' => '', 'ѯ' => '', 'Ѱ' => '', 'ѱ' => '', ], // Russian - Passport (2013), ICAO // -> https://en.m.wikipedia.org/wiki/Romanization_of_Russian#content-collapsible-block-1 'ru__passport_2013' => [ 'А' => 'A', 'а' => 'a', 'Б' => 'B', 'б' => 'b', 'В' => 'V', 'в' => 'v', 'Г' => 'G', 'г' => 'g', 'Д' => 'D', 'д' => 'd', 'Е' => 'E', 'е' => 'e', 'Ё' => 'E', 'ё' => 'e', 'Ж' => 'Zh', 'ж' => 'zh', 'З' => 'Z', 'з' => 'z', 'И' => 'i', 'и' => 'i', 'Й' => 'i', 'й' => 'i', 'К' => 'K', 'к' => 'k', 'Л' => 'L', 'л' => 'l', 'М' => 'M', 'м' => 'm', 'Н' => 'N', 'н' => 'n', 'О' => 'O', 'о' => 'o', 'П' => 'P', 'п' => 'p', 'Р' => 'R', 'р' => 'r', 'С' => 'S', 'с' => 's', 'Т' => 'T', 'т' => 't', 'У' => 'U', 'у' => 'u', 'Ф' => 'F', 'ф' => 'f', 'Х' => 'Kh', 'х' => 'kh', 'Ц' => 'Ts', 'ц' => 'ts', 'Ч' => 'Ch', 'ч' => 'ch', 'ш' => 'sh', 'Ш' => 'Sh', 'Щ' => 'Shch', 'щ' => 'shch', 'Ъ' => 'Ie', 'ъ' => 'ie', 'Ы' => 'Y', 'ы' => 'y', 'Ь' => '', 'ь' => '', 'Э' => 'E', 'э' => 'e', 'Ю' => 'Iu', 'ю' => 'iu', 'Я' => 'Ia', 'я' => 'ia', 'І' => '', 'і' => '', 'Ѳ' => '', 'ѳ' => '', 'Ѣ' => '', 'ѣ' => '', 'Ѵ' => '', 'ѵ' => '', 'Є' => '', 'є' => '', 'Ѥ' => '', 'ѥ' => '', 'Ѕ' => '', 'ѕ' => '', 'Ꙋ' => '', 'ꙋ' => '', 'Ѡ' => '', 'ѡ' => '', 'Ѿ' => '', 'ѿ' => '', 'Ѫ' => '', 'ѫ' => '', 'Ѧ' => '', 'ѧ' => '', 'Ѭ' => '', 'ѭ' => '', 'Ѩ' => '', 'ѩ' => '', 'Ѯ' => '', 'ѯ' => '', 'Ѱ' => '', 'ѱ' => '', ], // Ukrainian // -> https://zakon.rada.gov.ua/laws/show/55-2010-%D0%BF?lang=en 'uk' => [ 'Г' => 'H', 'г' => 'h', 'Ґ' => 'G', 'ґ' => 'g', 'Є' => 'Ye', 'є' => 'ye', 'И' => 'Y', 'и' => 'y', 'І' => 'I', 'і' => 'i', 'Ї' => 'Yi', 'ї' => 'yi', 'Й' => 'Y', 'й' => 'y', 'Х' => 'Kh', 'х' => 'kh', 'Ц' => 'Ts', 'ц' => 'ts', 'Ч' => 'Ch', 'ч' => 'ch', 'Ш' => 'Sh', 'ш' => 'sh', 'Щ' => 'Shch', 'щ' => 'shch', ], // Kazakh 'kk' => [ 'Ә' => 'A', 'Ғ' => 'G', 'Қ' => 'Q', 'Ң' => 'N', 'Ө' => 'O', 'Ұ' => 'U', 'Ү' => 'U', 'Һ' => 'H', 'ә' => 'a', 'ғ' => 'g', 'қ' => 'q', 'ң' => 'n', 'ө' => 'o', 'ұ' => 'u', 'ү' => 'u', 'һ' => 'h', ], // Czech 'cs' => [ 'á' => 'a', 'Á' => 'A', 'č' => 'c', 'Č' => 'C', 'ď' => 'd', 'Ď' => 'D', 'é' => 'e', 'É' => 'E', 'ě' => 'e', 'Ě' => 'E', 'í' => 'i', 'Í' => 'I', 'ň' => 'n', 'Ň' => 'N', 'ó' => 'o', 'Ó' => 'O', 'ř' => 'r', 'Ř' => 'R', 'š' => 's', 'Š' => 'S', 'ť' => 't', 'Ť' => 'T', 'ú' => 'u', 'Ú' => 'U', 'ů' => 'u', 'Ů' => 'U', 'ý' => 'y', 'Ý' => 'Y', 'ž' => 'z', 'Ž' => 'Z', ], // Danish 'da' => [ 'Æ' => 'Ae', 'æ' => 'ae', 'Ø' => 'Oe', 'ø' => 'oe', 'Å' => 'Aa', 'å' => 'aa', 'É' => 'E', 'é' => 'e', ], // Polish 'pl' => [ 'ą' => 'a', 'ć' => 'c', 'ę' => 'e', 'ł' => 'l', 'ń' => 'n', 'ó' => 'o', 'ś' => 's', 'ź' => 'z', 'ż' => 'z', 'Ą' => 'A', 'Ć' => 'C', 'Ę' => 'E', 'Ł' => 'L', 'Ń' => 'N', 'Ó' => 'O', 'Ś' => 'S', 'Ź' => 'Z', 'Ż' => 'Z', ], // Romanian 'ro' => [ 'ă' => 'a', 'â' => 'a', 'Ă' => 'A', 'Â' => 'A', 'î' => 'i', 'Î' => 'I', 'ș' => 's', 'ş' => 's', 'Ş' => 'S', 'Ș' => 'S', 'ț' => 't', 'ţ' => 't', 'Ţ' => 'T', 'Ț' => 'T', ], // Esperanto 'eo' => [ 'ĉ' => 'cx', 'ĝ' => 'gx', 'ĥ' => 'hx', 'ĵ' => 'jx', 'ŝ' => 'sx', 'ŭ' => 'ux', 'Ĉ' => 'CX', 'Ĝ' => 'GX', 'Ĥ' => 'HX', 'Ĵ' => 'JX', 'Ŝ' => 'SX', 'Ŭ' => 'UX', ], // Estonian 'et' => [ 'Š' => 'S', 'Ž' => 'Z', 'Õ' => 'O', 'Ä' => 'A', 'Ö' => 'O', 'Ü' => 'U', 'š' => 's', 'ž' => 'z', 'õ' => 'o', 'ä' => 'a', 'ö' => 'o', 'ü' => 'u', ], // Latvian 'lv' => [ 'ā' => 'a', 'č' => 'c', 'ē' => 'e', 'ģ' => 'g', 'ī' => 'i', 'ķ' => 'k', 'ļ' => 'l', 'ņ' => 'n', 'š' => 's', 'ū' => 'u', 'ž' => 'z', 'Ā' => 'A', 'Č' => 'C', 'Ē' => 'E', 'Ģ' => 'G', 'Ī' => 'i', 'Ķ' => 'k', 'Ļ' => 'L', 'Ņ' => 'N', 'Š' => 'S', 'Ū' => 'u', 'Ž' => 'Z', ], // Lithuanian 'lt' => [ 'ą' => 'a', 'č' => 'c', 'ę' => 'e', 'ė' => 'e', 'į' => 'i', 'š' => 's', 'ų' => 'u', 'ū' => 'u', 'ž' => 'z', 'Ą' => 'A', 'Č' => 'C', 'Ę' => 'E', 'Ė' => 'E', 'Į' => 'I', 'Š' => 'S', 'Ų' => 'U', 'Ū' => 'U', 'Ž' => 'Z', ], // Norwegian 'no' => [ 'Æ' => 'AE', 'æ' => 'ae', 'Ø' => 'OE', 'ø' => 'oe', 'Å' => 'AA', 'å' => 'aa', ], // Vietnamese 'vi' => [ 'Á' => 'A', 'À' => 'A', 'Ả' => 'A', 'Ã' => 'A', 'Ạ' => 'A', 'Ă' => 'A', 'Ắ' => 'A', 'Ằ' => 'A', 'Ẳ' => 'A', 'Ẵ' => 'A', 'Ặ' => 'A', 'Â' => 'A', 'Ấ' => 'A', 'Ầ' => 'A', 'Ẩ' => 'A', 'Ẫ' => 'A', 'Ậ' => 'A', 'á' => 'a', 'à' => 'a', 'ả' => 'a', 'ã' => 'a', 'ạ' => 'a', 'ă' => 'a', 'ắ' => 'a', 'ằ' => 'a', 'ẳ' => 'a', 'ẵ' => 'a', 'ặ' => 'a', 'â' => 'a', 'ấ' => 'a', 'ầ' => 'a', 'ẩ' => 'a', 'ẫ' => 'a', 'ậ' => 'a', 'É' => 'E', 'È' => 'E', 'Ẻ' => 'E', 'Ẽ' => 'E', 'Ẹ' => 'E', 'Ê' => 'E', 'Ế' => 'E', 'Ề' => 'E', 'Ể' => 'E', 'Ễ' => 'E', 'Ệ' => 'E', 'é' => 'e', 'è' => 'e', 'ẻ' => 'e', 'ẽ' => 'e', 'ẹ' => 'e', 'ê' => 'e', 'ế' => 'e', 'ề' => 'e', 'ể' => 'e', 'ễ' => 'e', 'ệ' => 'e', 'Í' => 'I', 'Ì' => 'I', 'Ỉ' => 'I', 'Ĩ' => 'I', 'Ị' => 'I', 'í' => 'i', 'ì' => 'i', 'ỉ' => 'i', 'ĩ' => 'i', 'ị' => 'i', 'Ó' => 'O', 'Ò' => 'O', 'Ỏ' => 'O', 'Õ' => 'O', 'Ọ' => 'O', 'Ô' => 'O', 'Ố' => 'O', 'Ồ' => 'O', 'Ổ' => 'O', 'Ỗ' => 'O', 'Ộ' => 'O', 'Ơ' => 'O', 'Ớ' => 'O', 'Ờ' => 'O', 'Ở' => 'O', 'Ỡ' => 'O', 'Ợ' => 'O', 'ó' => 'o', 'ò' => 'o', 'ỏ' => 'o', 'õ' => 'o', 'ọ' => 'o', 'ô' => 'o', 'ố' => 'o', 'ồ' => 'o', 'ổ' => 'o', 'ỗ' => 'o', 'ộ' => 'o', 'ơ' => 'o', 'ớ' => 'o', 'ờ' => 'o', 'ở' => 'o', 'ỡ' => 'o', 'ợ' => 'o', 'Ú' => 'U', 'Ù' => 'U', 'Ủ' => 'U', 'Ũ' => 'U', 'Ụ' => 'U', 'Ư' => 'U', 'Ứ' => 'U', 'Ừ' => 'U', 'Ử' => 'U', 'Ữ' => 'U', 'Ự' => 'U', 'ú' => 'u', 'ù' => 'u', 'ủ' => 'u', 'ũ' => 'u', 'ụ' => 'u', 'ư' => 'u', 'ứ' => 'u', 'ừ' => 'u', 'ử' => 'u', 'ữ' => 'u', 'ự' => 'u', 'Ý' => 'Y', 'Ỳ' => 'Y', 'Ỷ' => 'Y', 'Ỹ' => 'Y', 'Ỵ' => 'Y', 'ý' => 'y', 'ỳ' => 'y', 'ỷ' => 'y', 'ỹ' => 'y', 'ỵ' => 'y', 'Đ' => 'D', 'đ' => 'd', ], // Persian (Farsi) 'fa' => [ 'ا' => 'a', 'ب' => 'b', 'پ' => 'p', 'ت' => 't', 'ث' => 's', 'ج' => 'j', 'چ' => 'ch', 'ح' => 'h', 'خ' => 'kh', 'د' => 'd', 'ذ' => 'z', 'ر' => 'r', 'ز' => 'z', 'س' => 's', 'ش' => 'sh', 'ص' => 's', 'ض' => 'z', 'ط' => 't', 'ظ' => 'z', 'ع' => 'a', 'غ' => 'gh', 'ف' => 'f', 'ق' => 'gh', 'ک' => 'k', 'گ' => 'g', 'ل' => 'l', 'ژ' => 'zh', 'ك' => 'k', 'م' => 'm', 'ن' => 'n', 'ه' => 'h', 'و' => 'o', 'ی' => 'y', 'آ' => 'a', '٠' => '0', '١' => '1', '٢' => '2', '٣' => '3', '٤' => '4', '٥' => '5', '٦' => '6', '٧' => '7', '٨' => '8', '٩' => '9', ], // Arabic 'ar' => [ 'أ' => 'a', 'ب' => 'b', 'ت' => 't', 'ث' => 'th', 'ج' => 'g', 'ح' => 'h', 'خ' => 'kh', 'د' => 'd', 'ذ' => 'th', 'ر' => 'r', 'ز' => 'z', 'س' => 's', 'ش' => 'sh', 'ص' => 's', 'ض' => 'd', 'ط' => 't', 'ظ' => 'th', 'ع' => 'aa', 'غ' => 'gh', 'ف' => 'f', 'ق' => 'k', 'ك' => 'k', 'ل' => 'l', 'م' => 'm', 'ن' => 'n', 'ه' => 'h', 'و' => 'o', 'ي' => 'y', 'ا' => 'a', 'إ' => 'a', 'آ' => 'a', 'ؤ' => 'o', 'ئ' => 'y', 'ء' => 'aa', '٠' => '0', '١' => '1', '٢' => '2', '٣' => '3', '٤' => '4', '٥' => '5', '٦' => '6', '٧' => '7', '٨' => '8', '٩' => '9', ], // Serbian 'sr' => [ 'đ' => 'dj', 'ž' => 'z', 'ć' => 'c', 'č' => 'c', 'š' => 's', 'Đ' => 'Dj', 'Ž' => 'Z', 'Ć' => 'C', 'Č' => 'C', 'Š' => 'S', 'а' => 'a', 'б' => 'b', 'в' => 'v', 'г' => 'g', 'д' => 'd', 'ђ' => 'dj', 'е' => 'e', 'ж' => 'z', 'з' => 'z', 'и' => 'i', 'ј' => 'j', 'к' => 'k', 'л' => 'l', 'љ' => 'lj', 'м' => 'm', 'н' => 'n', 'њ' => 'nj', 'о' => 'o', 'п' => 'p', 'р' => 'r', 'с' => 's', 'т' => 't', 'ћ' => 'c', 'у' => 'u', 'ф' => 'f', 'х' => 'h', 'ц' => 'c', 'ч' => 'c', 'џ' => 'dz', 'ш' => 's', 'А' => 'A', 'Б' => 'B', 'В' => 'V', 'Г' => 'G', 'Д' => 'D', 'Ђ' => 'Dj', 'Е' => 'E', 'Ж' => 'Z', 'З' => 'Z', 'И' => 'I', 'Ј' => 'j', 'К' => 'K', 'Л' => 'L', 'Љ' => 'Lj', 'М' => 'M', 'Н' => 'N', 'Њ' => 'Nj', 'О' => 'O', 'П' => 'P', 'Р' => 'R', 'С' => 'S', 'Т' => 'T', 'Ћ' => 'C', 'У' => 'U', 'Ф' => 'F', 'Х' => 'H', 'Ц' => 'C', 'Ч' => 'C', 'Џ' => 'Dz', 'Ш' => 'S', ], // Serbian - Cyrillic 'sr__cyr' => [ 'а' => 'a', 'б' => 'b', 'в' => 'v', 'г' => 'g', 'д' => 'd', 'ђ' => 'dj', 'е' => 'e', 'ж' => 'z', 'з' => 'z', 'и' => 'i', 'ј' => 'j', 'к' => 'k', 'л' => 'l', 'љ' => 'lj', 'м' => 'm', 'н' => 'n', 'њ' => 'nj', 'о' => 'o', 'п' => 'p', 'р' => 'r', 'с' => 's', 'т' => 't', 'ћ' => 'c', 'у' => 'u', 'ф' => 'f', 'х' => 'h', 'ц' => 'c', 'ч' => 'c', 'џ' => 'dz', 'ш' => 's', 'А' => 'A', 'Б' => 'B', 'В' => 'V', 'Г' => 'G', 'Д' => 'D', 'Ђ' => 'Dj', 'Е' => 'E', 'Ж' => 'Z', 'З' => 'Z', 'И' => 'I', 'Ј' => 'j', 'К' => 'K', 'Л' => 'L', 'Љ' => 'Lj', 'М' => 'M', 'Н' => 'N', 'Њ' => 'Nj', 'О' => 'O', 'П' => 'P', 'Р' => 'R', 'С' => 'S', 'Т' => 'T', 'Ћ' => 'C', 'У' => 'U', 'Ф' => 'F', 'Х' => 'H', 'Ц' => 'C', 'Ч' => 'C', 'Џ' => 'Dz', 'Ш' => 'S', ], // Serbian - Latin 'sr__lat' => [ 'đ' => 'dj', 'ž' => 'z', 'ć' => 'c', 'č' => 'c', 'š' => 's', 'Đ' => 'Dj', 'Ž' => 'Z', 'Ć' => 'C', 'Č' => 'C', 'Š' => 'S', ], // Azerbaijani 'az' => [ 'ç' => 'c', 'ə' => 'e', 'ğ' => 'g', 'ı' => 'i', 'ö' => 'o', 'ş' => 's', 'ü' => 'u', 'Ç' => 'C', 'Ə' => 'E', 'Ğ' => 'G', 'İ' => 'I', 'Ö' => 'O', 'Ş' => 'S', 'Ü' => 'U', ], // Slovak 'sk' => [ 'á' => 'a', 'ä' => 'a', 'č' => 'c', 'ď' => 'd', 'é' => 'e', 'í' => 'i', 'ľ' => 'l', 'ĺ' => 'l', 'ň' => 'n', 'ó' => 'o', 'ô' => 'o', 'ŕ' => 'r', 'š' => 's', 'ť' => 't', 'ú' => 'u', 'ý' => 'y', 'ž' => 'z', 'Á' => 'A', 'Ä' => 'A', 'Č' => 'C', 'Ď' => 'D', 'É' => 'E', 'Í' => 'I', 'Ľ' => 'L', 'Ĺ' => 'L', 'Ň' => 'N', 'Ó' => 'O', 'Ô' => 'O', 'Ŕ' => 'R', 'Š' => 'S', 'Ť' => 'T', 'Ú' => 'U', 'Ý' => 'Y', 'Ž' => 'Z', ], // French 'fr' => [ 'Æ' => 'AE', 'æ' => 'ae', 'Œ' => 'OE', 'œ' => 'oe', 'â' => 'a', 'Â' => 'A', 'à' => 'a', 'À' => 'A', 'ä' => 'a', 'Ä' => 'A', 'ç' => 'c', 'Ç' => 'C', 'é' => 'e', 'É' => 'E', 'ê' => 'e', 'Ê' => 'E', 'ë' => 'e', 'Ë' => 'E', 'è' => 'e', 'È' => 'E', 'ï' => 'i', 'î' => 'i', 'Ï' => 'I', 'Î' => 'I', 'ÿ' => 'y', 'Ÿ' => 'Y', 'ô' => 'o', 'Ô' => 'O', 'ö' => 'o', 'Ö' => 'O', 'û' => 'u', 'Û' => 'U', 'ù' => 'u', 'Ù' => 'U', 'ü' => 'u', 'Ü' => 'U', ], // Austrian (French) 'fr_at' => [ 'ß' => 'sz', 'ẞ' => 'SZ', 'Æ' => 'AE', 'æ' => 'ae', 'Œ' => 'OE', 'œ' => 'oe', 'â' => 'a', 'Â' => 'A', 'à' => 'a', 'À' => 'A', 'ä' => 'a', 'Ä' => 'A', 'ç' => 'c', 'Ç' => 'C', 'é' => 'e', 'É' => 'E', 'ê' => 'e', 'Ê' => 'E', 'ë' => 'e', 'Ë' => 'E', 'è' => 'e', 'È' => 'E', 'ï' => 'i', 'î' => 'i', 'Ï' => 'I', 'Î' => 'I', 'ÿ' => 'y', 'Ÿ' => 'Y', 'ô' => 'o', 'Ô' => 'O', 'ö' => 'o', 'Ö' => 'O', 'û' => 'u', 'Û' => 'U', 'ù' => 'u', 'Ù' => 'U', 'ü' => 'u', 'Ü' => 'U', ], // Switzerland (French) 'fr_ch' => [ 'ß' => 'ss', 'ẞ' => 'SS', 'Æ' => 'AE', 'æ' => 'ae', 'Œ' => 'OE', 'œ' => 'oe', 'â' => 'a', 'Â' => 'A', 'à' => 'a', 'À' => 'A', 'ä' => 'a', 'Ä' => 'A', 'ç' => 'c', 'Ç' => 'C', 'é' => 'e', 'É' => 'E', 'ê' => 'e', 'Ê' => 'E', 'ë' => 'e', 'Ë' => 'E', 'è' => 'e', 'È' => 'E', 'ï' => 'i', 'î' => 'i', 'Ï' => 'I', 'Î' => 'I', 'ÿ' => 'y', 'Ÿ' => 'Y', 'ô' => 'o', 'Ô' => 'O', 'ö' => 'o', 'Ö' => 'O', 'û' => 'u', 'Û' => 'U', 'ù' => 'u', 'Ù' => 'U', 'ü' => 'u', 'Ü' => 'U', ], // German 'de' => [ 'Ä' => 'Ae', 'Ö' => 'Oe', 'Ü' => 'Ue', 'ä' => 'ae', 'ö' => 'oe', 'ü' => 'ue', 'ß' => 'ss', 'ẞ' => 'SS', ], // Austrian (German) 'de_at' => [ 'Ä' => 'Ae', 'Ö' => 'Oe', 'Ü' => 'Ue', 'ä' => 'ae', 'ö' => 'oe', 'ü' => 'ue', 'ß' => 'sz', 'ẞ' => 'SZ', ], // Switzerland (German) 'de_ch' => [ 'Ä' => 'Ae', 'Ö' => 'Oe', 'Ü' => 'Ue', 'ä' => 'ae', 'ö' => 'oe', 'ü' => 'ue', 'ß' => 'ss', 'ẞ' => 'SS', ], // Bengali (Bangla) 'bn' => [ 'ভ্ল' => 'vl', 'পশ' => 'psh', 'ব্ধ' => 'bdh', 'ব্জ' => 'bj', 'ব্দ' => 'bd', 'ব্ব' => 'bb', 'ব্ল' => 'bl', 'ভ' => 'v', 'ব' => 'b', 'চ্ঞ' => 'cNG', 'চ্ছ' => 'cch', 'চ্চ' => 'cc', 'ছ' => 'ch', 'চ' => 'c', 'ধ্ন' => 'dhn', 'ধ্ম' => 'dhm', 'দ্ঘ' => 'dgh', 'দ্ধ' => 'ddh', 'দ্ভ' => 'dv', 'দ্ম' => 'dm', 'ড্ড' => 'DD', 'ঢ' => 'Dh', 'ধ' => 'dh', 'দ্গ' => 'dg', 'দ্দ' => 'dd', 'ড' => 'D', 'দ' => 'd', '।' => '.', 'ঘ্ন' => 'Ghn', 'গ্ধ' => 'Gdh', 'গ্ণ' => 'GN', 'গ্ন' => 'Gn', 'গ্ম' => 'Gm', 'গ্ল' => 'Gl', 'জ্ঞ' => 'jNG', 'ঘ' => 'Gh', 'গ' => 'g', 'হ্ণ' => 'hN', 'হ্ন' => 'hn', 'হ্ম' => 'hm', 'হ্ল' => 'hl', 'হ' => 'h', 'জ্ঝ' => 'jjh', 'ঝ' => 'jh', 'জ্জ' => 'jj', 'জ' => 'j', 'ক্ষ্ণ' => 'kxN', 'ক্ষ্ম' => 'kxm', 'ক্ষ' => 'ksh', 'কশ' => 'ksh', 'ক্ক' => 'kk', 'ক্ট' => 'kT', 'ক্ত' => 'kt', 'ক্ল' => 'kl', 'ক্স' => 'ks', 'খ' => 'kh', 'ক' => 'k', 'ল্ভ' => 'lv', 'ল্ধ' => 'ldh', 'লখ' => 'lkh', 'লঘ' => 'lgh', 'লফ' => 'lph', 'ল্ক' => 'lk', 'ল্গ' => 'lg', 'ল্ট' => 'lT', 'ল্ড' => 'lD', 'ল্প' => 'lp', 'ল্ম' => 'lm', 'ল্ল' => 'll', 'ল্ব' => 'lb', 'ল' => 'l', 'ম্থ' => 'mth', 'ম্ফ' => 'mf', 'ম্ভ' => 'mv', 'মপ্ল' => 'mpl', 'ম্ন' => 'mn', 'ম্প' => 'mp', 'ম্ম' => 'mm', 'ম্ল' => 'ml', 'ম্ব' => 'mb', 'ম' => 'm', '০' => '0', '১' => '1', '২' => '2', '৩' => '3', '৪' => '4', '৫' => '5', '৬' => '6', '৭' => '7', '৮' => '8', '৯' => '9', 'ঙ্ক্ষ' => 'Ngkx', 'ঞ্ছ' => 'nch', 'ঙ্ঘ' => 'ngh', 'ঙ্খ' => 'nkh', 'ঞ্ঝ' => 'njh', 'ঙ্গৌ' => 'ngOU', 'ঙ্গৈ' => 'ngOI', 'ঞ্চ' => 'nc', 'ঙ্ক' => 'nk', 'ঙ্ষ' => 'Ngx', 'ঙ্গ' => 'ngo', 'ঙ্ম' => 'Ngm', 'ঞ্জ' => 'nj', 'ন্ধ' => 'ndh', 'ন্ঠ' => 'nTh', 'ণ্ঠ' => 'NTh', 'ন্থ' => 'nth', 'ঙ্গা' => 'nga', 'ঙ্গি' => 'ngi', 'ঙ্গী' => 'ngI', 'ঙ্গু' => 'ngu', 'ঙ্গূ' => 'ngU', 'ঙ্গে' => 'nge', 'ঙ্গো' => 'ngO', 'ণ্ঢ' => 'NDh', 'নশ' => 'nsh', 'ঙর' => 'Ngr', 'ঞর' => 'NGr', 'ংর' => 'ngr', 'ঙ' => 'Ng', 'ঞ' => 'NG', 'ং' => 'ng', 'ন্ন' => 'nn', 'ণ্ণ' => 'NN', 'ণ্ন' => 'Nn', 'ন্ম' => 'nm', 'ণ্ম' => 'Nm', 'ন্দ' => 'nd', 'ন্ট' => 'nT', 'ণ্ট' => 'NT', 'ন্ড' => 'nD', 'ণ্ড' => 'ND', 'ন্ত' => 'nt', 'ন্স' => 'ns', 'ন' => 'n', 'ণ' => 'N', 'ৈ' => 'OI', 'ৌ' => 'OU', 'ো' => 'O', 'ঐ' => 'OI', 'ঔ' => 'OU', 'অ' => 'o', 'ও' => 'oo', 'ফ্ল' => 'fl', 'প্ট' => 'pT', 'প্ত' => 'pt', 'প্ন' => 'pn', 'প্প' => 'pp', 'প্ল' => 'pl', 'প্স' => 'ps', 'ফ' => 'f', 'প' => 'p', 'ৃ' => 'rri', 'ঋ' => 'rri', 'রর‍্য' => 'rry', '্র্য' => 'ry', '্রর' => 'rr', 'ড়্গ' => 'Rg', 'ঢ়' => 'Rh', 'ড়' => 'R', 'র' => 'r', '্র' => 'r', 'শ্ছ' => 'Sch', 'ষ্ঠ' => 'ShTh', 'ষ্ফ' => 'Shf', 'স্ক্ল' => 'skl', 'স্খ' => 'skh', 'স্থ' => 'sth', 'স্ফ' => 'sf', 'শ্চ' => 'Sc', 'শ্ত' => 'St', 'শ্ন' => 'Sn', 'শ্ম' => 'Sm', 'শ্ল' => 'Sl', 'ষ্ক' => 'Shk', 'ষ্ট' => 'ShT', 'ষ্ণ' => 'ShN', 'ষ্প' => 'Shp', 'ষ্ম' => 'Shm', 'স্প্ল' => 'spl', 'স্ক' => 'sk', 'স্ট' => 'sT', 'স্ত' => 'st', 'স্ন' => 'sn', 'স্প' => 'sp', 'স্ম' => 'sm', 'স্ল' => 'sl', 'শ' => 'S', 'ষ' => 'Sh', 'স' => 's', 'ু' => 'u', 'উ' => 'u', 'অ্য' => 'oZ', 'ত্থ' => 'tth', 'ৎ' => 'tt', 'ট্ট' => 'TT', 'ট্ম' => 'Tm', 'ঠ' => 'Th', 'ত্ন' => 'tn', 'ত্ম' => 'tm', 'থ' => 'th', 'ত্ত' => 'tt', 'ট' => 'T', 'ত' => 't', 'অ্যা' => 'AZ', 'া' => 'a', 'আ' => 'a', 'য়া' => 'ya', 'য়' => 'y', 'ি' => 'i', 'ই' => 'i', 'ী' => 'ee', 'ঈ' => 'ee', 'ূ' => 'uu', 'ঊ' => 'uu', 'ে' => 'e', 'এ' => 'e', 'য' => 'z', '্য' => 'Z', 'ইয়' => 'y', 'ওয়' => 'w', '্ব' => 'w', 'এক্স' => 'x', 'ঃ' => ':', 'ঁ' => 'nn', '্‌' => '', ], // English 'en' => [ ], // Latin (+ Cyrillic ?) chars // // -> Mix of languages, but we need to keep this here, so that different languages can handle there own behavior. 'latin' => [ '˚' => '0', '¹' => '1', '²' => '2', '³' => '3', '⁴' => '4', '⁵' => '5', '⁶' => '6', '⁷' => '7', '⁸' => '8', '⁹' => '9', '₀' => '0', '₁' => '1', '₂' => '2', '₃' => '3', '₄' => '4', '₅' => '5', '₆' => '6', '₇' => '7', '₈' => '8', '₉' => '9', '௦' => '0', '௧' => '1', '௨' => '2', '௩' => '3', '௪' => '4', '௫' => '5', '௬' => '6', '௭' => '7', '௮' => '8', '௯' => '9', '௰' => '10', '௱' => '100', '௲' => '1000', 'Ꜳ' => 'AA', 'ꜳ' => 'aa', 'Æ' => 'AE', 'æ' => 'ae', 'Ǽ' => 'AE', 'ǽ' => 'ae', 'Ꜵ' => 'AO', 'ꜵ' => 'ao', 'Ꜷ' => 'AU', 'ꜷ' => 'au', 'Ꜹ' => 'AV', 'ꜹ' => 'av', 'Ꜻ' => 'av', 'ꜻ' => 'av', 'Ꜽ' => 'AY', 'ꜽ' => 'ay', 'ȸ' => 'db', 'ʣ' => 'dz', 'ʥ' => 'dz', 'ʤ' => 'dezh', '🙰' => 'et', 'ff' => 'ff', 'ffi' => 'ffi', 'ffl' => 'ffl', 'fi' => 'fi', 'fl' => 'fl', 'ʩ' => 'feng', 'IJ' => 'IJ', 'ij' => 'ij', 'ʪ' => 'ls', 'ʫ' => 'lz', 'ɮ' => 'lezh', 'ȹ' => 'qp', 'ʨ' => 'tc', 'ʦ' => 'ts', 'ʧ' => 'tesh', 'Œ' => 'OE', 'œ' => 'oe', 'Ꝏ' => 'OO', 'ꝏ' => 'oo', 'ẞ' => 'SS', 'ß' => 'ss', 'st' => 'st', 'ſt' => 'st', 'Ꜩ' => 'TZ', 'ꜩ' => 'tz', 'ᵫ' => 'ue', 'Aι' => 'Ai', 'αι' => 'ai', 'Ει' => 'Ei', 'ει' => 'ei', 'Οι' => 'Oi', 'οι' => 'oi', 'Ου' => 'Oy', 'ου' => 'oy', 'Υι' => 'Yi', 'υι' => 'yi', 'ἀ' => 'a', 'ἁ' => 'a', 'ἂ' => 'a', 'ἃ' => 'a', 'ἄ' => 'a', 'ἅ' => 'a', 'ἆ' => 'a', 'ἇ' => 'a', 'Ἀ' => 'A', 'Ἁ' => 'A', 'Ἂ' => 'A', 'Ἃ' => 'A', 'Ἄ' => 'A', 'Ἅ' => 'A', 'Ἆ' => 'A', 'Ἇ' => 'A', 'ᾰ' => 'a', 'ᾱ' => 'a', 'ᾲ' => 'a', 'ᾳ' => 'a', 'ᾴ' => 'a', 'ᾶ' => 'a', 'ᾷ' => 'a', 'Ᾰ' => 'A', 'Ᾱ' => 'A', 'Ὰ' => 'A', 'Ά' => 'A', 'ᾼ' => 'A', 'Ä' => 'A', 'ä' => 'a', 'À' => 'A', 'à' => 'a', 'Á' => 'A', 'á' => 'a', 'Â' => 'A', 'â' => 'a', 'Ã' => 'A', 'ã' => 'a', 'A̧' => 'A', 'a̧' => 'a', 'Ą' => 'A', 'ą' => 'a', 'Ⱥ' => 'A', 'ⱥ' => 'a', 'Å' => 'A', 'å' => 'a', 'Ǻ' => 'A', 'ǻ' => 'a', 'Ă' => 'A', 'ă' => 'a', 'Ǎ' => 'A', 'ǎ' => 'a', 'Ȧ' => 'A', 'ȧ' => 'a', 'Ạ' => 'A', 'ạ' => 'a', 'Ā' => 'A', 'ā' => 'a', 'ª' => 'a', 'Ɓ' => 'B', 'Ѣ' => 'E', 'ѣ' => 'e', 'Ç' => 'C', 'ç' => 'c', 'Ĉ' => 'C', 'ĉ' => 'c', 'C̈' => 'C', 'c̈' => 'c', 'C̨' => 'C', 'c̨' => 'c', 'Ȼ' => 'C', 'ȼ' => 'c', 'Č' => 'C', 'č' => 'c', 'Ć' => 'C', 'ć' => 'c', 'C̀' => 'C', 'c̀' => 'c', 'Ċ' => 'C', 'ċ' => 'c', 'C̣' => 'C', 'c̣' => 'c', 'C̄' => 'C', 'c̄' => 'c', 'C̃' => 'C', 'c̃' => 'c', 'Ð' => 'D', 'Đ' => 'D', 'ð' => 'd', 'đ' => 'd', 'È' => 'E', 'É' => 'E', 'Ê' => 'E', 'Ë' => 'E', 'Ĕ' => 'E', 'Ė' => 'E', 'Ȩ' => 'E', 'ȩ' => 'e', 'Ę' => 'E', 'ę' => 'e', 'Ɇ' => 'E', 'ɇ' => 'e', 'Ě' => 'E', 'ě' => 'e', 'Ẹ' => 'E', 'ẹ' => 'e', 'Ē' => 'E', 'ē' => 'e', 'Ẽ' => 'E', 'ẽ' => 'e', 'è' => 'e', 'é' => 'e', 'ê' => 'e', 'ë' => 'e', 'ĕ' => 'e', 'ė' => 'e', 'ƒ' => 'f', 'Ѳ' => 'F', 'ѳ' => 'f', 'Ĝ' => 'G', 'Ġ' => 'G', 'ĝ' => 'g', 'ġ' => 'g', 'Ĥ' => 'H', 'Ħ' => 'H', 'ĥ' => 'h', 'ħ' => 'h', 'Ì' => 'I', 'Í' => 'I', 'Î' => 'I', 'Ï' => 'I', 'Ĩ' => 'I', 'Ĭ' => 'I', 'Ǐ' => 'I', 'Į' => 'I', 'ì' => 'i', 'í' => 'i', 'î' => 'i', 'ï' => 'i', 'ĩ' => 'i', 'ĭ' => 'i', 'ǐ' => 'i', 'į' => 'i', 'І' => 'I', 'і' => 'i', 'I̧' => 'I', 'i̧' => 'i', 'Ɨ' => 'I', 'ɨ' => 'i', 'İ' => 'I', 'i' => 'i', 'Ị' => 'I', 'ị' => 'i', 'Ī' => 'I', 'ī' => 'i', 'Ĵ' => 'J', 'ĵ' => 'j', 'J́́' => 'J', 'j́' => 'j', 'J̀̀' => 'J', 'j̀' => 'j', 'J̈' => 'J', 'j̈' => 'j', 'J̧' => 'J', 'j̧' => 'j', 'J̨' => 'J', 'j̨' => 'j', 'Ɉ' => 'J', 'ɉ' => 'j', 'J̌' => 'J', 'ǰ' => 'j', 'J̇' => 'J', 'j' => 'j', 'J̣' => 'J', 'j̣' => 'j', 'J̄' => 'J', 'j̄' => 'j', 'J̃' => 'J', 'j̃' => 'j', 'Й' => 'i', 'й' => 'i', 'ĸ' => 'k', 'Ĺ' => 'L', 'Ľ' => 'L', 'Ŀ' => 'L', 'ĺ' => 'l', 'ľ' => 'l', 'ŀ' => 'l', 'L̀' => 'L', 'l̀' => 'l', 'L̂' => 'L', 'l̂' => 'l', 'L̈' => 'L', 'l̈' => 'l', 'Ļ' => 'L', 'ļ' => 'l', 'L̨' => 'L', 'l̨' => 'l', 'Ł' => 'L', 'ł' => 'l', 'Ƚ' => 'L', 'ƚ' => 'l', 'L̇' => 'L', 'l̇' => 'l', 'Ḷ' => 'L', 'ḷ' => 'l', 'L̄' => 'L', 'l̄' => 'l', 'L̃' => 'L', 'l̃' => 'l', 'Ñ' => 'N', 'ñ' => 'n', 'Ŋ' => 'N', 'ŋ' => 'n', 'ʼn' => 'n', 'Ń' => 'N', 'ń' => 'n', 'Ǹ' => 'N', 'ǹ' => 'n', 'N̂' => 'N', 'n̂' => 'n', 'N̈' => 'N', 'n̈' => 'n', 'Ņ' => 'N', 'ņ' => 'n', 'N̨' => 'N', 'n̨' => 'n', 'Ꞥ' => 'N', 'ꞥ' => 'n', 'Ň' => 'N', 'ň' => 'n', 'Ṅ' => 'N', 'ṅ' => 'n', 'Ṇ' => 'N', 'ṇ' => 'n', 'N̄' => 'N', 'n̄' => 'n', 'Ö' => 'O', 'Ò' => 'O', 'Ó' => 'O', 'Ô' => 'O', 'Õ' => 'O', 'Ō' => 'O', 'Ŏ' => 'O', 'Ǒ' => 'O', 'Ő' => 'O', 'Ơ' => 'O', 'Ø' => 'O', 'Ǿ' => 'O', 'ö' => 'o', 'ò' => 'o', 'ó' => 'o', 'ô' => 'o', 'õ' => 'o', 'ō' => 'o', 'ŏ' => 'o', 'ǒ' => 'o', 'ő' => 'o', 'ơ' => 'o', 'ø' => 'o', 'ǿ' => 'o', 'º' => 'o', 'O̧' => 'O', 'o̧' => 'o', 'Ǫ' => 'O', 'ǫ' => 'o', 'Ɵ' => 'O', 'ɵ' => 'o', 'Ȯ' => 'O', 'ȯ' => 'o', 'Ọ' => 'O', 'ọ' => 'o', 'Ŕ' => 'R', 'Ŗ' => 'R', 'ŕ' => 'r', 'ŗ' => 'r', 'Ŝ' => 'S', 'Ș' => 'S', 'ș' => 's', 'Ś' => 'S', 'ś' => 's', 'S̀' => 'S', 's̀' => 's', 'Ŝ̀' => 'S', 'ŝ' => 's', 'S̈' => 'S', 's̈' => 's', 'Ş' => 'S', 'ş' => 's', 'S̨' => 'S', 's̨' => 's', 'Ꞩ' => 'S', 'ꞩ' => 's', 'Š' => 'S', 'š' => 's', 'Ṡ' => 'S', 'ṡ' => 's', 'Ṣ' => 'S', 'ṣ' => 's', 'S̄' => 'S', 's̄' => 's', 'S̃' => 'S', 's̃' => 's', 'ſ' => 's', 'Ţ' => 'T', 'Ț' => 'T', 'Ŧ' => 'T', 'Þ' => 'TH', 'ţ' => 't', 'ț' => 't', 'ŧ' => 't', 'þ' => 'th', 'T́' => 'T', 't́' => 't', 'T̀' => 'T', 't̀' => 't', 'T̂' => 'T', 't̂' => 't', 'T̈' => 'T', 'ẗ' => 't', 'T̨' => 'T', 't̨' => 't', 'Ⱦ' => 'T', 'ⱦ' => 't', 'Ť' => 'T', 'ť' => 't', 'Ṫ' => 'T', 'ṫ' => 't', 'Ṭ' => 'T', 'ṭ' => 't', 'T̄' => 'T', 't̄' => 't', 'T̃' => 'T', 't̃' => 't', 'Ü' => 'U', 'Ù' => 'U', 'Ú' => 'U', 'Û' => 'U', 'Ũ' => 'U', 'Ŭ' => 'U', 'Ű' => 'U', 'Ų' => 'U', 'Ư' => 'U', 'Ǔ' => 'U', 'Ǖ' => 'U', 'Ǘ' => 'U', 'Ǚ' => 'U', 'Ǜ' => 'U', 'ü' => 'u', 'ù' => 'u', 'ú' => 'u', 'û' => 'u', 'ũ' => 'u', 'ŭ' => 'u', 'ű' => 'u', 'ų' => 'u', 'ư' => 'u', 'ǔ' => 'u', 'ǖ' => 'u', 'ǘ' => 'u', 'ǚ' => 'u', 'ǜ' => 'u', 'U̧' => 'U', 'u̧' => 'u', 'Ʉ' => 'U', 'ʉ' => 'u', 'U̇' => 'U', 'u̇' => 'u', 'Ụ' => 'U', 'ụ' => 'u', 'Ū' => 'U', 'ū' => 'u', 'Ʊ' => 'U', 'ʊ' => 'u', 'Ŵ' => 'W', 'ŵ' => 'w', 'Ẁ' => 'W', 'ẁ' => 'w', 'Ẃ' => 'W', 'ẃ' => 'w', 'Ẅ' => 'W', 'ẅ' => 'w', 'Ѵ' => 'I', 'ѵ' => 'i', 'Ꙗ' => 'Ja', 'ꙗ' => 'ja', 'Є' => 'Je', 'є' => 'je', 'Ѥ' => 'Je', 'ѥ' => 'je', 'Ѕ' => 'Dz', 'ѕ' => 'dz', 'Ꙋ' => 'U', 'ꙋ' => 'u', 'Ѡ' => 'O', 'ѡ' => 'o', 'Ѿ' => 'Ot', 'ѿ' => 'ot', 'Ѫ' => 'U', 'ѫ' => 'u', 'Ѧ' => 'Ja', 'ѧ' => 'ja', 'Ѭ' => 'Ju', 'ѭ' => 'ju', 'Ѩ' => 'Ja', 'ѩ' => 'Ja', 'Ѯ' => 'Ks', 'ѯ' => 'ks', 'Ѱ' => 'Ps', 'ѱ' => 'ps', 'Х' => 'X', 'х' => 'x', 'Ý' => 'Y', 'Ÿ' => 'Y', 'Ŷ' => 'Y', 'ý' => 'y', 'ÿ' => 'y', 'ŷ' => 'y', 'Ỳ' => 'Y', 'ỳ' => 'y', 'Y̧' => 'Y', 'y̧' => 'y', 'Y̨' => 'Y', 'y̨' => 'y', 'Ɏ' => 'Y', 'ɏ' => 'y', 'Y̌' => 'Y', 'y̌' => 'y', 'Ẏ' => 'Y', 'ẏ' => 'y', 'Ỵ' => 'Y', 'ỵ' => 'y', 'Ȳ' => 'Y', 'ȳ' => 'y', 'Ỹ' => 'Y', 'ỹ' => 'y', 'Щ' => 'Shh', 'щ' => 'shh', 'Ź' => 'Z', 'ź' => 'z', 'Z̀' => 'Z', 'z̀' => 'z', 'Ẑ' => 'Z', 'ẑ' => 'z', 'Z̈' => 'Z', 'z̈' => 'z', 'Z̧' => 'Z', 'z̧' => 'z', 'Z̨' => 'Z', 'z̨' => 'z', 'Ƶ' => 'Z', 'ƶ' => 'z', 'Ž' => 'Z', 'ž' => 'z', 'Ż' => 'Z', 'ż' => 'z', 'Ẓ' => 'Z', 'ẓ' => 'z', 'Z̄' => 'Z', 'z̄' => 'z', 'Z̃' => 'Z', 'z̃' => 'z', ], // whitespace chars ' ' => [ "\xc2\xa0" => ' ', // 'NO-BREAK SPACE' "\xe1\x9a\x80" => ' ', // 'OGHAM SPACE MARK' "\xe2\x80\x80" => ' ', // 'EN QUAD' "\xe2\x80\x81" => ' ', // 'EM QUAD' "\xe2\x80\x82" => ' ', // 'EN SPACE' "\xe2\x80\x83" => ' ', // 'EM SPACE' "\xe2\x80\x84" => ' ', // 'THREE-PER-EM SPACE' "\xe2\x80\x85" => ' ', // 'FOUR-PER-EM SPACE' "\xe2\x80\x86" => ' ', // 'SIX-PER-EM SPACE' "\xe2\x80\x87" => ' ', // 'FIGURE SPACE' "\xe2\x80\x88" => ' ', // 'PUNCTUATION SPACE' "\xe2\x80\x89" => ' ', // 'THIN SPACE' "\xe2\x80\x8a" => ' ', // 'HAIR SPACE' "\xe2\x80\xa8" => ' ', // 'LINE SEPARATOR' "\xe2\x80\xa9" => ' ', // 'PARAGRAPH SEPARATOR' "\xe2\x80\x8b" => ' ', // 'ZERO WIDTH SPACE' "\xe2\x80\xaf" => ' ', // 'NARROW NO-BREAK SPACE' "\xe2\x81\x9f" => ' ', // 'MEDIUM MATHEMATICAL SPACE' "\xe3\x80\x80" => ' ', // 'IDEOGRAPHIC SPACE' "\xef\xbe\xa0" => ' ', // 'HALFWIDTH HANGUL FILLER' ], // commonly used in Word documents 'msword' => [ "\xc2\xab" => '<<', // « (U+00AB) in UTF-8 "\xc2\xbb" => '>>', // » (U+00BB) in UTF-8 "\xe2\x80\x98" => "'", // ‘ (U+2018) in UTF-8 "\xe2\x80\x99" => "'", // ’ (U+2019) in UTF-8 "\xe2\x80\x9a" => "'", // ‚ (U+201A) in UTF-8 "\xe2\x80\x9b" => "'", // ‛ (U+201B) in UTF-8 "\xe2\x80\x9c" => '"', // “ (U+201C) in UTF-8 "\xe2\x80\x9d" => '"', // ” (U+201D) in UTF-8 "\xe2\x80\x9e" => '"', // „ (U+201E) in UTF-8 "\xe2\x80\x9f" => '"', // ‟ (U+201F) in UTF-8 "\xe2\x80\xb9" => "'", // ‹ (U+2039) in UTF-8 "\xe2\x80\xba" => "'", // › (U+203A) in UTF-8 "\xe2\x80\x93" => '-', // – (U+2013) in UTF-8 "\xe2\x80\x94" => '-', // — (U+2014) in UTF-8 "\xe2\x80\xa6" => '...', // … (U+2026) in UTF-8 ], // Currency // // url => https://en.wikipedia.org/wiki/Currency_symbol 'currency_short' => [ '€' => 'EUR', '$' => '$', '₢' => 'Cr', '₣' => 'Fr.', '£' => 'PS', '₤' => 'L.', 'ℳ' => 'M', '₥' => 'mil', '₦' => 'N', '₧' => 'Pts', '₨' => 'Rs', 'රු' => 'LKR', 'ரூ' => 'LKR', '௹' => 'Rs', 'रू' => 'NPR', '₹' => 'Rs', '૱' => 'Rs', '₩' => 'W', '₪' => 'NS', '₸' => 'KZT', '₫' => 'D', '֏' => 'AMD', '₭' => 'K', '₺' => 'TL', '₼' => 'AZN', '₮' => 'T', '₯' => 'Dr', '₲' => 'PYG', '₾' => 'GEL', '₳' => 'ARA', '₴' => 'UAH', '₽' => 'RUB', '₵' => 'GHS', '₡' => 'CL', '¢' => 'c', '¥' => 'YEN', '円' => 'JPY', '৳' => 'BDT', '元' => 'CNY', '﷼' => 'SAR', '៛' => 'KR', '₠' => 'ECU', '¤' => '$?', '฿' => 'THB', '؋' => 'AFN', ], ]; PKZ:~=Lhelper/data/x006.phpnuW+Ahelper/data/x0cc.phpnuW+A 'a', 'b', 'c', 'd', 'e', 'f', 'g', 'h', 'i', 'j', 'k', 'l', 'm', 'n', 'o', 'p', 'q', 'r', 's', 't', 'u', 'v', 'w', 'x', 'y', 'z', 52 => 'A', 'B', 'C', 'D', 'E', 'F', 'G', 'H', 'I', 'J', 'K', 'L', 'M', 'N', 'O', 'P', 'Q', 'R', 'S', 'T', 'U', 'V', 'W', 'X', 'Y', 'Z', 78 => 'a', 'b', 'c', 'd', 'e', 'f', 'g', 'h', 'i', 'j', 'k', 'l', 'm', 'n', 'o', 'p', 'q', 'r', 's', 't', 'u', 'v', 'w', 'x', 'y', 'z', 104 => 'A', 'B', 'C', 'D', 'E', 'F', 'G', 'H', 'I', 'J', 'K', 'L', 'M', 'N', 'O', 'P', 'Q', 'R', 'S', 'T', 'U', 'V', 'W', 'X', 'Y', 'Z', 130 => 'a', 'b', 'c', 'd', 'e', 'f', 'g', 'h', 'i', 'j', 'k', 'l', 'm', 'n', 'o', 'p', 'q', 'r', 's', 't', 'u', 'v', 'w', 'x', 'y', 'z', 156 => 'B', 'C', 'D', 'E', 'F', 'G', 'H', 'I', 'J', 'K', 'L', 'M', 'N', 'O', 'P', 'Q', 'R', 'S', 'T', 'U', 'V', 'W', 'X', 'Y', 'Z', 181 => 'Z', 182 => 'a', 'b', 'c', 'd', 'e', 'f', 'g', 'h', 'i', 'j', 'k', 'l', 'm', 'n', 'o', 'p', 'q', 'r', 's', 't', 'u', 'v', 'w', 'x', 'y', 'z', 208 => 'A', 'B', 'C', 'D', 'E', 'F', 'G', 'H', 'I', 'J', 'K', 'L', 'M', 'N', 'O', 'P', 'Q', 'R', 'S', 'T', 'U', 'V', 'W', 'X', 'Y', 'Z', 234 => 'a', 'b', 'c', 'd', 'e', 'f', 'g', 'h', 'i', 'j', 'k', 'l', 'm', 'n', 'o', 'p', 'q', 'r', 's', 't', 'u', 'v', 'w', 'x', 'y', 'z']; PKZ helper/data/x0c4.phpnuW+A 'A', 'B', 'C', 'D', 'E', 'F', 'G', 'H', 'I', 'J', 'K', 'L', 'M', 'N', 'O', 'P', 'Q', 'R', 'S', 'T', 'U', 'V', 'W', 'X', 'Y', 'Z', 80 => 'a', 'b', 'c', 'd', 'e', 'f', 'g', 'h', 'i', 'j', 'k', 'l', 'm', 'n', 'o', 'p', 'q', 'r', 's', 't', 'u', 'v', 'w', 'x', 'y', 'z', 112 => 'A', 'B', 'C', 'D', 'E', 'F', 'G', 'H', 'I', 'J', 'K', 'L', 'M', 'N', 'O', 'P', 'Q', 'R', 'S', 'T', 'U', 'V', 'W', 'X', 'Y', 'Z', 230 => 'A', 'B', 'C', 'D', 'E', 'F', 'G', 'H', 'I', 'J', 'K', 'L', 'M', 'N', 'O', 'P', 'Q', 'R', 'S', 'T', 'U', 'V', 'W', 'X', 'Y', 'Z', ]; PKZ)ٛhelper/data/x0a2.phpnuW+A>helper/data/x093.phpnuW+A 0, "\x00" => 0, "\x01" => 1, "\x02" => 2, "\x03" => 3, "\x04" => 4, "\x05" => 5, "\x06" => 6, "\x07" => 7, "\x08" => 8, "\x09" => 9, "\x0A" => 10, "\x0B" => 11, "\x0C" => 12, "\x0D" => 13, "\x0E" => 14, "\x0F" => 15, "\x10" => 16, "\x11" => 17, "\x12" => 18, "\x13" => 19, "\x14" => 20, "\x15" => 21, "\x16" => 22, "\x17" => 23, "\x18" => 24, "\x19" => 25, "\x1A" => 26, "\x1B" => 27, "\x1C" => 28, "\x1D" => 29, "\x1E" => 30, "\x1F" => 31, "\x20" => 32, "\x21" => 33, "\x22" => 34, "\x23" => 35, "\x24" => 36, "\x25" => 37, "\x26" => 38, "\x27" => 39, "\x28" => 40, "\x29" => 41, "\x2A" => 42, "\x2B" => 43, "\x2C" => 44, "\x2D" => 45, "\x2E" => 46, "\x2F" => 47, "\x30" => 48, "\x31" => 49, "\x32" => 50, "\x33" => 51, "\x34" => 52, "\x35" => 53, "\x36" => 54, "\x37" => 55, "\x38" => 56, "\x39" => 57, "\x3A" => 58, "\x3B" => 59, "\x3C" => 60, "\x3D" => 61, "\x3E" => 62, "\x3F" => 63, "\x40" => 64, "\x41" => 65, "\x42" => 66, "\x43" => 67, "\x44" => 68, "\x45" => 69, "\x46" => 70, "\x47" => 71, "\x48" => 72, "\x49" => 73, "\x4A" => 74, "\x4B" => 75, "\x4C" => 76, "\x4D" => 77, "\x4E" => 78, "\x4F" => 79, "\x50" => 80, "\x51" => 81, "\x52" => 82, "\x53" => 83, "\x54" => 84, "\x55" => 85, "\x56" => 86, "\x57" => 87, "\x58" => 88, "\x59" => 89, "\x5A" => 90, "\x5B" => 91, "\x5C" => 92, "\x5D" => 93, "\x5E" => 94, "\x5F" => 95, "\x60" => 96, "\x61" => 97, "\x62" => 98, "\x63" => 99, "\x64" => 100, "\x65" => 101, "\x66" => 102, "\x67" => 103, "\x68" => 104, "\x69" => 105, "\x6A" => 106, "\x6B" => 107, "\x6C" => 108, "\x6D" => 109, "\x6E" => 110, "\x6F" => 111, "\x70" => 112, "\x71" => 113, "\x72" => 114, "\x73" => 115, "\x74" => 116, "\x75" => 117, "\x76" => 118, "\x77" => 119, "\x78" => 120, "\x79" => 121, "\x7A" => 122, "\x7B" => 123, "\x7C" => 124, "\x7D" => 125, "\x7E" => 126, "\x7F" => 127, "\x80" => 128, "\x81" => 129, "\x82" => 130, "\x83" => 131, "\x84" => 132, "\x85" => 133, "\x86" => 134, "\x87" => 135, "\x88" => 136, "\x89" => 137, "\x8A" => 138, "\x8B" => 139, "\x8C" => 140, "\x8D" => 141, "\x8E" => 142, "\x8F" => 143, "\x90" => 144, "\x91" => 145, "\x92" => 146, "\x93" => 147, "\x94" => 148, "\x95" => 149, "\x96" => 150, "\x97" => 151, "\x98" => 152, "\x99" => 153, "\x9A" => 154, "\x9B" => 155, "\x9C" => 156, "\x9D" => 157, "\x9E" => 158, "\x9F" => 159, "\xA0" => 160, "\xA1" => 161, "\xA2" => 162, "\xA3" => 163, "\xA4" => 164, "\xA5" => 165, "\xA6" => 166, "\xA7" => 167, "\xA8" => 168, "\xA9" => 169, "\xAA" => 170, "\xAB" => 171, "\xAC" => 172, "\xAD" => 173, "\xAE" => 174, "\xAF" => 175, "\xB0" => 176, "\xB1" => 177, "\xB2" => 178, "\xB3" => 179, "\xB4" => 180, "\xB5" => 181, "\xB6" => 182, "\xB7" => 183, "\xB8" => 184, "\xB9" => 185, "\xBA" => 186, "\xBB" => 187, "\xBC" => 188, "\xBD" => 189, "\xBE" => 190, "\xBF" => 191, "\xC0" => 192, "\xC1" => 193, "\xC2" => 194, "\xC3" => 195, "\xC4" => 196, "\xC5" => 197, "\xC6" => 198, "\xC7" => 199, "\xC8" => 200, "\xC9" => 201, "\xCA" => 202, "\xCB" => 203, "\xCC" => 204, "\xCD" => 205, "\xCE" => 206, "\xCF" => 207, "\xD0" => 208, "\xD1" => 209, "\xD2" => 210, "\xD3" => 211, "\xD4" => 212, "\xD5" => 213, "\xD6" => 214, "\xD7" => 215, "\xD8" => 216, "\xD9" => 217, "\xDA" => 218, "\xDB" => 219, "\xDC" => 220, "\xDD" => 221, "\xDE" => 222, "\xDF" => 223, "\xE0" => 224, "\xE1" => 225, "\xE2" => 226, "\xE3" => 227, "\xE4" => 228, "\xE5" => 229, "\xE6" => 230, "\xE7" => 231, "\xE8" => 232, "\xE9" => 233, "\xEA" => 234, "\xEB" => 235, "\xEC" => 236, "\xED" => 237, "\xEE" => 238, "\xEF" => 239, "\xF0" => 240, "\xF1" => 241, "\xF2" => 242, "\xF3" => 243, "\xF4" => 244, "\xF5" => 245, "\xF6" => 246, "\xF7" => 247, "\xF8" => 248, "\xF9" => 249, "\xFA" => 250, "\xFB" => 251, "\xFC" => 252, "\xFD" => 253, "\xFE" => 254, "\xFF" => 255]; PKZcPPhelper/data/x01f.phpnuW+A ', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]']; PKZhelper/data/x0b4.phpnuW+A>|null */ private static $ASCII_MAPS; /** * @var array>|null */ private static $ASCII_MAPS_AND_EXTRAS; /** * @var array>|null */ private static $ASCII_EXTRAS; /** * @var array|null */ private static $ORD; /** * @var array|null */ private static $LANGUAGE_MAX_KEY; /** * url: https://en.wikipedia.org/wiki/Wikipedia:ASCII#ASCII_printable_characters * * @var string */ private static $REGEX_ASCII = "[^\x09\x10\x13\x0A\x0D\x20-\x7E]"; /** * bidirectional text chars * * url: https://www.w3.org/International/questions/qa-bidi-unicode-controls * * @var array */ private static $BIDI_UNI_CODE_CONTROLS_TABLE = [ // LEFT-TO-RIGHT EMBEDDING (use -> dir = "ltr") 8234 => "\xE2\x80\xAA", // RIGHT-TO-LEFT EMBEDDING (use -> dir = "rtl") 8235 => "\xE2\x80\xAB", // POP DIRECTIONAL FORMATTING // (use -> ) 8236 => "\xE2\x80\xAC", // LEFT-TO-RIGHT OVERRIDE // (use -> ) 8237 => "\xE2\x80\xAD", // RIGHT-TO-LEFT OVERRIDE // (use -> ) 8238 => "\xE2\x80\xAE", // LEFT-TO-RIGHT ISOLATE // (use -> dir = "ltr") 8294 => "\xE2\x81\xA6", // RIGHT-TO-LEFT ISOLATE // (use -> dir = "rtl") 8295 => "\xE2\x81\xA7", // FIRST STRONG ISOLATE // (use -> dir = "auto") 8296 => "\xE2\x81\xA8", // POP DIRECTIONAL ISOLATE 8297 => "\xE2\x81\xA9", ]; /** * Get all languages from the constants "ASCII::.*LANGUAGE_CODE". * * @return array *

An associative array where the key is the language code in lowercase * and the value is the corresponding language string.

*/ public static function getAllLanguages(): array { // init static $LANGUAGES = []; if ($LANGUAGES !== []) { return $LANGUAGES; } foreach ((new \ReflectionClass(__CLASS__))->getConstants() as $constant => $lang) { if (\strpos($constant, 'EXTRA') !== false) { $LANGUAGES[\strtolower($constant)] = $lang; } else { $LANGUAGES[\strtolower(\str_replace('_LANGUAGE_CODE', '', $constant))] = $lang; } } return $LANGUAGES; } /** * Returns an replacement array for ASCII methods. * * EXAMPLE: * $array = ASCII::charsArray(); * var_dump($array['ru']['б']); // 'b' * * * @param bool $replace_extra_symbols [optional]

Add some more replacements e.g. "£" with " pound ".

* * @psalm-pure * * @return array> *

An array where the key is the language code, and the value is * an associative array mapping original characters to their replacements.

*/ public static function charsArray(bool $replace_extra_symbols = false): array { if ($replace_extra_symbols) { self::prepareAsciiAndExtrasMaps(); return self::$ASCII_MAPS_AND_EXTRAS ?? []; } self::prepareAsciiMaps(); return self::$ASCII_MAPS ?? []; } /** * Returns an replacement array for ASCII methods with a mix of multiple languages. * * EXAMPLE: * $array = ASCII::charsArrayWithMultiLanguageValues(); * var_dump($array['b']); // ['β', 'б', 'ဗ', 'ბ', 'ب'] * * * @param bool $replace_extra_symbols [optional]

Add some more replacements e.g. "£" with " pound ".

* * @psalm-pure * * @return array> *

An array of replacements.

*/ public static function charsArrayWithMultiLanguageValues(bool $replace_extra_symbols = false): array { static $CHARS_ARRAY = []; $cacheKey = '' . $replace_extra_symbols; if (isset($CHARS_ARRAY[$cacheKey])) { return $CHARS_ARRAY[$cacheKey]; } // init $return = []; $language_all_chars = self::charsArrayWithSingleLanguageValues( $replace_extra_symbols, false ); /* @noinspection AlterInForeachInspection | ok here */ foreach ($language_all_chars as $key => &$value) { $return[$value][] = $key; } $CHARS_ARRAY[$cacheKey] = $return; return $return; } /** * Returns an replacement array for ASCII methods with one language. * * For example, German will map 'ä' to 'ae', while other languages * will simply return e.g. 'a'. * * EXAMPLE: * $array = ASCII::charsArrayWithOneLanguage('ru'); * $tmpKey = \array_search('yo', $array['replace']); * echo $array['orig'][$tmpKey]; // 'ё' * * * @param string $language [optional]

Language of the source string e.g.: en, de_at, or de-ch. * (default is 'en') | ASCII::*_LANGUAGE_CODE

* @param bool $replace_extra_symbols [optional]

Add some more replacements e.g. "£" with " pound ".

* @param bool $asOrigReplaceArray [optional]

TRUE === return {orig: list, replace: list} * array

* * @psalm-pure * * @return ($asOrigReplaceArray is true ? array{orig: list, replace: list} : array) * * @phpstan-param ASCII::*_LANGUAGE_CODE $language */ public static function charsArrayWithOneLanguage( string $language = self::ENGLISH_LANGUAGE_CODE, bool $replace_extra_symbols = false, bool $asOrigReplaceArray = true ): array { $language = self::get_language($language); // init static $CHARS_ARRAY = []; $cacheKey = '' . $replace_extra_symbols . '-' . $asOrigReplaceArray; // check static cache if (isset($CHARS_ARRAY[$cacheKey][$language])) { return $CHARS_ARRAY[$cacheKey][$language]; } if ($replace_extra_symbols) { self::prepareAsciiAndExtrasMaps(); if (isset(self::$ASCII_MAPS_AND_EXTRAS[$language])) { $tmpArray = self::$ASCII_MAPS_AND_EXTRAS[$language]; if ($asOrigReplaceArray) { $CHARS_ARRAY[$cacheKey][$language] = [ 'orig' => \array_keys($tmpArray), 'replace' => \array_values($tmpArray), ]; } else { $CHARS_ARRAY[$cacheKey][$language] = $tmpArray; } } else { if ($asOrigReplaceArray) { $CHARS_ARRAY[$cacheKey][$language] = [ 'orig' => [], 'replace' => [], ]; } else { $CHARS_ARRAY[$cacheKey][$language] = []; } } } else { self::prepareAsciiMaps(); if (isset(self::$ASCII_MAPS[$language])) { $tmpArray = self::$ASCII_MAPS[$language]; if ($asOrigReplaceArray) { $CHARS_ARRAY[$cacheKey][$language] = [ 'orig' => \array_keys($tmpArray), 'replace' => \array_values($tmpArray), ]; } else { $CHARS_ARRAY[$cacheKey][$language] = $tmpArray; } } else { if ($asOrigReplaceArray) { $CHARS_ARRAY[$cacheKey][$language] = [ 'orig' => [], 'replace' => [], ]; } else { $CHARS_ARRAY[$cacheKey][$language] = []; } } } return $CHARS_ARRAY[$cacheKey][$language] ?? ['orig' => [], 'replace' => []]; } /** * Returns an replacement array for ASCII methods with multiple languages. * * EXAMPLE: * $array = ASCII::charsArrayWithSingleLanguageValues(); * $tmpKey = \array_search('hnaik', $array['replace']); * echo $array['orig'][$tmpKey]; // '၌' * * * @param bool $replace_extra_symbols [optional]

Add some more replacements e.g. "£" with " pound ".

* @param bool $asOrigReplaceArray [optional]

TRUE === return {orig: list, replace: list} * array

* * @psalm-pure * * @return ($asOrigReplaceArray is true ? array{orig: list, replace: list} : array) */ public static function charsArrayWithSingleLanguageValues( bool $replace_extra_symbols = false, bool $asOrigReplaceArray = true ): array { // init static $CHARS_ARRAY = []; $cacheKey = '' . $replace_extra_symbols . '-' . $asOrigReplaceArray; if (isset($CHARS_ARRAY[$cacheKey])) { return $CHARS_ARRAY[$cacheKey]; } if ($replace_extra_symbols) { self::prepareAsciiAndExtrasMaps(); /* @noinspection AlterInForeachInspection | ok here */ foreach (self::$ASCII_MAPS_AND_EXTRAS ?? [] as &$map) { $CHARS_ARRAY[$cacheKey][] = $map; } } else { self::prepareAsciiMaps(); /* @noinspection AlterInForeachInspection | ok here */ foreach (self::$ASCII_MAPS ?? [] as &$map) { $CHARS_ARRAY[$cacheKey][] = $map; } } $CHARS_ARRAY[$cacheKey] = \array_merge([], ...$CHARS_ARRAY[$cacheKey]); if ($asOrigReplaceArray) { $CHARS_ARRAY[$cacheKey] = [ 'orig' => \array_keys($CHARS_ARRAY[$cacheKey]), 'replace' => \array_values($CHARS_ARRAY[$cacheKey]), ]; } return $CHARS_ARRAY[$cacheKey]; } /** * Accepts a string and removes all non-UTF-8 characters from it + extras if needed. * * @param string $str

The string to be sanitized.

* @param bool $normalize_whitespace [optional]

Set to true, if you need to normalize the * whitespace.

* @param bool $normalize_msword [optional]

Set to true, if you need to normalize MS Word chars * e.g.: "…" * => "..."

* @param bool $keep_non_breaking_space [optional]

Set to true, to keep non-breaking-spaces, in * combination with * $normalize_whitespace

* @param bool $remove_invisible_characters [optional]

Set to false, if you not want to remove invisible * characters e.g.: "\0"

* * @psalm-pure * * @return string *

A clean UTF-8 string.

*/ public static function clean( string $str, bool $normalize_whitespace = true, bool $keep_non_breaking_space = false, bool $normalize_msword = true, bool $remove_invisible_characters = true ): string { // http://stackoverflow.com/questions/1401317/remove-non-utf8-characters-from-string // caused connection reset problem on larger strings $regex = '/ ( (?: [\x00-\x7F] # single-byte sequences 0xxxxxxx | [\xC0-\xDF][\x80-\xBF] # double-byte sequences 110xxxxx 10xxxxxx | [\xE0-\xEF][\x80-\xBF]{2} # triple-byte sequences 1110xxxx 10xxxxxx * 2 | [\xF0-\xF7][\x80-\xBF]{3} # quadruple-byte sequence 11110xxx 10xxxxxx * 3 ){1,100} # ...one or more times ) | ( [\x80-\xBF] ) # invalid byte in range 10000000 - 10111111 | ( [\xC0-\xFF] ) # invalid byte in range 11000000 - 11111111 /x'; $str = (string) \preg_replace($regex, '$1', $str); if ($normalize_whitespace) { $str = self::normalize_whitespace($str, $keep_non_breaking_space); } if ($normalize_msword) { $str = self::normalize_msword($str); } if ($remove_invisible_characters) { $str = self::remove_invisible_characters($str); } return $str; } /** * Checks if a string is 7 bit ASCII. * * EXAMPLE: * ASCII::is_ascii('白'); // false * * * @param string $str

The string to check.

* * @psalm-pure * * @return bool *

* true if it is ASCII
* false otherwise *

*/ public static function is_ascii(string $str): bool { if ($str === '') { return true; } return !\preg_match('/' . self::$REGEX_ASCII . '/', $str); } /** * Returns a string with smart quotes, ellipsis characters, and dashes from * Windows-1252 (commonly used in Word documents) replaced by their ASCII * equivalents. * * EXAMPLE: * ASCII::normalize_msword('„Abcdef…”'); // '"Abcdef..."' * * * @param string $str

The string to be normalized.

* * @psalm-pure * * @return string *

A string with normalized characters for commonly used chars in Word documents.

*/ public static function normalize_msword(string $str): string { if ($str === '') { return ''; } static $MSWORD_CACHE = ['orig' => [], 'replace' => []]; if (empty($MSWORD_CACHE['orig'])) { self::prepareAsciiMaps(); $map = self::$ASCII_MAPS[self::EXTRA_MSWORD_CHARS_LANGUAGE_CODE] ?? []; $MSWORD_CACHE = [ 'orig' => \array_keys($map), 'replace' => \array_values($map), ]; } return \str_replace($MSWORD_CACHE['orig'], $MSWORD_CACHE['replace'], $str); } /** * Normalize the whitespace. * * EXAMPLE: * ASCII::normalize_whitespace("abc-\xc2\xa0-öäü-\xe2\x80\xaf-\xE2\x80\xAC", true); // "abc-\xc2\xa0-öäü- -" * * * @param string $str

The string to be normalized.

* @param bool $keepNonBreakingSpace [optional]

Set to true, to keep non-breaking-spaces.

* @param bool $keepBidiUnicodeControls [optional]

Set to true, to keep non-printable (for the web) * bidirectional text chars.

* @param bool $normalize_control_characters [optional]

Set to true, to convert e.g. LINE-, PARAGRAPH-SEPARATOR with "\n" and LINE TABULATION with "\t".

* * @psalm-pure * * @return string *

A string with normalized whitespace.

*/ public static function normalize_whitespace( string $str, bool $keepNonBreakingSpace = false, bool $keepBidiUnicodeControls = false, bool $normalize_control_characters = false ): string { if ($str === '') { return ''; } static $WHITESPACE_CACHE = []; $cacheKey = (int) $keepNonBreakingSpace; if ($normalize_control_characters) { $str = \str_replace( [ "\x0d\x0c", // 'END OF LINE' "\xe2\x80\xa8", // 'LINE SEPARATOR' "\xe2\x80\xa9", // 'PARAGRAPH SEPARATOR' "\x0c", // 'FORM FEED' // "\f" "\x0b", // 'VERTICAL TAB' // "\v" ], [ "\n", "\n", "\n", "\n", "\t", ], $str ); } if (!isset($WHITESPACE_CACHE[$cacheKey])) { self::prepareAsciiMaps(); $WHITESPACE_CACHE[$cacheKey] = self::$ASCII_MAPS[self::EXTRA_WHITESPACE_CHARS_LANGUAGE_CODE] ?? []; if ($keepNonBreakingSpace) { unset($WHITESPACE_CACHE[$cacheKey]["\xc2\xa0"]); } $WHITESPACE_CACHE[$cacheKey] = array_keys($WHITESPACE_CACHE[$cacheKey]); } if (!$keepBidiUnicodeControls) { static $BIDI_UNICODE_CONTROLS_CACHE = null; if ($BIDI_UNICODE_CONTROLS_CACHE === null) { $BIDI_UNICODE_CONTROLS_CACHE = self::$BIDI_UNI_CODE_CONTROLS_TABLE; } $str = \str_replace($BIDI_UNICODE_CONTROLS_CACHE, '', $str); } return \str_replace($WHITESPACE_CACHE[$cacheKey], ' ', $str); } /** * Remove invisible characters from a string. * * This prevents malicious code injection through null bytes or other control characters. * * copy&past from https://github.com/bcit-ci/CodeIgniter/blob/develop/system/core/Common.php * * @param string $str * @param bool $url_encoded * @param string $replacement * @param bool $keep_basic_control_characters * * @psalm-pure * * @return string */ public static function remove_invisible_characters( string $str, bool $url_encoded = false, string $replacement = '', bool $keep_basic_control_characters = true ): string { // init $non_displayables = []; // every control character except: // - newline (dec 10), // - carriage return (dec 13), // - horizontal tab (dec 09) if ($url_encoded) { $non_displayables[] = '/%0[0-8bcefBCEF]/'; // url encoded 00-08, 11, 12, 14, 15 $non_displayables[] = '/%1[0-9a-fA-F]/'; // url encoded 16-31 } if ($keep_basic_control_characters) { $non_displayables[] = '/[\x00-\x08\x0B\x0C\x0E-\x1F\x7F]+/S'; // 00-08, 11, 12, 14-31, 127 } else { $str = self::normalize_whitespace($str, false, false, true); $non_displayables[] = '/[^\P{C}\s]/u'; } do { $str = (string) \preg_replace($non_displayables, $replacement, $str, -1, $count); } while ($count !== 0); return $str; } /** * WARNING: This method will return broken characters and is only for special cases. * * Convert two UTF-8 encoded strings to a single-byte strings suitable for * functions that need the same string length after the conversion. * * The function simply uses (and updates) a tailored dynamic encoding * (in/out map parameter) where non-ascii characters are remapped to * the range [128-255] in order of appearance. * * @return array{0: string, 1: string} */ public static function to_ascii_remap(string $str1, string $str2): array { $charMap = []; $str1 = self::to_ascii_remap_intern($str1, $charMap); $str2 = self::to_ascii_remap_intern($str2, $charMap); return [$str1, $str2]; } /** * Returns an ASCII version of the string. A set of non-ASCII characters are * replaced with their closest ASCII counterparts, and the rest are removed * by default. The language or locale of the source string can be supplied * for language-specific transliteration in any of the following formats: * en, en_GB, or en-GB. For example, passing "de" results in "äöü" mapping * to "aeoeue" rather than "aou" as in other languages. * * EXAMPLE: * ASCII::to_ascii('�Düsseldorf�', 'en'); // Dusseldorf * * * @param string $str

The input string.

* @param string $language [optional]

Language of the source string. * (default is 'en') | ASCII::*_LANGUAGE_CODE

* @param bool $remove_unsupported_chars [optional]

Whether to remove the * unsupported characters.

* @param bool $replace_extra_symbols [optional]

Add some more replacements e.g. "£" with " pound * ".

* @param bool $use_transliterate [optional]

Use ASCII::to_transliterate() for unknown chars.

* @param bool $replace_single_chars_only [optional]

Single char replacement is better for the * performance, but some languages need to replace more than one char * at the same time. If FALSE === auto-setting, depended on the * language

* * @psalm-pure * * @return string *

A string that contains only ASCII characters.

* * @phpstan-param ASCII::*_LANGUAGE_CODE $language */ public static function to_ascii( string $str, string $language = self::ENGLISH_LANGUAGE_CODE, bool $remove_unsupported_chars = true, bool $replace_extra_symbols = false, bool $use_transliterate = false, bool $replace_single_chars_only = false ): string { if ($str === '') { return ''; } /** @phpstan-var ASCII::*_LANGUAGE_CODE $language - hack for phpstan */ $language = self::get_language($language); static $EXTRA_SYMBOLS_CACHE = null; static $REPLACE_HELPER_CACHE = []; $cacheKey = $language . '-' . $replace_extra_symbols; if (!isset($REPLACE_HELPER_CACHE[$cacheKey])) { $langAll = self::charsArrayWithSingleLanguageValues($replace_extra_symbols, false); $langSpecific = self::charsArrayWithOneLanguage($language, $replace_extra_symbols, false); if ($langSpecific === []) { $REPLACE_HELPER_CACHE[$cacheKey] = $langAll; } else { $REPLACE_HELPER_CACHE[$cacheKey] = \array_merge([], $langAll, $langSpecific); } } if ( $replace_extra_symbols && $EXTRA_SYMBOLS_CACHE === null ) { $EXTRA_SYMBOLS_CACHE = []; foreach (self::$ASCII_EXTRAS ?? [] as $extrasDataTmp) { foreach ($extrasDataTmp as $extrasDataKeyTmp => $extrasDataValueTmp) { $EXTRA_SYMBOLS_CACHE[$extrasDataKeyTmp] = $extrasDataKeyTmp; } } $EXTRA_SYMBOLS_CACHE = \implode('', $EXTRA_SYMBOLS_CACHE); } $charDone = []; if (\preg_match_all('/' . self::$REGEX_ASCII . ($replace_extra_symbols ? '|[' . $EXTRA_SYMBOLS_CACHE . ']' : '') . '/u', $str, $matches)) { if (!$replace_single_chars_only) { if (self::$LANGUAGE_MAX_KEY === null) { self::$LANGUAGE_MAX_KEY = self::getData('ascii_language_max_key'); } $maxKeyLength = self::$LANGUAGE_MAX_KEY[$language] ?? 0; if ($maxKeyLength >= 5) { foreach ($matches[0] as $keyTmp => $char) { if (isset($matches[0][$keyTmp + 4])) { $fiveChars = $matches[0][$keyTmp + 0] . $matches[0][$keyTmp + 1] . $matches[0][$keyTmp + 2] . $matches[0][$keyTmp + 3] . $matches[0][$keyTmp + 4]; } else { $fiveChars = null; } if ( $fiveChars && !isset($charDone[$fiveChars]) && isset($REPLACE_HELPER_CACHE[$cacheKey][$fiveChars]) && \strpos($str, $fiveChars) !== false ) { // DEBUG //\var_dump($str, $fiveChars, $REPLACE_HELPER_CACHE[$cacheKey][$fiveChars]); $charDone[$fiveChars] = true; $str = \str_replace($fiveChars, $REPLACE_HELPER_CACHE[$cacheKey][$fiveChars], $str); // DEBUG //\var_dump($str, "\n"); } } } if ($maxKeyLength >= 4) { foreach ($matches[0] as $keyTmp => $char) { if (isset($matches[0][$keyTmp + 3])) { $fourChars = $matches[0][$keyTmp + 0] . $matches[0][$keyTmp + 1] . $matches[0][$keyTmp + 2] . $matches[0][$keyTmp + 3]; } else { $fourChars = null; } if ( $fourChars && !isset($charDone[$fourChars]) && isset($REPLACE_HELPER_CACHE[$cacheKey][$fourChars]) && \strpos($str, $fourChars) !== false ) { // DEBUG //\var_dump($str, $fourChars, $REPLACE_HELPER_CACHE[$cacheKey][$fourChars]); $charDone[$fourChars] = true; $str = \str_replace($fourChars, $REPLACE_HELPER_CACHE[$cacheKey][$fourChars], $str); // DEBUG //\var_dump($str, "\n"); } } } foreach ($matches[0] as $keyTmp => $char) { if (isset($matches[0][$keyTmp + 2])) { $threeChars = $matches[0][$keyTmp + 0] . $matches[0][$keyTmp + 1] . $matches[0][$keyTmp + 2]; } else { $threeChars = null; } if ( $threeChars && !isset($charDone[$threeChars]) && isset($REPLACE_HELPER_CACHE[$cacheKey][$threeChars]) && \strpos($str, $threeChars) !== false ) { // DEBUG //\var_dump($str, $threeChars, $REPLACE_HELPER_CACHE[$cacheKey][$threeChars]); $charDone[$threeChars] = true; $str = \str_replace($threeChars, $REPLACE_HELPER_CACHE[$cacheKey][$threeChars], $str); // DEBUG //\var_dump($str, "\n"); } } foreach ($matches[0] as $keyTmp => $char) { if (isset($matches[0][$keyTmp + 1])) { $twoChars = $matches[0][$keyTmp + 0] . $matches[0][$keyTmp + 1]; } else { $twoChars = null; } if ( $twoChars && !isset($charDone[$twoChars]) && isset($REPLACE_HELPER_CACHE[$cacheKey][$twoChars]) && \strpos($str, $twoChars) !== false ) { // DEBUG //\var_dump($str, $twoChars, $REPLACE_HELPER_CACHE[$cacheKey][$twoChars]); $charDone[$twoChars] = true; $str = \str_replace($twoChars, $REPLACE_HELPER_CACHE[$cacheKey][$twoChars], $str); // DEBUG //\var_dump($str, "\n"); } } } foreach ($matches[0] as $char) { if ( !isset($charDone[$char]) && isset($REPLACE_HELPER_CACHE[$cacheKey][$char]) && \strpos($str, $char) !== false ) { // DEBUG //\var_dump($str, $char, $REPLACE_HELPER_CACHE[$cacheKey][$char]); $charDone[$char] = true; $str = \str_replace($char, $REPLACE_HELPER_CACHE[$cacheKey][$char], $str); // DEBUG //\var_dump($str, "\n"); } } } if (!isset(self::$ASCII_MAPS[$language])) { $use_transliterate = true; } if ($use_transliterate) { $str = self::to_transliterate($str, null, false); } if ($remove_unsupported_chars) { $str = (string) \str_replace(["\n\r", "\n", "\r", "\t"], ' ', $str); $str = (string) \preg_replace('/' . self::$REGEX_ASCII . '/', '', $str); } return $str; } /** * Convert given string to safe filename (and keep string case). * * EXAMPLE: * ASCII::to_filename('שדגשדג.png', true)); // 'shdgshdg.png' * * * @param string $str

The string input.

* @param bool $use_transliterate

ASCII::to_transliterate() is used by default - unsafe characters are * simply replaced with hyphen otherwise.

* @param string $fallback_char

The fallback character. - "-" is the default

* * @psalm-pure * * @return string *

A string that contains only safe characters for a filename.

*/ public static function to_filename( string $str, bool $use_transliterate = true, string $fallback_char = '-' ): string { if ($use_transliterate) { $str = self::to_transliterate($str, $fallback_char); } $fallback_char_escaped = \preg_quote($fallback_char, '/'); $str = (string) \preg_replace( [ '/[^' . $fallback_char_escaped . '.\\-a-zA-Z\d\\s]/', // 1) remove un-needed chars '/\s+/u', // 2) convert spaces to $fallback_char '/[' . $fallback_char_escaped . ']+/u', // 3) remove double $fallback_char's ], [ '', $fallback_char, $fallback_char, ], $str ); return \trim($str, $fallback_char); } /** * Converts a string into a URL-friendly slug. * * - This includes replacing non-ASCII characters with their closest ASCII equivalents, removing remaining * non-ASCII and non-alphanumeric characters, and replacing whitespace with $separator. * - The separator defaults to a single dash, and the string is also converted to lowercase. * - The language of the source string can also be supplied for language-specific transliteration. * * @param string $str

The string input.

* @param string $separator [optional]

The string used to replace whitespace.

* @param string $language [optional]

Language of the source string. * (default is 'en') | ASCII::*_LANGUAGE_CODE

* @param array $replacements [optional]

A map of replaceable strings.

* @param bool $replace_extra_symbols [optional]

Add some more replacements e.g. "£" with " * pound ".

* @param bool $use_str_to_lower [optional]

Use "string to lower" for the input.

* @param bool $use_transliterate [optional]

Use ASCII::to_transliterate() for unknown * chars.

* @psalm-pure * * @return string *

The URL-friendly slug.

* * @phpstan-param ASCII::*_LANGUAGE_CODE $language */ public static function to_slugify( string $str, string $separator = '-', string $language = self::ENGLISH_LANGUAGE_CODE, array $replacements = [], bool $replace_extra_symbols = false, bool $use_str_to_lower = true, bool $use_transliterate = false ): string { if ($str === '') { return ''; } foreach ($replacements as $from => $to) { $str = \str_replace($from, $to, $str); } $str = self::to_ascii( $str, $language, false, $replace_extra_symbols, $use_transliterate ); $str = \str_replace('@', $separator, $str); $str = (string) \preg_replace( '/[^a-zA-Z\\d\\s\\-_' . \preg_quote($separator, '/') . ']/', '', $str ); if ($use_str_to_lower) { $str = \strtolower($str); } $str = (string) \preg_replace('/^[\'\\s]+|[\'\\s]+$/', '', $str); $str = (string) \preg_replace('/\\B([A-Z])/', '-\1', $str); $str = (string) \preg_replace('/[\\-_\\s]+/', $separator, $str); $l = \strlen($separator); if ($l && \strpos($str, $separator) === 0) { $str = (string) \substr($str, $l); } if (\substr($str, -$l) === $separator) { $str = (string) \substr($str, 0, \strlen($str) - $l); } return $str; } /** * Returns an ASCII version of the string. A set of non-ASCII characters are * replaced with their closest ASCII counterparts, and the rest are removed * unless instructed otherwise. * * EXAMPLE: * ASCII::to_transliterate('déjà σσς iıii'); // 'deja sss iiii' * * * @param string $str

The input string.

* @param string|null $unknown [optional]

Character use if character unknown. (default is '?') * But you can also use NULL to keep the unknown chars.

* @param bool $strict [optional]

Use "transliterator_transliterate()" from PHP-Intl * * @psalm-pure * * @return string *

A String that contains only ASCII characters.

*/ public static function to_transliterate( string $str, $unknown = '?', bool $strict = false ): string { static $UTF8_TO_TRANSLIT = null; static $TRANSLITERATOR = null; static $SUPPORT_INTL = null; if ($str === '') { return ''; } if ($SUPPORT_INTL === null) { $SUPPORT_INTL = \extension_loaded('intl'); } // check if we only have ASCII, first (better performance) $str_tmp = $str; if (self::is_ascii($str)) { return $str; } $str = self::clean($str); // check again if we only have ASCII, now ... if ( $str_tmp !== $str && self::is_ascii($str) ) { return $str; } if ( $strict && $SUPPORT_INTL === true ) { if (!isset($TRANSLITERATOR)) { // INFO: see "*-Latin" rules via "transliterator_list_ids()" $TRANSLITERATOR = \transliterator_create('NFKC; [:Nonspacing Mark:] Remove; NFKC; Any-Latin; Latin-ASCII;'); } // INFO: https://unicode.org/cldr/utility/character.jsp $str_tmp = \transliterator_transliterate($TRANSLITERATOR, $str); if ($str_tmp !== false) { // check again if we only have ASCII, now ... if ( $str_tmp !== $str && self::is_ascii($str_tmp) ) { return $str_tmp; } $str = $str_tmp; } } if (self::$ORD === null) { self::$ORD = self::getData('ascii_ord'); } \preg_match_all('/.|[^\x00]$/us', $str, $array_tmp); $chars = $array_tmp[0]; $ord = null; $str_tmp = ''; foreach ($chars as &$c) { $ordC0 = self::$ORD[$c[0]]; if ($ordC0 >= 0 && $ordC0 <= 127) { $str_tmp .= $c; continue; } $ordC1 = self::$ORD[$c[1]]; // ASCII - next please if ($ordC0 >= 192 && $ordC0 <= 223) { $ord = ($ordC0 - 192) * 64 + ($ordC1 - 128); } if ($ordC0 >= 224) { $ordC2 = self::$ORD[$c[2]]; if ($ordC0 <= 239) { $ord = ($ordC0 - 224) * 4096 + ($ordC1 - 128) * 64 + ($ordC2 - 128); } if ($ordC0 >= 240) { $ordC3 = self::$ORD[$c[3]]; if ($ordC0 <= 247) { $ord = ($ordC0 - 240) * 262144 + ($ordC1 - 128) * 4096 + ($ordC2 - 128) * 64 + ($ordC3 - 128); } // We only process valid UTF-8 chars (<= 4 byte), so we don't need this code here ... /* if ($ordC0 >= 248) { $ordC4 = self::$ORD[$c[4]]; if ($ordC0 <= 251) { $ord = ($ordC0 - 248) * 16777216 + ($ordC1 - 128) * 262144 + ($ordC2 - 128) * 4096 + ($ordC3 - 128) * 64 + ($ordC4 - 128); } if ($ordC0 >= 252) { $ordC5 = self::$ORD[$c[5]]; if ($ordC0 <= 253) { $ord = ($ordC0 - 252) * 1073741824 + ($ordC1 - 128) * 16777216 + ($ordC2 - 128) * 262144 + ($ordC3 - 128) * 4096 + ($ordC4 - 128) * 64 + ($ordC5 - 128); } } } */ } } if ( $ordC0 === 254 || $ordC0 === 255 || $ord === null ) { $str_tmp .= $unknown ?? $c; continue; } $bank = $ord >> 8; if (!isset($UTF8_TO_TRANSLIT[$bank])) { $UTF8_TO_TRANSLIT[$bank] = self::getDataIfExists(\sprintf('x%03x', $bank)); } $new_char = $ord & 255; if (isset($UTF8_TO_TRANSLIT[$bank][$new_char])) { // keep for debugging /* echo "file: " . sprintf('x%02x', $bank) . "\n"; echo "char: " . $c . "\n"; echo "ord: " . $ord . "\n"; echo "new_char: " . $new_char . "\n"; echo "new_char: " . mb_chr($new_char) . "\n"; echo "ascii: " . $UTF8_TO_TRANSLIT[$bank][$new_char] . "\n"; echo "bank:" . $bank . "\n\n"; */ $new_char = $UTF8_TO_TRANSLIT[$bank][$new_char]; /* @noinspection PhpStatementHasEmptyBodyInspection */ if ($unknown === null && $new_char === '') { // nothing } elseif ( $new_char === '[?]' || $new_char === '[?] ' ) { $c = $unknown ?? $c; } else { $c = $new_char; } } else { // keep for debugging missing chars /* echo "file: " . sprintf('x%02x', $bank) . "\n"; echo "char: " . $c . "\n"; echo "ord: " . $ord . "\n"; echo "new_char: " . $new_char . "\n"; echo "new_char: " . mb_chr($new_char) . "\n"; echo "bank:" . $bank . "\n\n"; */ $c = $unknown ?? $c; } $str_tmp .= $c; } return $str_tmp; } /** * WARNING: This method will return broken characters and is only for special cases. * * Convert a UTF-8 encoded string to a single-byte string suitable for * functions that need the same string length after the conversion. * * The function simply uses (and updates) a tailored dynamic encoding * (in/out map parameter) where non-ascii characters are remapped to * the range [128-255] in order of appearance. * * Thus, it supports up to 128 different multibyte code points max over * the whole set of strings sharing this encoding. * * Source: https://github.com/KEINOS/mb_levenshtein * * @param string $str

UTF-8 string to be converted to extended ASCII.

* @param array $map

Internal-Map of code points to ASCII characters.

* * @return string *

Mapped broken string.

* * @phpstan-param array $map */ private static function to_ascii_remap_intern(string $str, array &$map): string { // find all utf-8 characters $matches = []; if (!\preg_match_all('/[\xC0-\xF7][\x80-\xBF]+/', $str, $matches)) { return $str; // plain ascii string } // update the encoding map with the characters not already met $mapCount = \count($map); foreach ($matches[0] as $mbc) { if (!isset($map[$mbc])) { $map[$mbc] = \chr(128 + $mapCount); ++$mapCount; } } // finally, remap non-ascii characters return \strtr($str, $map); } /** * Get the language from a string. * * e.g.: de_at -> de_at * de_DE -> de * DE_DE -> de * de-de -> de * * @return string */ private static function get_language(string $language) { if ($language === '') { return ''; } if ( \strpos($language, '_') === false && \strpos($language, '-') === false ) { return \strtolower($language); } $language = \str_replace('-', '_', \strtolower($language)); $regex = '/(?[a-z]+)_\g{first}/'; return (string) \preg_replace($regex, '$1', $language); } /** * Get data from "/data/*.php". * * @return array */ private static function getData(string $file) { return include __DIR__ . '/data/' . $file . '.php'; } /** * Get data from "/data/*.php". * * @return array */ private static function getDataIfExists(string $file): array { $file = __DIR__ . '/data/' . $file . '.php'; if (\is_file($file)) { return include $file; } return []; } /** * @return void */ private static function prepareAsciiAndExtrasMaps() { if (self::$ASCII_MAPS_AND_EXTRAS === null) { self::prepareAsciiMaps(); self::prepareAsciiExtras(); self::$ASCII_MAPS_AND_EXTRAS = \array_merge_recursive( self::$ASCII_MAPS ?? [], self::$ASCII_EXTRAS ?? [] ); } } /** * @return void */ private static function prepareAsciiMaps() { if (self::$ASCII_MAPS === null) { self::$ASCII_MAPS = self::getData('ascii_by_languages'); } } /** * @return void */ private static function prepareAsciiExtras() { if (self::$ASCII_EXTRAS === null) { self::$ASCII_EXTRAS = self::getData('ascii_extras_by_languages'); } } } PK,Zh8portable-ascii/CHANGELOG.mdnuW+A# Changelog ### 2.0.3 (2024-11-21) - use modern phpdocs e.g. list or conditional-return annotations ### 2.0.2 (2024-11-21) - small fix for PHP 8.4 (thanks to @gilbertoalbino) ### 2.0.1 (2022-03-08) - "To people of Russia": There is a war in Ukraine right now. The forces of the Russian Federation are attacking civilians. - optimize some phpdocs ### 2.0.0 (2022-01-24) - prefer "Russian - Passport (2013), ICAO" instead of "Russian - GOST 7.79-2000(B)" - fix "Ukrainian" char-mapping (thanks to @Andr1yk0) - fix "Persian" char-mapping (thanks to @frost-cyber) ### 1.6.1 (2022-01-24) - revert: prefer "Russian - Passport (2013), ICAO" instead of "Russian - GOST 7.79-2000(B)" - revert: fix "Ukrainian" char-mapping (thanks to @Andr1yk0) - revert: fix "Persian" char-mapping (thanks to @frost-cyber) ### 1.6.0 (2022-01-24) - prefer "Russian - Passport (2013), ICAO" instead of "Russian - GOST 7.79-2000(B)" - fix "Ukrainian" char-mapping (thanks to @Andr1yk0) - fix "Persian" char-mapping (thanks to @frost-cyber) - fix "ASCII::normalize_whitespace()" -> "CARRIAGE RETURN" is more like "
" and no "\n" - add "ASCII::to_ascii_remap()" -> this method will return broken characters and is only for special cases ### 1.5.6 (2020-11-12) - "ASCII::normalize_whitespace()" -> can now also remove "control characters" if needed v2 ### 1.5.5 (2020-11-12) - fix "Greeklish" char-mapping (thanks @sebdesign) - "ASCII::normalize_whitespace()" -> can now also remove "control characters" if needed ### 1.5.4 (2020-11-08) - add some missing replacements in U+23xx page (thanks @marcoffee) - fix "Russian" char-mapping (thanks @ilyahoilik) - running test with PHP 8.0 rc3 ### 1.5.3 (2020-07-23) - fix "Georgian" char-mapping (thanks @waska14) ### 1.5.2 (2020-06-16) - add "Bengali" (bn) language support (thanks @eliyas5044) - fix "Portuguese" char-mapping - reduce the file size (removed extra comments from "avian2/unidecode") ### 1.5.1 (2020-05-26) - fix merge ASCII transliterations from "avian2/unidecode" (python) -> https://github.com/avian2/unidecode/ ### 1.5.0 (2020-05-24) - merge ASCII transliterations from "avian2/unidecode" (python) -> https://github.com/avian2/unidecode/ ### 1.4.11 (2020-05-23) - "composer.json" -> remove "autoload-dev" stuff from "autoload" - "voku/php-readme-helper" -> auto-generate the API documentation in the README ### 1.4.10 (2020-03-13) - ASCII::to_ascii() -> fix extra symbol handling in the regex - ASCII::to_ascii() -> fix for languages with multi-length-special-char (e.g. Greek -> 'ει' => 'i') ### 1.4.9 (2020-03-06) - ASCII::to_slugify() -> fix php warning from empty "separator" ### 1.4.8 (2020-02-06) - small optimization for "ASCII::to_ascii()" performance ### 1.4.7 (2020-01-27) - fix possible wrong type from "getDataIfExists()" -> e.g. a bug reported where "/data/" was modified - inline variables - do not use "=== true" for "bool"-types ### 1.4.6 (2019-12-23) - optimize "ASCII::to_ascii()" performance - add "armenian" chars - add "ASCII:getAllLanguages()" ### 1.4.5 (2019-12-19) - use "@psalm-pure" v2 ### 1.4.4 (2019-12-19) - use "@psalm-pure" ### 1.4.3 (2019-12-19) - use "@psalm-immutable" ### 1.4.2 (2019-12-13) - optimize the performance v2 - more fixes for non-ascii regex ### 1.4.1 (2019-12-13) - fix regex for non-ascii ### 1.4.0 (2019-12-13) - optimize the performance, via single char replacements ### 1.3.6 (2019-12-13) - "ascii_extras" -> convert the static content into ascii -> e.g.: instead of replacing "+" with "più" we use "piu" (Italian), because we want to use ascii anyway ### 1.3.5 (2019-11-11) - fix "ASCII::remove_invisible_characters()" -> do not remove invisible encoded url strings by default ### 1.3.4 (2019-10-14) - fix static cache for "ASCII::charsArrayWithOneLanguage" ### 1.3.3 (2019-10-14) - fix "Turkish" mapping -> 'ä' -> 'a' ### 1.3.2 (2019-10-14) - fix language parameter usage with e.g. "de_DE" - re-add missing "extra"-mapping chars ### 1.3.1 (2019-10-13) - fix "ASCII::to_slugify" -> remove unicode chars - add more test for ascii chars in the mapping - fix non ascii chars in the mapping ### 1.3.0 (2019-10-12) - add transliteration "fr" (was supported before, but with chars from other languages) - add transliteration "ru" - Passport (2013), ICAO - add transliteration "ru" - GOST 7.79-2000(B) - add transliteration "el" - greeklish - add transliteration "zh" - add transliteration "nl" - add transliteration "it" - add transliteration "mk" - add transliteration "pt" - add constants -> ASCII::*LANGUAGE_CODES - add more special latin chars / (currency) symbols - add simple tests for all supported languages - optimize "Russian" to ASCII (via "translit.ru") - optimize performance of string replacement - optimize performance of array merging - optimize phpdoc comments - "ASCII::to_transliterate" -> use "transliterator_create" + static cache - "ASCII::to_ascii" -> fix "remove unsupported chars" - "ASCII::to_ascii" -> add some more special chars - run/fix static analyse via "pslam" + "phpstan" - auto fix code style via "php-cs-fixer" - fix transliteration for "german" - fix transliteration for "persian" (thanks @mardep) - fix transliteration for "polish" (thanks @dariusz.drobisz) - fix transliteration for "bulgarian" (thanks @mkosturkov) - fix transliteration for "croatian" (thanks @ludifonovac) - fix transliteration for "serbian" (thanks @ludifonovac) - fix transliteration for "swedish" (thanks @nicholasruunu) - fix transliteration for "france" (thanks @sharptsa) - fix transliteration for "serbian" (thanks @nikolaposa) - fix transliteration for "czech" (thanks @slepic) ### 1.2.3 (2019-09-10) - fix language depending ASCII chars (the order matters) ### 1.2.2 (2019-09-10) - fix bulgarian ASCII chars | thanks @bgphp ### 1.2.1 (2019-09-07) - "charsArray()" -> add access to "ASCII::$ASCII_MAPS*"" ### 1.2.0 (2019-09-07) - "to_slugify()" -> use the extra ascii array ### 1.1.0 (2019-09-07) - add + split extra ascii replacements ### 1.0.0 (2019-09-05) - initial commitPK,Z +8 ,portable-ascii/src/voku/helper/data/x0ca.phpnuW+A>', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '21', '22', '23', '24', '25', '26', '27', '28', '29', '30', '31', '32', '33', '34', '35', '(g)', '(n)', '(d)', '(r)', '(m)', '(b)', '(s)', '()', '(j)', '(c)', '(k)', '(t)', '(p)', '(h)', '(ga)', '(na)', '(da)', '(ra)', '(ma)', '(ba)', '(sa)', '(a)', '(ja)', '(ca)', '(ka)', '(ta)', '(pa)', '(ha)', '[?]', '[?]', '[?]', 'KIS ', '(1) ', '(2) ', '(3) ', '(4) ', '(5) ', '(6) ', '(7) ', '(8) ', '(9) ', '(10) ', '(Yue) ', '(Huo) ', '(Shui) ', '(Mu) ', '(Jin) ', '(Tu) ', '(Ri) ', '(Zhu) ', '(You) ', '(She) ', '(Ming) ', '(Te) ', '(Cai) ', '(Zhu) ', '(Lao) ', '(Mi) ', '(Nan) ', '(Nu) ', '(Shi) ', '(You) ', '(Yin) ', '(Zhu) ', '(Xiang) ', '(Xiu) ', '(Xie) ', '(Zheng) ', '(Shang) ', '(Zhong) ', '(Xia) ', '(Zuo) ', '(You) ', '(Yi) ', '(Zong) ', '(Xue) ', '(Jian) ', '(Qi) ', '(Zi) ', '(Xie) ', '(Ye) ', '36', '37', '38', '39', '40', '41', '42', '43', '44', '45', '46', '47', '48', '49', '50', '1M', '2M', '3M', '4M', '5M', '6M', '7M', '8M', '9M', '10M', '11M', '12M', 'Hg', 'erg', 'eV', 'LTD', 'a', 'i', 'u', 'u', 'o', 'ka', 'ki', 'ku', 'ke', 'ko', 'sa', 'si', 'su', 'se', 'so', 'ta', 'ti', 'tu', 'te', 'to', 'na', 'ni', 'nu', 'ne', 'no', 'ha', 'hi', 'hu', 'he', 'ho', 'ma', 'mi', 'mu', 'me', 'mo', 'ya', 'yu', 'yo', 'ra', 'ri', 'ru', 're', 'ro', 'wa', 'wi', 'we', 'wo']; PK,Z7{M,portable-ascii/src/voku/helper/data/x0ff.phpnuW+A', '?', '@', 'A', 'B', 'C', 'D', 'E', 'F', 'G', 'H', 'I', 'J', 'K', 'L', 'M', 'N', 'O', 'P', 'Q', 'R', 'S', 'T', 'U', 'V', 'W', 'X', 'Y', 'Z', '[', '\\', ']', '^', '_', '`', 'a', 'b', 'c', 'd', 'e', 'f', 'g', 'h', 'i', 'j', 'k', 'l', 'm', 'n', 'o', 'p', 'q', 'r', 's', 't', 'u', 'v', 'w', 'x', 'y', 'z', '{', '|', '}', '~', '[?]', '[?]', '.', '[', ']', ',', '*', 'wo', 'a', 'i', 'u', 'e', 'o', 'ya', 'yu', 'yo', 'tu', '+', 'a', 'i', 'u', 'e', 'o', 'ka', 'ki', 'ku', 'ke', 'ko', 'sa', 'si', 'su', 'se', 'so', 'ta', 'ti', 'tu', 'te', 'to', 'na', 'ni', 'nu', 'ne', 'no', 'ha', 'hi', 'hu', 'he', 'ho', 'ma', 'mi', 'mu', 'me', 'mo', 'ya', 'yu', 'yo', 'ra', 'ri', 'ru', 're', 'ro', 'wa', 'n', ':', ';', '', 'g', 'gg', 'gs', 'n', 'nj', 'nh', 'd', 'dd', 'r', 'lg', 'lm', 'lb', 'ls', 'lt', 'lp', 'rh', 'm', 'b', 'bb', 'bs', 's', 'ss', '', 'j', 'jj', 'c', 'k', 't', 'p', 'h', '[?]', '[?]', '[?]', 'a', 'ae', 'ya', 'yae', 'eo', 'e', '[?]', '[?]', 'yeo', 'ye', 'o', 'wa', 'wae', 'oe', '[?]', '[?]', 'yo', 'u', 'weo', 'we', 'wi', 'yu', '[?]', '[?]', 'eu', 'yi', 'i', '[?]', '[?]', '[?]', '/C', 'PS', '!', '-', '|', 'Y=', 'W=', '[?]', '|', '-', '|', '-', '|', '#', 'O', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '{', '|', '}', '', '', '', '']; PK,Z4??,portable-ascii/src/voku/helper/data/x002.phpnuW+A', '^', 'V', '^', 'V', '\'', '-', '/', '\\', ',', '_', '\\', '/', ':', '.', '`', '\'', '^', 'V', '+', '-', 'V', '.', '@', ',', '~', '"', 'R', 'X', 'G', 'l', 's', 'x', '?', '', '', '', '', '', '', '', 'V', '=', '"', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]']; PK,Z˛,portable-ascii/src/voku/helper/data/x08c.phpnuW+Aportable-ascii/src/voku/helper/data/ascii_language_max_key.phpnuW+A 0, 'tk' => 1, 'th' => 0, 'ps' => 0, 'or' => 0, 'mn' => 0, 'ko' => 0, 'ky' => 0, 'hy' => 1, 'bn' => 5, 'be' => 0, 'am' => 0, 'ja' => 0, 'zh' => 0, 'nl' => 1, 'it' => 1, 'mk' => 1, 'pt' => 1, 'el__greeklish' => 2, 'el' => 2, 'hi' => 2, 'sv' => 1, 'tr' => 1, 'bg' => 2, 'hu' => 1, 'my' => 5, 'hr' => 2, 'fi' => 1, 'ka' => 1, 'ru' => 1, 'ru__gost_2000_b' => 1, 'ru__passport_2013' => 1, 'uk' => 1, 'kk' => 1, 'cs' => 1, 'da' => 1, 'pl' => 1, 'ro' => 1, 'eo' => 1, 'et' => 1, 'lv' => 1, 'lt' => 1, 'no' => 1, 'vi' => 1, 'ar' => 1, 'fa' => 1, 'sr' => 1, 'sr__cyr' => 1, 'sr__lat' => 1, 'az' => 1, 'sk' => 1, 'fr' => 1, 'fr_at' => 1, 'fr_ch' => 1, 'de' => 1, 'de_at' => 1, 'de_ch' => 1, 'en' => 0, 'latin' => 3, ' ' => 1, 'msword' => 1, ]; PK,Z(O3,portable-ascii/src/voku/helper/data/x022.phpnuW+A=', '<=', '>=', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]']; PK,Zž,77,portable-ascii/src/voku/helper/data/x072.phpnuW+A', '[?]', '[?]', '[?]', 'f', 'v', 'u', 'yr', 'y', 'w', 'th', 'th', 'a', 'o', 'ac', 'ae', 'o', 'o', 'o', 'oe', 'on', 'r', 'k', 'c', 'k', 'g', 'ng', 'g', 'g', 'w', 'h', 'h', 'h', 'h', 'n', 'n', 'n', 'i', 'e', 'j', 'g', 'ae', 'a', 'eo', 'p', 'z', 's', 's', 's', 'c', 'z', 't', 't', 'd', 'b', 'b', 'p', 'p', 'e', 'm', 'm', 'm', 'l', 'l', 'ng', 'ng', 'd', 'o', 'ear', 'ior', 'qu', 'qu', 'qu', 's', 'yr', 'yr', 'yr', 'q', 'x', '.', ':', '+', '17', '18', '19', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]']; PK,Zޕ"  ,portable-ascii/src/voku/helper/data/x0ae.phpnuW+A', '?', '@', 'A', 'B', 'C', 'D', 'E', 'F', 'G', 'H', 'I', 'J', 'K', 'L', 'M', 'N', 'O', 'P', 'Q', 'R', 'S', 'T', 'U', 'V', 'W', 'X', 'Y', 'Z', '[', '\\', ']', '^', '_', '`', 'a', 'b', 'c', 'd', 'e', 'f', 'g', 'h', 'i', 'j', 'k', 'l', 'm', 'n', 'o', 'p', 'q', 'r', 's', 't', 'u', 'v', 'w', 'x', 'y', 'z', '{', '|', '}', '~', '', 'EUR', // "\xc2\x80" => "\xe2\x82\xac" => EURO SIGN '', ',', 'f', ',,', // "\xc2\x84" => "\xe2\x80\x9e" => DOUBLE LOW-9 QUOTATION MARK '...', // "\xc2\x85" => "\xe2\x80\xa6" => HORIZONTAL ELLIPSIS '+', '++', // "\xc2\x87" => "\xe2\x80\xa1" => DOUBLE DAGGER '^', '%0', // "\xc2\x89" => "\xe2\x80\xb0" => PER MILLE SIGN 'S', '<', 'OE', // "\xc2\x8c" => "\xc5\x92" => LATIN CAPITAL LIGATURE OE '', 'Z', '', '', '\'', // "\xc2\x91" => "\xe2\x80\x98" => LEFT SINGLE QUOTATION MARK '\'', // "\xc2\x92" => "\xe2\x80\x99" => RIGHT SINGLE QUOTATION MARK '"', '"', '*', '-', '--', // "\xc2\x97" => "\xe2\x80\x94" => EM DASH '~', 'tm', 's', '>', 'oe', '', 'z', 'Y', ' ', '!', 'C/', 'PS', '$?', 'Y=', '|', 'SS', '"', '(c)', 'a', '<<', '!', '', '(r)', '-', 'deg', '+-', '2', '3', '\'', 'u', 'P', '*', ',', '1', 'o', '>>', '1/4', '1/2', '3/4', '?', 'A', 'A', 'A', 'A', // Not "AE" - used in languages other than German 'A', 'A', 'AE', 'C', 'E', 'E', 'E', 'E', 'I', 'I', 'I', 'I', 'D', 'N', 'O', 'O', 'O', 'O', // Not "OE" - used in languages other than German 'O', 'x', 'O', 'U', 'U', 'U', // Not "UE" - used in languages other than German 'U', 'Y', 'Th', 'ss', 'a', 'a', 'a', 'a', // Not "ae" - used in languages other than German 'a', 'a', 'ae', 'c', 'e', 'e', 'e', 'e', 'i', 'i', 'i', 'i', 'd', 'n', 'o', 'o', 'o', 'o', // Not "oe" - used in languages other than German 'o', '/', 'o', 'u', 'u', 'u', // Not "ue" - used in languages other than German 'u', 'y', 'th', 'y', ]; PK,ZLL,portable-ascii/src/voku/helper/data/x0b2.phpnuW+A', '.', '..', '...', '.', "\n", "\n\n", '', '', '', '', '', ' ', '%0', '%00', '\'', '\'\'', '\'\'\'', '`', '``', '```', '^', '<', '>', '*', '!!', '!?', '-', '_', '-', '^', '***', '--', '/', '-[', ']-', '??', '?!', '!?', '7', 'PP', '(]', '[)', '*', '[?]', '[?]', '[?]', '%', '~', '[?]', '[?]', '[?]', "''''", // 0x57 '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', ' ', '', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '', '', '', '', '', '', '0', 'i', '', '', '4', '5', '6', '7', '8', '9', '+', '-', '=', '(', ')', 'n', '0', '1', '2', '3', '4', '5', '6', '7', '8', '9', '+', '-', '=', '(', ')', '[?]', 'a', 'e', 'o', 'x', '[?]', 'h', 'k', 'l', 'm', 'n', 'p', 's', 't', '[?]', '[?]', '[?]', 'ECU', 'CL', 'Cr', 'Fr.', 'L.', 'mil', 'N', 'Pts', 'Rs', 'W', 'NS', 'D', 'EUR', 'K', 'T', 'Dr', 'Pf', 'P', 'G', 'A', 'UAH', 'C|', 'L', 'Sm', 'T', 'Rs', 'L', 'M', 'm', 'R', 'l', 'BTC', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '[?]', '', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', ]; PK,Z)D6"",portable-ascii/src/voku/helper/data/x065.phpnuW+A ', '<<', '>> ', '[', '] ', '{', '} ', '[(', ')] ', '@', 'X ', '[', '] ', '[[', ']] ', '((', ')) ', '[[', ']] ', '~ ', '``', '\'\'', ',,', '@', '1', '2', '3', '4', '5', '6', '7', '8', '9', '', '', '', '', '', '', '~', '+', '+', '+', '+', '', '@', ' // ', '+10+', '+20+', '+30+', '[?]', '[?]', '[?]', '', '', '[?]', 'a', 'a', 'i', 'i', 'u', 'u', 'e', 'e', 'o', 'o', 'ka', 'ga', 'ki', 'gi', 'ku', 'gu', 'ke', 'ge', 'ko', 'go', 'sa', 'za', 'shi', // 0x57 'zi', 'su', 'zu', 'se', 'ze', 'so', 'zo', 'ta', 'da', 'chi', // 0x61 'di', 'tsu', // 0x63 'tsu', // 0x64 'du', 'te', 'de', 'to', 'do', 'na', 'ni', 'nu', 'ne', 'no', 'ha', 'ba', 'pa', 'hi', 'bi', 'pi', 'hu', 'bu', 'pu', 'he', 'be', 'pe', 'ho', 'bo', 'po', 'ma', 'mi', 'mu', 'me', 'mo', 'ya', 'ya', 'yu', 'yu', 'yo', 'yo', 'ra', 'ri', 'ru', 're', 'ro', 'wa', 'wa', 'wi', 'we', 'wo', 'n', 'vu', '[?]', '[?]', '[?]', '[?]', '', '', '', '', '"', '"', '[?]', '[?]', 'a', 'a', 'i', 'i', 'u', 'u', 'e', 'e', 'o', 'o', 'ka', 'ga', 'ki', 'gi', 'ku', 'gu', 'ke', 'ge', 'ko', 'go', 'sa', 'za', 'shi', // 0xb7 'zi', 'su', 'zu', 'se', 'ze', 'so', 'zo', 'ta', 'da', 'chi', // 0xc1 'di', 'tsu', // 0xc3 'tsu', // 0xc4 'du', 'te', 'de', 'to', 'do', 'na', 'ni', 'nu', 'ne', 'no', 'ha', 'ba', 'pa', 'hi', 'bi', 'pi', 'hu', 'bu', 'pu', 'he', 'be', 'pe', 'ho', 'bo', 'po', 'ma', 'mi', 'mu', 'me', 'mo', 'ya', 'ya', 'yu', 'yu', 'yo', 'yo', 'ra', 'ri', 'ru', 're', 'ro', 'wa', 'wa', 'wi', 'we', 'wo', 'n', 'vu', 'ka', 'ke', 'va', 'vi', 've', 'vo', '', '', '"', '"', ]; PK,ZD'',portable-ascii/src/voku/helper/data/x06c.phpnuW+A ', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]']; PK,Z<<,portable-ascii/src/voku/helper/data/x07f.phpnuW+A [ '=' => ' gelijk ', '%' => ' procent ', '∑' => ' som ', '∆' => ' delta ', '∞' => ' oneindig ', '♥' => ' love ', '&' => ' en ', '+' => ' plus ', ], // Italian 'it' => [ '=' => ' uguale ', '%' => ' percent ', '∑' => ' somma ', '∆' => ' delta ', '∞' => ' infinito ', '♥' => ' amore ', '&' => ' e ', '+' => ' piu ', ], // Macedonian 'mk' => [ '=' => ' ednakva ', '%' => ' procenti ', '∑' => ' zbir ', '∆' => ' delta ', '∞' => ' beskonecnost ', '♥' => ' loveubov ', '&' => ' i ', '+' => ' plus ', ], // Portuguese (Brazil) 'pt' => [ '=' => ' igual ', '%' => ' por cento ', '∑' => ' soma ', '∆' => ' delta ', '∞' => ' infinito ', '♥' => ' amor ', '&' => ' e ', '+' => ' mais ', ], // Greek(lish) (Elláda) 'el__greeklish' => [ '=' => ' isos ', '%' => ' tois ekato ', '∑' => ' athroisma ', '∆' => ' delta ', '∞' => ' apeiro ', '♥' => ' agape ', '&' => ' kai ', '+' => ' syn ', ], // Greek (Elláda) 'el' => [ '=' => ' isos ', '%' => ' tois ekato ', '∑' => ' athroisma ', '∆' => ' delta ', '∞' => ' apeiro ', '♥' => ' agape ', '&' => ' kai ', '+' => ' syn ', ], // Hindi 'hi' => [ '=' => ' samana ', '%' => ' paratisata ', '∑' => ' yoga ', '∆' => ' dalata ', '∞' => ' anata ', '♥' => ' payara ', '&' => ' aura ', '+' => ' palasa ', ], // Armenian 'hy' => [ '=' => ' havasar ', '%' => ' tvokvos ', '∑' => ' gvoumar ', '∆' => ' delta ', '∞' => ' ansahmanvouthyvoun ', '♥' => ' ser ', '&' => ' ev ', '+' => ' gvoumarats ', ], // Swedish 'sv' => [ '=' => ' lika ', '%' => ' procent ', '∑' => ' summa ', '∆' => ' delta ', '∞' => ' oandlighet ', '♥' => ' alskar ', '&' => ' och ', '+' => ' plus ', ], // Turkmen 'tk' => [ '=' => ' den ', '%' => ' yuzde ', '∑' => ' jem ', '∆' => ' delta ', '∞' => ' mudimilik ', '♥' => ' soygi ', '&' => ' we ', '+' => ' yzy ', ], // Turkish 'tr' => [ '=' => ' esit ', '%' => ' yuzde ', '∑' => ' Toplam ', '∆' => ' delta ', '∞' => ' sonsuzluk ', '♥' => ' ask ', '&' => ' ve ', '+' => ' arti ', ], // Bulgarian 'bg' => [ '=' => ' raven ', '%' => ' na sto ', '∑' => ' suma ', '∆' => ' delta ', '∞' => ' bezkrajnost ', '♥' => ' obicam ', '&' => ' i ', '+' => ' plus ', ], // Hungarian 'hu' => [ '=' => ' Egyenlo ', '%' => ' Szazalek ', '∑' => ' osszeg ', '∆' => ' delta ', '∞' => ' vegtelenitett ', '♥' => ' love ', '&' => ' Es ', '+' => ' Plusz ', ], // Myanmar (Burmese) 'my' => [ '=' => ' ttn:ttnnym? ', '%' => ' raakhngnn:k ', '∑' => ' ld ', '∆' => ' m?cwk?n:pe? ', '∞' => ' ach:m ', '♥' => ' mettttaa ', '&' => ' n ', '+' => ' ape?ng: ', ], // Croatian (Hrvatska) 'hr' => [ '=' => ' Jednaki ', '%' => ' Posto ', '∑' => ' zbroj ', '∆' => ' Delta ', '∞' => ' beskonacno ', '♥' => ' ljubav ', '&' => ' I ', '+' => ' Plus ', ], // Finnish 'fi' => [ '=' => ' Sama ', '%' => ' Prosenttia ', '∑' => ' sum ', '∆' => ' delta ', '∞' => ' aareton ', '♥' => ' rakkautta ', '&' => ' Ja ', '+' => ' Plus ', ], // Georgian (Kartvelian) 'ka' => [ '=' => ' tanasts\'ori ', '%' => ' p\'rotsent\'i ', '∑' => ' tankha ', '∆' => ' delt\'a ', '∞' => ' usasrulo ', '♥' => ' siq\'varuli ', '&' => ' da ', '+' => ' p\'lus ', ], // Russian 'ru' => [ '=' => ' ravnyj ', '%' => ' procent ', '∑' => ' summa ', '∆' => ' del\'ta ', '∞' => ' beskonecnost\' ', '♥' => ' lublu ', '&' => ' i ', '+' => ' plus ', ], // Russian - GOST 7.79-2000(B) 'ru__gost_2000_b' => [ '=' => ' ravnyj ', '%' => ' procent ', '∑' => ' summa ', '∆' => ' del\'ta ', '∞' => ' beskonecnost\' ', '♥' => ' lublu ', '&' => ' i ', '+' => ' plus ', ], // Russian - Passport (2013), ICAO 'ru__passport_2013' => [ '=' => ' ravnyj ', '%' => ' procent ', '∑' => ' summa ', '∆' => ' del\'ta ', '∞' => ' beskonecnost\' ', '♥' => ' lublu ', '&' => ' i ', '+' => ' plus ', ], // Ukrainian 'uk' => [ '=' => ' rivnij ', '%' => ' vidsotkiv ', '∑' => ' suma ', '∆' => ' del\'ta ', '∞' => ' neskincennist\' ', '♥' => ' lubov ', '&' => ' i ', '+' => ' plus ', ], // Kazakh 'kk' => [ '=' => ' ten\' ', '%' => ' Pajyzdar ', '∑' => ' zalpy ', '∆' => ' ajyrmasylyk, ', '∞' => ' seksiz ', '♥' => ' mahabbat ', '&' => ' z@ne ', '+' => ' plus ', ], // Czech 'cs' => [ '=' => ' rovnat se ', '%' => ' procento ', '∑' => ' soucet ', '∆' => ' delta ', '∞' => ' nekonecno ', '♥' => ' laska ', '&' => ' a ', '+' => ' plus ', ], // Danish 'da' => [ '=' => ' Lige ', '%' => ' Prozent ', '∑' => ' sum ', '∆' => ' delta ', '∞' => ' uendelig ', '♥' => ' kaerlighed ', '&' => ' Og ', '+' => ' Plus ', ], // Polish 'pl' => [ '=' => ' rowny ', '%' => ' procent ', '∑' => ' suma ', '∆' => ' delta ', '∞' => ' nieskonczonosc ', '♥' => ' milosc ', '&' => ' i ', '+' => ' plus ', ], // Romanian 'ro' => [ '=' => ' egal ', '%' => ' la suta ', '∑' => ' suma ', '∆' => ' delta ', '∞' => ' infinit ', '♥' => ' dragoste ', '&' => ' si ', '+' => ' la care se adauga ', ], // Esperanto 'eo' => [ '=' => ' Egalaj ', '%' => ' Procento ', '∑' => ' sumo ', '∆' => ' delto ', '∞' => ' senfina ', '♥' => ' amo ', '&' => ' Kaj ', '+' => ' Pli ', ], // Estonian 'et' => [ '=' => ' Vordsed ', '%' => ' Protsenti ', '∑' => ' summa ', '∆' => ' o ', '∞' => ' loputut ', '♥' => ' armastus ', '&' => ' Ja ', '+' => ' Pluss ', ], // Latvian 'lv' => [ '=' => ' vienads ', '%' => ' procents ', '∑' => ' summa ', '∆' => ' delta ', '∞' => ' bezgaliba ', '♥' => ' milestiba ', '&' => ' un ', '+' => ' pluss ', ], // Lithuanian 'lt' => [ '=' => ' lygus ', '%' => ' procentu ', '∑' => ' suma ', '∆' => ' delta ', '∞' => ' begalybe ', '♥' => ' meile ', '&' => ' ir ', '+' => ' plius ', ], // Norwegian 'no' => [ '=' => ' Lik ', '%' => ' Prosent ', '∑' => ' sum ', '∆' => ' delta ', '∞' => ' uendelig ', '♥' => ' kjaerlighet ', '&' => ' Og ', '+' => ' Pluss ', ], // Vietnamese 'vi' => [ '=' => ' cong bang ', '%' => ' phan tram ', '∑' => ' tong so ', '∆' => ' dong bang ', '∞' => ' vo cuc ', '♥' => ' Yeu ', '&' => ' va ', '+' => ' them ', ], // Arabic 'ar' => [ '=' => ' mtsawy ', '%' => ' nsbh mywyh ', '∑' => ' mjmw\' ', '∆' => ' dlta ', '∞' => ' ma la nhayt ', '♥' => ' hb ', '&' => ' w ', '+' => ' zayd ', ], // Persian (Farsi) 'fa' => [ '=' => ' brabr ', '%' => ' dr sd ', '∑' => ' mjmw\' ', '∆' => ' dlta ', '∞' => ' by nhayt ', '♥' => ' \'shq ', '&' => ' w ', '+' => ' bh \'lawh ', ], // Serbian 'sr' => [ '=' => ' jednak ', '%' => ' procenat ', '∑' => ' zbir ', '∆' => ' delta ', '∞' => ' beskraj ', '♥' => ' lubav ', '&' => ' i ', '+' => ' vise ', ], // Serbian - Cyrillic 'sr__cyr' => [ '=' => ' jednak ', '%' => ' procenat ', '∑' => ' zbir ', '∆' => ' delta ', '∞' => ' beskraj ', '♥' => ' lubav ', '&' => ' i ', '+' => ' vise ', ], // Serbian - Latin 'sr__lat' => [ '=' => ' jednak ', '%' => ' procenat ', '∑' => ' zbir ', '∆' => ' delta ', '∞' => ' beskraj ', '♥' => ' lubav ', '&' => ' i ', '+' => ' vise ', ], // Azerbaijani 'az' => [ '=' => ' b@rab@r ', '%' => ' faiz ', '∑' => ' m@bl@g ', '∆' => ' delta ', '∞' => ' sonsuzluq ', '♥' => ' sevgi ', '&' => ' v@ ', '+' => ' plus ', ], // Slovak 'sk' => [ '=' => ' rovny ', '%' => ' percento ', '∑' => ' sucet ', '∆' => ' delta ', '∞' => ' infinity ', '♥' => ' milovat ', '&' => ' a ', '+' => ' viac ', ], // French 'fr' => [ '=' => ' Egal ', '%' => ' Pourcentage ', '∑' => ' somme ', '∆' => ' delta ', '∞' => ' infini ', '♥' => ' amour ', '&' => ' Et ', '+' => ' Plus ', ], // Austrian (French) 'fr_at' => [ '=' => ' Egal ', '%' => ' Pourcentage ', '∑' => ' somme ', '∆' => ' delta ', '∞' => ' infini ', '♥' => ' amour ', '&' => ' Et ', '+' => ' Plus ', ], // Switzerland (French) 'fr_ch' => [ '=' => ' Egal ', '%' => ' Pourcentage ', '∑' => ' somme ', '∆' => ' delta ', '∞' => ' infini ', '♥' => ' amour ', '&' => ' Et ', '+' => ' Plus ', ], // German 'de' => [ '=' => ' gleich ', '%' => ' Prozent ', '∑' => ' gesamt ', '∆' => ' Unterschied ', '∞' => ' undendlich ', '♥' => ' liebe ', '&' => ' und ', '+' => ' plus ', ], // Austrian (German) 'de_at' => [ '=' => ' gleich ', '%' => ' Prozent ', '∑' => ' gesamt ', '∆' => ' Unterschied ', '∞' => ' undendlich ', '♥' => ' liebe ', '&' => ' und ', '+' => ' plus ', ], // Switzerland (German) 'de_ch' => [ '=' => ' gleich ', '%' => ' Prozent ', '∑' => ' gesamt ', '∆' => ' Unterschied ', '∞' => ' undendlich ', '♥' => ' liebe ', '&' => ' und ', '+' => ' plus ', ], // Bengali (Bangla) 'bn' => [ '=' => ' Saman ', '%' => ' Satakora ', '∑' => ' Samasti ', '∆' => ' Badhip ', '∞' => ' Ananta ', '♥' => ' Valobasa ', '&' => ' Abong ', '+' => ' Songzojon ', ], // English 'en' => [ '=' => ' equal ', '%' => ' percent ', '∑' => ' sum ', '∆' => ' delta ', '∞' => ' infinity ', '♥' => ' love ', '&' => ' and ', '+' => ' plus ', ], // Currency // // url: https://en.wikipedia.org/wiki/Currency_symbol 'currency' => [ '€' => ' Euro ', '$' => ' Dollar ', '₢' => ' cruzeiro ', '₣' => ' French franc ', '£' => ' pound ', '₤' => ' lira ', // Italian '₶' => ' livre tournois ', 'ℳ' => ' mark ', '₥' => ' mill ', '₦' => ' naira ', '₧' => ' peseta ', '₨' => ' rupee ', 'රු' => ' rupee ', // Sri Lankan 'ரூ' => ' rupee ', // Sri Lankan '௹' => ' rupee ', // Tamil 'रू' => ' rupee ', // Nepalese '₹' => ' rupee ', // Indian '૱' => ' rupee ', // Gujarat '₩' => ' won ', '₪' => ' new shequel ', '₸' => ' tenge ', '₫' => ' dong ', '֏' => ' dram ', '₭' => ' kip ', '₺' => ' lira ', // Turkish '₼' => ' manat ', '₮' => ' tugrik ', '₯' => ' drachma ', '₰' => ' pfennig ', '₷' => ' spesmilo ', '₱' => ' peso ', // Philippine '﷼‎' => ' riyal ', '₲' => ' guarani ', '₾' => ' lari ', '₳' => ' austral ', '₴' => ' hryvnia ', '₽' => ' ruble ', '₵' => ' cedi ', '₡' => ' colon ', '¢' => ' cent ', '¥' => ' yen ', '円' => ' yen ', '৳' => ' taka ', '元' => ' yuan ', '﷼' => ' riyal ', '៛' => ' riel ', '₠' => ' European Currency ', '¤' => ' currency ', '฿' => ' baht ', '؋' => ' afghani ', ], // Temperature // // url: https://en.wikipedia.org/wiki/Conversion_of_units_of_temperature 'temperature' => [ '°De' => ' Delisle ', '°Re' => ' Reaumur ', // Réaumur '°Ro' => ' Romer ', // Rømer '°R' => ' Rankine ', '°C' => ' Celsius ', '°F' => ' Fahrenheit ', '°N' => ' Newton ', ], 'latin_symbols' => [ '=' => '=', '%' => '%', '∑' => '∑', '∆' => '∆', '∞' => '∞', '♥' => '♥', '&' => '&', '+' => '+', // --- '©' => ' (c) ', '®' => ' (r) ', '@' => ' (at) ', '№' => ' No. ', '℞' => ' Rx ', '[' => '[', '\' => '\\', ']' => ']', '^' => '^', '_' => '_', '`' => '`', '‐' => '-', '‑' => '-', '‒' => '-', '–' => '-', '−' => '-', '—' => '-', '―' => '-', '﹘' => '-', '│' => '|', '∖' => '\\', '∕' => '/', '⁄' => '/', '←' => '<-', '→' => '->', '↑' => '|', '↓' => '|', '⁅' => '[', '⁆' => ']', '⁎' => '*', '、' => ',', '。' => '.', '〈' => '<', '〉' => '>', '《' => '<<', '》' => '>>', '〔' => '[', '〕' => ']', '〘' => '[', '〙' => ']', '〚' => '[', '〛' => ']', '﹝' => '[', '﹞' => ']', '︹' => '[', '︺' => ']', '﹇' => '[', '﹈' => ']', '︐' => ',', '︑' => ',', '︒' => '.', '︓' => ':', '︔' => ';', '︕' => '!', '︖' => '?', '︙' => '...', '︰' => '..', '︵' => '(', '︶' => ')', '﹙' => '(', '﹚' => ')', '︷' => '{', '︸' => '}', '﹛' => '{', '﹜' => '}', '︽' => '<<', '︾' => '>>', '︿' => '<', '﹀' => '>', '×' => '*', '÷' => '/', '≪' => '<<', '≫' => '>>', '⦅' => '((', '⦆' => '))', '〇' => '0', '′' => '\'', '〝' => '"', '〞' => '"', '«' => '<<', '»' => '>>', '‘' => "'", '’' => "'", '‚' => ',', '‛' => "'", '“' => '"', '”' => '"', '„' => '"', '‟' => '"', '‹' => '<', '›' => '>', '․' => '.', '‥' => '..', '…' => '...', '″' => '"', '‴' => '\'\'\'', '‶' => '``', '‷' => '```', '‼' => '!!', '⁇' => '??', '⁈' => '?!', '⁉' => '!?', '⁗' => '````', '⩴' => '::=', '⩵' => '==', '⩶' => '===', '﹔' => ';', '﹕' => ':', '﹖' => '?', '﹗' => '!', '﹍' => '_', '﹎' => '_', '﹏' => '_', '﹐' => ',', '﹑' => ',', '﹒' => '.', '﹟' => '#', '﹠' => '&', '﹡' => '*', '﹢' => '+', '﹣' => '-', '﹤' => '<', '﹥' => '>', '﹦' => '=', '﹨' => '\\', '﹩' => '$', '﹪' => '%', '﹫' => '@', '!' => '!', '"' => '"', '#' => '#', '$' => '$', '%' => '%', '&' => '&', ''' => '\'', '(' => '(', ')' => ')', '*' => '*', '+' => '+', ',' => ',', '-' => '-', '.' => '.', '/' => '/', ':' => ':', ';' => ';', '<' => '<', '=' => '=', '>' => '>', '?' => '?', '@' => '@', '{' => '{', '|' => '|', '}' => '}', '~' => '~', '⦅' => '((', '⦆' => '))', '¬' => '!', ' ̄' => '-', '¦' => '|', '■' => '#', ], ]; PK,Z,portable-ascii/src/voku/helper/data/x0ad.phpnuW+A', '>', '>', '>', '>', '>', 'V', 'V', 'V', 'V', '<', '<', '<', '<', '<', '<', '*', '*', '*', '*', '*', '*', '*', '*', '*', '*', '*', '*', '*', '*', '*', '*', '*', '*', '*', '*', '*', '*', '*', '*', '*', '*', '*', '*', '*', '*', '*', '*', '*', '#', '#', '#', '#', '#', '^', '^', '^', 'O', '#', '#', '#', '#', 'O', 'O', 'O', 'O', '/', '\\\\', '\\\\', '#', '#', '#', '#', '/']; PK,ZJص,portable-ascii/src/voku/helper/data/x0b0.phpnuW+A{877,portable-ascii/src/voku/helper/data/x001.phpnuW+A', '%', '[?]', '[?]', '>', '=', '[?]', '/', '-', '~', '\\', '/', '~', '~', '|-', '-|', '[?]', '[?]', '[?]', '[?]', '<=', '=>', '((', '))', '[?]', '[?]', '::', '[?]', '?', '\'', 'o', '.', ',', '.', ',', ';', '[?]', '[?]', '[?]', '[?]', '----', '------', 'x', '|', '[?]', '[?]', '=', ',', '"', '`--', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?] ', '[?] ', '[?] ', '[?] ', '[?] ', '[?] ', '[?] ', '[?] ', '[?] ', '[?] ', '[?] ', '[?] ', '[?] ', '[?] ', '[?] ', '[?] ', '[?] ', '[?] ', '[?] ', '[?] ', '[?] ', '[?] ', '[?] ', '[?] ', '[?] ', '[?] ', '[?]', '[?] ', '[?] ', '[?] ', '[?] ', '[?] ', '[?] ', '[?] ', '[?] ', '[?] ', '[?] ', '[?] ', '[?] ', '[?] ', '[?] ', '[?] ', '[?] ', '[?] ', '[?] ', '[?] ', '[?] ', '[?] ', '[?] ', '[?] ', '[?] ', '[?] ', '[?] ', '[?] ', '[?] ', '[?] ', '[?] ', '[?] ', '[?] ', '[?] ', '[?] ', '[?] ', '[?] ', '[?] ', '[?] ', '[?] ', '[?] ', '[?] ', '[?] ', '[?] ', '[?] ', '[?] ', '[?] ', '[?] ', '[?] ', '[?] ', '[?] ', '[?] ', '[?] ', '[?] ', '[?] ', '[?] ', '[?] ', '[?] ', '[?] ', '[?] ', '[?] ', '[?] ', '[?] ', '[?] ', '[?] ', '[?] ', '[?] ', '[?] ', '[?] ', '[?] ', '[?] ', '[?] ', '[?] ', '[?] ', '[?] ', '[?] ', '[?] ', '[?] ', '[?] ', '[?] ', '[?] ', '[?] ', '[?] ', '[?] ', '[?] ', '[?] ', '[?] ', '[?] ', '[?] ', '[?] ', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]']; PK,ZNG,portable-ascii/src/voku/helper/data/x067.phpnuW+A', 'n', 't', 'q', ',', '*', '5', '<', '-', 'u', '8', 'v', '.', '%', '[', '$', '+', 'x', '!', '&', ';', ':', '4', '\\', '0', 'z', '7', '(', '_', '?', 'w', ']', '#', 'y', ')', '=', '[d7]', '[d17]', '[d27]', '[d127]', '[d37]', '[d137]', '[d237]', '[d1237]', '[d47]', '[d147]', '[d247]', '[d1247]', '[d347]', '[d1347]', '[d2347]', '[d12347]', '[d57]', '[d157]', '[d257]', '[d1257]', '[d357]', '[d1357]', '[d2357]', '[d12357]', '[d457]', '[d1457]', '[d2457]', '[d12457]', '[d3457]', '[d13457]', '[d23457]', '[d123457]', '[d67]', '[d167]', '[d267]', '[d1267]', '[d367]', '[d1367]', '[d2367]', '[d12367]', '[d467]', '[d1467]', '[d2467]', '[d12467]', '[d3467]', '[d13467]', '[d23467]', '[d123467]', '[d567]', '[d1567]', '[d2567]', '[d12567]', '[d3567]', '[d13567]', '[d23567]', '[d123567]', '[d4567]', '[d14567]', '[d24567]', '[d124567]', '[d34567]', '[d134567]', '[d234567]', '[d1234567]', '[d8]', '[d18]', '[d28]', '[d128]', '[d38]', '[d138]', '[d238]', '[d1238]', '[d48]', '[d148]', '[d248]', '[d1248]', '[d348]', '[d1348]', '[d2348]', '[d12348]', '[d58]', '[d158]', '[d258]', '[d1258]', '[d358]', '[d1358]', '[d2358]', '[d12358]', '[d458]', '[d1458]', '[d2458]', '[d12458]', '[d3458]', '[d13458]', '[d23458]', '[d123458]', '[d68]', '[d168]', '[d268]', '[d1268]', '[d368]', '[d1368]', '[d2368]', '[d12368]', '[d468]', '[d1468]', '[d2468]', '[d12468]', '[d3468]', '[d13468]', '[d23468]', '[d123468]', '[d568]', '[d1568]', '[d2568]', '[d12568]', '[d3568]', '[d13568]', '[d23568]', '[d123568]', '[d4568]', '[d14568]', '[d24568]', '[d124568]', '[d34568]', '[d134568]', '[d234568]', '[d1234568]', '[d78]', '[d178]', '[d278]', '[d1278]', '[d378]', '[d1378]', '[d2378]', '[d12378]', '[d478]', '[d1478]', '[d2478]', '[d12478]', '[d3478]', '[d13478]', '[d23478]', '[d123478]', '[d578]', '[d1578]', '[d2578]', '[d12578]', '[d3578]', '[d13578]', '[d23578]', '[d123578]', '[d4578]', '[d14578]', '[d24578]', '[d124578]', '[d34578]', '[d134578]', '[d234578]', '[d1234578]', '[d678]', '[d1678]', '[d2678]', '[d12678]', '[d3678]', '[d13678]', '[d23678]', '[d123678]', '[d4678]', '[d14678]', '[d24678]', '[d124678]', '[d34678]', '[d134678]', '[d234678]', '[d1234678]', '[d5678]', '[d15678]', '[d25678]', '[d125678]', '[d35678]', '[d135678]', '[d235678]', '[d1235678]', '[d45678]', '[d145678]', '[d245678]', '[d1245678]', '[d345678]', '[d1345678]', '[d2345678]', '[d12345678]']; PK,Z>+ll,portable-ascii/src/voku/helper/data/x017.phpnuW+A> ', '<', '> ', '[', '] ', '{', '}', '[?]', '[?]', '[?]', '[?]', '', '', '', '', '', '', '', ',', ',', '.', '', ';', ':', '?', '!', '-', '(', ')', '{', '}', '{', '}', '#', '&', '*', '+', '-', '<', '>', '=', '', '\\', '$', '%', '@', '[?]', '[?]', '[?]', '[?]', '', '', '', '[?]', '', '[?]', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '[?]', '[?]', '']; PK,Zl'',portable-ascii/src/voku/helper/data/x083.phpnuW+A 'w', 'x', 'y', 'z', 4 => 'A', 'B', 'C', 'D', 'E', 'F', 'G', 'H', 'I', 'J', 'K', 'L', 'M', 'N', 'O', 'P', 'Q', 'R', 'S', 'T', 'U', 'V', 'W', 'X', 'Y', 'Z', 30 => 'a', 'b', 'c', 'd', 'e', 'f', 'g', 'h', 'i', 'j', 'k', 'l', 'm', 'n', 'o', 'p', 'q', 'r', 's', 't', 'u', 'v', 'w', 'x', 'y', 'z', 56 => 'A', 'B', 'C', 'D', 'E', 'F', 'G', 'H', 'I', 'J', 'K', 'L', 'M', 'N', 'O', 'P', 'Q', 'R', 'S', 'T', 'U', 'V', 'W', 'X', 'Y', 'Z', 82 => 'a', 'b', 'c', 'd', 'e', 'f', 'g', 'h', 'i', 'j', 'k', 'l', 'm', 'n', 'o', 'p', 'q', 'r', 's', 't', 'u', 'v', 'w', 'x', 'y', 'z', 108 => 'A', 'B', 'C', 'D', 'E', 'F', 'G', 'H', 'I', 'J', 'K', 'L', 'M', 'N', 'O', 'P', 'Q', 'R', 'S', 'T', 'U', 'V', 'W', 'X', 'Y', 'Z', 134 => 'a', 'b', 'c', 'd', 'e', 'f', 'g', 'h', 'i', 'j', 'k', 'l', 'm', 'n', 'o', 'p', 'q', 'r', 's', 't', 'u', 'v', 'w', 'x', 'y', 'z', 160 => 'A', 'B', 'C', 'D', 'E', 'F', 'G', 'H', 'I', 'J', 'K', 'L', 'M', 'N', 'O', 'P', 'Q', 'R', 'S', 'T', 'U', 'V', 'W', 'X', 'Y', 'Z', 186 => 'a', 'b', 'c', 'd', 'e', 'f', 'g', 'h', 'i', 'j', 'k', 'l', 'm', 'n', 'o', 'p', 'q', 'r', 's', 't', 'u', 'v', 'w', 'x', 'y', 'z', 212 => 'A', 'B', 'C', 'D', 'E', 'F', 'G', 'H', 'I', 'J', 'K', 'L', 'M', 'N', 'O', 'P', 'Q', 'R', 'S', 'T', 'U', 'V', 'W', 'X', 'Y', 'Z', 238 => 'a', 'b', 'c', 'd', 'e', 'f', 'g', 'h', 'i', 'j', 'k', 'l', 'm', 'n', 'o', 'p', 'q', 'r', 's', 't', 'u', 'v', 'w', 'x', 'y', 'z', ]; PK,Z2xlvv,portable-ascii/src/voku/helper/data/x0c9.phpnuW+AJJ,portable-ascii/src/voku/helper/data/x058.phpnuW+A [ 'Á' => 'A', 'á' => 'a', 'Ä' => 'A', 'ä' => 'a', 'À' => 'A', 'à' => 'a', 'Â' => 'A', 'â' => 'a', 'É' => 'E', 'é' => 'e', 'Ë' => 'E', 'ë' => 'e', 'È' => 'E', 'è' => 'e', 'Ê' => 'E', 'ê' => 'e', 'Í' => 'I', 'í' => 'i', 'Ï' => 'I', 'ï' => 'i', 'Ì' => 'I', 'ì' => 'i', 'Î' => 'I', 'î' => 'i', 'Ó' => 'O', 'ó' => 'o', 'Ö' => 'O', 'ö' => 'o', 'Ò' => 'O', 'ò' => 'o', 'Ô' => 'O', 'ô' => 'o', 'Ú' => 'U', 'ú' => 'u', 'Ü' => 'U', 'ü' => 'u', 'Ù' => 'U', 'ù' => 'u', 'Û' => 'U', 'û' => 'u', 'Ý' => 'Y', 'ý' => 'y', 'Ÿ' => 'Y', ], // Italian 'it' => [ 'à' => 'a', 'À' => 'A', 'é' => 'e', 'É' => 'E', 'è' => 'e', 'È' => 'E', 'ì' => 'i', 'Ì' => 'I', 'Ò' => 'O', 'ò' => 'o', 'ù' => 'u', 'Ù' => 'U', ], // Macedonian 'mk' => [ 'А' => 'A', 'Б' => 'B', 'В' => 'V', 'Г' => 'G', 'Д' => 'D', 'Ѓ' => 'Gj', 'Е' => 'E', 'Ж' => 'Zh', 'З' => 'Z', 'Ѕ' => 'Dz', 'И' => 'I', 'Ј' => 'J', 'К' => 'K', 'Л' => 'L', 'Љ' => 'Lj', 'М' => 'M', 'Н' => 'N', 'Њ' => 'Nj', 'О' => 'O', 'П' => 'P', 'Р' => 'R', 'С' => 'S', 'Т' => 'T', 'Ќ' => 'Kj', 'У' => 'U', 'Ф' => 'F', 'Х' => 'H', 'Ц' => 'C', 'Ч' => 'Ch', 'Џ' => 'Dj', 'Ш' => 'Sh', 'а' => 'a', 'б' => 'b', 'в' => 'v', 'г' => 'g', 'д' => 'd', 'ѓ' => 'gj', 'е' => 'e', 'ж' => 'zh', 'з' => 'z', 'ѕ' => 'dz', 'и' => 'i', 'ј' => 'j', 'к' => 'k', 'л' => 'l', 'љ' => 'lj', 'м' => 'm', 'н' => 'n', 'њ' => 'nj', 'о' => 'o', 'п' => 'p', 'р' => 'r', 'с' => 's', 'т' => 't', 'ќ' => 'kj', 'у' => 'u', 'ф' => 'f', 'х' => 'h', 'ц' => 'c', 'ч' => 'ch', 'џ' => 'dj', 'ш' => 'sh', ], // Portuguese (Brazil) 'pt' => [ 'æ' => 'ae', 'ǽ' => 'ae', 'À' => 'A', 'Á' => 'A', 'Â' => 'A', 'Ã' => 'A', 'Å' => 'AA', 'Ǻ' => 'A', 'Ă' => 'A', 'Ǎ' => 'A', 'Æ' => 'AE', 'Ǽ' => 'AE', 'à' => 'a', 'á' => 'a', 'â' => 'a', 'ã' => 'a', 'å' => 'aa', 'ǻ' => 'a', 'ă' => 'a', 'ǎ' => 'a', 'ª' => 'a', 'Ĉ' => 'C', 'Ċ' => 'C', 'Ç' => 'C', 'ç' => 'c', 'ĉ' => 'c', 'ċ' => 'c', 'Ð' => 'Dj', 'Đ' => 'D', 'ð' => 'dj', 'đ' => 'd', 'È' => 'E', 'É' => 'E', 'Ê' => 'E', 'Ë' => 'E', 'Ĕ' => 'E', 'Ė' => 'E', 'è' => 'e', 'é' => 'e', 'ê' => 'e', 'ë' => 'e', 'ĕ' => 'e', 'ė' => 'e', 'ƒ' => 'f', 'Ĝ' => 'G', 'Ġ' => 'G', 'ĝ' => 'g', 'ġ' => 'g', 'Ĥ' => 'H', 'Ħ' => 'H', 'ĥ' => 'h', 'ħ' => 'h', 'Ì' => 'I', 'Í' => 'I', 'Î' => 'I', 'Ï' => 'I', 'Ĩ' => 'I', 'Ĭ' => 'I', 'Ǐ' => 'I', 'Į' => 'I', 'IJ' => 'IJ', 'ì' => 'i', 'í' => 'i', 'î' => 'i', 'ï' => 'i', 'ĩ' => 'i', 'ĭ' => 'i', 'ǐ' => 'i', 'į' => 'i', 'ij' => 'ij', 'Ĵ' => 'J', 'ĵ' => 'j', 'Ĺ' => 'L', 'Ľ' => 'L', 'Ŀ' => 'L', 'ĺ' => 'l', 'ľ' => 'l', 'ŀ' => 'l', 'Ñ' => 'N', 'ñ' => 'n', 'ʼn' => 'n', 'Ò' => 'O', 'Ó' => 'O', 'Ô' => 'O', 'Õ' => 'O', 'Ō' => 'O', 'Ŏ' => 'O', 'Ǒ' => 'O', 'Ő' => 'O', 'Ơ' => 'O', 'Ø' => 'OE', 'Ǿ' => 'O', 'Œ' => 'OE', 'ò' => 'o', 'ó' => 'o', 'ô' => 'o', 'õ' => 'o', 'ō' => 'o', 'ŏ' => 'o', 'ǒ' => 'o', 'ő' => 'o', 'ơ' => 'o', 'ø' => 'oe', 'ǿ' => 'o', 'º' => 'o', 'œ' => 'oe', 'Ŕ' => 'R', 'Ŗ' => 'R', 'ŕ' => 'r', 'ŗ' => 'r', 'Ŝ' => 'S', 'Ș' => 'S', 'ŝ' => 's', 'ș' => 's', 'ſ' => 's', 'Ţ' => 'T', 'Ț' => 'T', 'Ŧ' => 'T', 'Þ' => 'TH', 'ţ' => 't', 'ț' => 't', 'ŧ' => 't', 'þ' => 'th', 'Ù' => 'U', 'Ú' => 'U', 'Û' => 'U', 'Ü' => 'U', 'Ũ' => 'U', 'Ŭ' => 'U', 'Ű' => 'U', 'Ų' => 'U', 'Ư' => 'U', 'Ǔ' => 'U', 'Ǖ' => 'U', 'Ǘ' => 'U', 'Ǚ' => 'U', 'Ǜ' => 'U', 'ù' => 'u', 'ú' => 'u', 'û' => 'u', 'ü' => 'u', 'ũ' => 'u', 'ŭ' => 'u', 'ű' => 'u', 'ų' => 'u', 'ư' => 'u', 'ǔ' => 'u', 'ǖ' => 'u', 'ǘ' => 'u', 'ǚ' => 'u', 'ǜ' => 'u', 'Ŵ' => 'W', 'ŵ' => 'w', 'Ý' => 'Y', 'Ÿ' => 'Y', 'Ŷ' => 'Y', 'ý' => 'y', 'ÿ' => 'y', 'ŷ' => 'y', ], // Greek(lish) (Elláda) 'el__greeklish' => [ 'ΑΥ' => 'AU', 'ΑΎ' => 'AU', 'Αυ' => 'Au', 'Αύ' => 'Au', 'ΕΊ' => 'EI', 'ΕΙ' => 'EI', 'Ει' => 'EI', 'ΕΥ' => 'EU', 'ΕΎ' => 'EU', 'Εί' => 'Ei', 'Ευ' => 'Eu', 'Εύ' => 'Eu', 'ΟΙ' => 'OI', 'ΟΊ' => 'OI', 'ΟΥ' => 'OU', 'ΟΎ' => 'OU', 'Οι' => 'Oi', 'Οί' => 'Oi', 'Ου' => 'Ou', 'Ού' => 'Ou', 'ΥΙ' => 'YI', 'ΎΙ' => 'YI', 'Υι' => 'Yi', 'Ύι' => 'Yi', 'ΥΊ' => 'Yi', 'Υί' => 'Yi', 'αυ' => 'au', 'αύ' => 'au', 'εί' => 'ei', 'ει' => 'ei', 'ευ' => 'eu', 'εύ' => 'eu', 'οι' => 'oi', 'οί' => 'oi', 'ου' => 'ou', 'ού' => 'ou', 'υι' => 'yi', 'ύι' => 'yi', 'υί' => 'yi', 'Α' => 'A', 'Ά' => 'A', 'Β' => 'B', 'Δ' => 'D', 'Ε' => 'E', 'Έ' => 'E', 'Φ' => 'F', 'Γ' => 'G', 'Η' => 'H', 'Ή' => 'H', 'Ι' => 'I', 'Ί' => 'I', 'Ϊ' => 'I', 'Κ' => 'K', 'Ξ' => 'Ks', 'Λ' => 'L', 'Μ' => 'M', 'Ν' => 'N', 'Π' => 'N', 'Ο' => 'O', 'Ό' => 'O', 'Ψ' => 'Ps', 'Ρ' => 'R', 'Σ' => 'S', 'Τ' => 'T', 'Θ' => 'Th', 'Ω' => 'W', 'Ώ' => 'W', 'Χ' => 'X', 'ϒ' => 'Y', 'Υ' => 'Y', 'Ύ' => 'Y', 'Ϋ' => 'Y', 'Ζ' => 'Z', 'α' => 'a', 'ά' => 'a', 'β' => 'b', 'δ' => 'd', 'ε' => 'e', 'έ' => 'e', 'φ' => 'f', 'γ' => 'g', 'η' => 'h', 'ή' => 'h', 'ι' => 'i', 'ί' => 'i', 'ϊ' => 'i', 'ΐ' => 'i', 'κ' => 'k', 'ξ' => 'ks', 'λ' => 'l', 'μ' => 'm', 'ν' => 'n', 'ο' => 'o', 'ό' => 'o', 'π' => 'p', 'ψ' => 'ps', 'ρ' => 'r', 'σ' => 's', 'ς' => 's', 'τ' => 't', 'ϑ' => 'th', 'θ' => 'th', 'ϐ' => 'v', 'ω' => 'w', 'ώ' => 'w', 'χ' => 'x', 'υ' => 'y', 'ύ' => 'y', 'ΰ' => 'y', 'ϋ' => 'y', 'ζ' => 'z', ], // Greek (Elláda) 'el' => [ 'ΑΥ' => 'AU', 'Αυ' => 'Au', 'ΟΥ' => 'U', 'Ου' => 'u', 'ΕΥ' => 'EF', 'Ευ' => 'Ef', 'ΕΙ' => 'I', 'Ει' => 'I', 'ΟΙ' => 'I', 'Οι' => 'I', 'ΥΙ' => 'I', 'Υι' => 'I', 'ΑΎ' => 'AU', 'Αύ' => 'Au', 'ΟΎ' => 'OU', 'Ού' => 'Ou', 'ΕΎ' => 'EU', 'Εύ' => 'Eu', 'ΕΊ' => 'I', 'Εί' => 'I', 'ΟΊ' => 'I', 'Οί' => 'I', 'ΎΙ' => 'I', 'Ύι' => 'I', 'ΥΊ' => 'I', 'Υί' => 'I', 'αυ' => 'au', 'ου' => 'u', 'ευ' => 'ef', 'ει' => 'i', 'οι' => 'i', 'υι' => 'i', 'αύ' => 'au', 'ού' => 'ou', 'εύ' => 'eu', 'εί' => 'i', 'οί' => 'i', 'ύι' => 'i', 'υί' => 'i', 'α' => 'a', 'β' => 'v', 'γ' => 'gh', 'δ' => 'd', 'ε' => 'e', 'ζ' => 'z', 'η' => 'i', 'θ' => 'th', 'ι' => 'i', 'κ' => 'k', 'λ' => 'l', 'μ' => 'm', 'ν' => 'n', 'ξ' => 'ks', 'ο' => 'o', 'π' => 'p', 'ρ' => 'r', 'σ' => 's', 'τ' => 't', 'υ' => 'i', 'φ' => 'f', 'χ' => 'kh', 'ψ' => 'ps', 'ω' => 'o', 'ά' => 'a', 'έ' => 'e', 'ί' => 'i', 'ό' => 'o', 'ϒ' => 'Y', 'ύ' => 'y', 'ή' => 'i', 'ώ' => 'w', 'ς' => 's', 'ϊ' => 'i', 'ΰ' => 'y', 'ϋ' => 'y', 'ΐ' => 'i', 'Α' => 'A', 'Β' => 'B', 'Γ' => 'G', 'Δ' => 'D', 'Ε' => 'E', 'Ζ' => 'Z', 'Η' => 'H', 'Θ' => 'Th', 'Ι' => 'I', 'Κ' => 'K', 'Λ' => 'L', 'Μ' => 'M', 'Ν' => 'N', 'Ξ' => 'Ks', 'Ο' => 'O', 'Π' => 'P', 'Ρ' => 'R', 'Σ' => 'S', 'Τ' => 'T', 'Υ' => 'Y', 'Φ' => 'F', 'Χ' => 'X', 'Ψ' => 'Ps', 'Ω' => 'O', 'Ά' => 'A', 'Έ' => 'E', 'Ί' => 'I', 'Ό' => 'O', 'Ύ' => 'Y', 'Ή' => 'I', 'Ώ' => 'W', 'Ϊ' => 'I', 'Ϋ' => 'Y', 'ϐ' => 'v', 'ϑ' => 'th', ], // Hindi 'hi' => [ 'अ' => 'a', 'आ' => 'aa', 'ए' => 'e', 'ई' => 'ii', 'ऍ' => 'ei', 'ऎ' => 'ae', 'ऐ' => 'ai', 'इ' => 'i', 'ओ' => 'o', 'ऑ' => 'oi', 'ऒ' => 'oii', 'ऊ' => 'uu', 'औ' => 'ou', 'उ' => 'u', 'ब' => 'B', 'भ' => 'Bha', 'च' => 'Ca', 'छ' => 'Chha', 'ड' => 'Da', 'ढ' => 'Dha', 'फ' => 'Fa', 'फ़' => 'Fi', 'ग' => 'Ga', 'घ' => 'Gha', 'ग़' => 'Ghi', 'ह' => 'Ha', 'ज' => 'Ja', 'झ' => 'Jha', 'क' => 'Ka', 'ख' => 'Kha', 'ख़' => 'Khi', 'ल' => 'L', 'ळ' => 'Li', 'ऌ' => 'Li', 'ऴ' => 'Lii', 'ॡ' => 'Lii', 'म' => 'Ma', 'न' => 'Na', 'ङ' => 'Na', 'ञ' => 'Nia', 'ण' => 'Nae', 'ऩ' => 'Ni', 'ॐ' => 'oms', 'प' => 'Pa', 'क़' => 'Qi', 'र' => 'Ra', 'ऋ' => 'Ri', 'ॠ' => 'Ri', 'ऱ' => 'Ri', 'स' => 'Sa', 'श' => 'Sha', 'ष' => 'Shha', 'ट' => 'Ta', 'त' => 'Ta', 'ठ' => 'Tha', 'द' => 'Tha', 'थ' => 'Tha', 'ध' => 'Thha', 'ड़' => 'ugDha', 'ढ़' => 'ugDhha', 'व' => 'Va', 'य' => 'Ya', 'य़' => 'Yi', 'ज़' => 'Za', ], // Armenian 'hy' => [ 'Ա' => 'A', 'Բ' => 'B', 'Գ' => 'G', 'Դ' => 'D', 'Ե' => 'E', 'Զ' => 'Z', 'Է' => 'E', 'Ը' => 'Y', 'Թ' => 'Th', 'Ժ' => 'Zh', 'Ի' => 'I', 'Լ' => 'L', 'Խ' => 'Kh', 'Ծ' => 'Ts', 'Կ' => 'K', 'Հ' => 'H', 'Ձ' => 'Dz', 'Ղ' => 'Gh', 'Ճ' => 'Tch', 'Մ' => 'M', 'Յ' => 'Y', 'Ն' => 'N', 'Շ' => 'Sh', 'Ո' => 'Vo', 'Չ' => 'Ch', 'Պ' => 'P', 'Ջ' => 'J', 'Ռ' => 'R', 'Ս' => 'S', 'Վ' => 'V', 'Տ' => 'T', 'Ր' => 'R', 'Ց' => 'C', 'Ւ' => 'u', 'Փ' => 'Ph', 'Ք' => 'Q', 'և' => 'ev', 'Օ' => 'O', 'Ֆ' => 'F', 'ա' => 'a', 'բ' => 'b', 'գ' => 'g', 'դ' => 'd', 'ե' => 'e', 'զ' => 'z', 'է' => 'e', 'ը' => 'y', 'թ' => 'th', 'ժ' => 'zh', 'ի' => 'i', 'լ' => 'l', 'խ' => 'kh', 'ծ' => 'ts', 'կ' => 'k', 'հ' => 'h', 'ձ' => 'dz', 'ղ' => 'gh', 'ճ' => 'tch', 'մ' => 'm', 'յ' => 'y', 'ն' => 'n', 'շ' => 'sh', 'ո' => 'vo', 'չ' => 'ch', 'պ' => 'p', 'ջ' => 'j', 'ռ' => 'r', 'ս' => 's', 'վ' => 'v', 'տ' => 't', 'ր' => 'r', 'ց' => 'c', 'ւ' => 'u', 'փ' => 'ph', 'ք' => 'q', 'օ' => 'o', 'ֆ' => 'f', ], // Swedish 'sv' => [ 'Ä' => 'A', 'ä' => 'a', 'Å' => 'A', 'å' => 'a', 'Ö' => 'O', 'ö' => 'o', ], // Turkmen 'tk' => [ 'Ç' => 'C', 'Ä' => 'A', 'Ž' => 'Z', 'Ň' => 'N', 'Ö' => 'O', 'Ş' => 'S', 'Ü' => 'U', 'Ý' => 'Y', 'ç' => 'c', 'ä' => 'a', 'ž' => 'z', 'ň' => 'n', 'ö' => 'o', 'ş' => 's', 'ü' => 'u', 'ý' => 'y', ], // Turkish 'tr' => [ 'ň' => 'n', 'Ň' => 'N', 'ş' => 's', 'Ş' => 'S', 'ı' => 'i', 'İ' => 'I', 'ç' => 'c', 'Ç' => 'C', 'ä' => 'a', 'Ä' => 'A', 'ü' => 'u', 'Ü' => 'U', 'ö' => 'o', 'Ö' => 'O', 'ğ' => 'g', 'Ğ' => 'G', 'ý' => 'y', 'Ý' => 'Y', 'ž' => 'z', 'Ž' => 'Z', ], // Bulgarian 'bg' => [ 'ьо' => 'yo', 'А' => 'A', 'Б' => 'B', 'В' => 'V', 'Г' => 'G', 'Д' => 'D', 'Е' => 'E', 'Ж' => 'Zh', 'З' => 'Z', 'И' => 'I', 'Й' => 'Y', 'К' => 'K', 'Л' => 'L', 'М' => 'M', 'Н' => 'N', 'О' => 'O', 'П' => 'P', 'Р' => 'R', 'С' => 'S', 'Т' => 'T', 'У' => 'U', 'Ф' => 'F', 'Х' => 'H', 'Ц' => 'C', 'Ч' => 'Ch', 'Ш' => 'Sh', 'Щ' => 'Sht', 'Ъ' => 'A', 'Ь' => '', 'Ю' => 'Yu', 'Я' => 'Ya', 'а' => 'a', 'б' => 'b', 'в' => 'v', 'г' => 'g', 'д' => 'd', 'е' => 'e', 'ж' => 'zh', 'з' => 'z', 'и' => 'i', 'й' => 'y', 'к' => 'k', 'л' => 'l', 'м' => 'm', 'н' => 'n', 'о' => 'o', 'п' => 'p', 'р' => 'r', 'с' => 's', 'т' => 't', 'у' => 'u', 'ф' => 'f', 'х' => 'h', 'ц' => 'c', 'ч' => 'ch', 'ш' => 'sh', 'щ' => 'sht', 'ъ' => 'a', 'ь' => '', 'ю' => 'yu', 'я' => 'ya', ], // Hungarian 'hu' => [ 'Á' => 'A', 'Ē' => 'E', 'É' => 'E', 'Í' => 'I', 'Ó' => 'O', 'Ö' => 'O', 'Ő' => 'O', 'Ú' => 'U', 'Ü' => 'U', 'Ű' => 'U', 'á' => 'a', 'ē' => 'e', 'é' => 'e', 'í' => 'i', 'ó' => 'o', 'ö' => 'o', 'ő' => 'o', 'ú' => 'u', 'ü' => 'u', 'ű' => 'u', ], // Myanmar (Burmese) 'my' => [ 'န်ုပ်' => 'nub', 'ောင်' => 'aung', 'ိုက်' => 'aik', 'ိုဒ်' => 'ok', 'ိုင်' => 'aing', 'ိုလ်' => 'ol', 'ေါင်' => 'aung', 'သြော' => 'aw', 'ောက်' => 'auk', 'ိတ်' => 'eik', 'ုတ်' => 'ok', 'ုန်' => 'on', 'ေတ်' => 'it', 'ုဒ်' => 'ait', 'ာန်' => 'an', 'ိန်' => 'ein', 'ွတ်' => 'ut', 'ေါ်' => 'aw', 'ွန်' => 'un', 'ိပ်' => 'eik', 'ုပ်' => 'ok', 'ွပ်' => 'ut', 'ိမ်' => 'ein', 'ုမ်' => 'on', 'ော်' => 'aw', 'ွမ်' => 'un', 'က်' => 'et', 'ေါ' => 'aw', 'ော' => 'aw', 'ျွ' => 'ywa', 'ြွ' => 'yw', 'ို' => 'o', 'ုံ' => 'on', 'တ်' => 'at', 'င်' => 'in', 'ည်' => 'i', 'ဒ်' => 'd', 'န်' => 'an', 'ပ်' => 'at', 'မ်' => 'an', 'စျ' => 'za', 'ယ်' => 'e', 'ဉ်' => 'in', 'စ်' => 'it', 'ိံ' => 'ein', 'ဲ' => 'e', 'း' => '', 'ာ' => 'a', 'ါ' => 'a', 'ေ' => 'e', 'ံ' => 'an', 'ိ' => 'i', 'ီ' => 'i', 'ု' => 'u', 'ူ' => 'u', '်' => 'at', '္' => '', '့' => '', 'က' => 'k', '၉' => '9', 'တ' => 't', 'ရ' => 'ya', 'ယ' => 'y', 'မ' => 'm', 'ဘ' => 'ba', 'ဗ' => 'b', 'ဖ' => 'pa', 'ပ' => 'p', 'န' => 'n', 'ဓ' => 'da', 'ဒ' => 'd', 'ထ' => 'ta', 'ဏ' => 'na', 'ဝ' => 'w', 'ဎ' => 'da', 'ဍ' => 'd', 'ဌ' => 'ta', 'ဋ' => 't', 'ည' => 'ny', 'ဇ' => 'z', 'ဆ' => 'sa', 'စ' => 's', 'င' => 'ng', 'ဃ' => 'ga', 'ဂ' => 'g', 'လ' => 'l', 'သ' => 'th', '၈' => '8', 'ဩ' => 'aw', 'ခ' => 'kh', '၆' => '6', '၅' => '5', '၄' => '4', '၃' => '3', '၂' => '2', '၁' => '1', '၀' => '0', '၌' => 'hnaik', '၍' => 'ywae', 'ဪ' => 'aw', 'ဦ' => '-u', 'ဟ' => 'h', 'ဉ' => 'u', 'ဤ' => '-i', 'ဣ' => 'i', '၏' => '-e', 'ဧ' => 'e', 'ှ' => 'h', 'ွ' => 'w', 'ျ' => 'ya', 'ြ' => 'y', 'အ' => 'a', 'ဠ' => 'la', '၇' => '7', ], // Croatian (Hrvatska) 'hr' => [ 'DŽ' => 'DZ', 'Dž' => 'Dz', 'dž' => 'dz', 'DZ' => 'DZ', 'Dz' => 'Dz', 'dz' => 'dz', 'IJ' => 'IJ', 'ij' => 'ij', 'LJ' => 'LJ', 'Lj' => 'Lj', 'lj' => 'lj', 'NJ' => 'NJ', 'Nj' => 'Nj', 'nj' => 'nj', 'ž' => 'z', 'Ž' => 'Z', 'đ' => 'dj', 'Đ' => 'Dj', 'č' => 'c', 'Č' => 'C', 'ć' => 'c', 'Ć' => 'C', 'š' => 's', 'Š' => 'S', ], // Finnish 'fi' => [ 'Ä' => 'A', 'Ö' => 'O', 'ä' => 'a', 'ö' => 'o', ], // Georgian (Kartvelian) 'ka' => [ 'ა' => 'a', 'ბ' => 'b', 'გ' => 'g', 'დ' => 'd', 'ე' => 'e', 'ვ' => 'v', 'ზ' => 'z', 'თ' => 't', 'ი' => 'i', 'კ' => 'k', 'ლ' => 'l', 'მ' => 'm', 'ნ' => 'n', 'ო' => 'o', 'პ' => 'p', 'ჟ' => 'zh', 'რ' => 'r', 'ს' => 's', 'ტ' => 't', 'უ' => 'u', 'ფ' => 'f', 'ქ' => 'q', 'ღ' => 'gh', 'ყ' => 'y', 'შ' => 'sh', 'ჩ' => 'ch', 'ც' => 'ts', 'ძ' => 'dz', 'წ' => 'ts', 'ჭ' => 'ch', 'ხ' => 'kh', 'ჯ' => 'j', 'ჰ' => 'h', ], // Russian 'ru' => [ 'А' => 'A', 'а' => 'a', 'Б' => 'B', 'б' => 'b', 'В' => 'V', 'в' => 'v', 'Г' => 'G', 'г' => 'g', 'Д' => 'D', 'д' => 'd', 'Е' => 'E', 'е' => 'e', 'Ё' => 'Yo', 'ё' => 'yo', 'Ж' => 'Zh', 'ж' => 'zh', 'З' => 'Z', 'з' => 'z', 'И' => 'I', 'и' => 'i', 'Й' => 'Y', 'й' => 'y', 'К' => 'K', 'к' => 'k', 'Л' => 'L', 'л' => 'l', 'М' => 'M', 'м' => 'm', 'Н' => 'N', 'н' => 'n', 'О' => 'O', 'о' => 'o', 'П' => 'P', 'п' => 'p', 'Р' => 'R', 'р' => 'r', 'С' => 'S', 'с' => 's', 'Т' => 'T', 'т' => 't', 'У' => 'U', 'у' => 'u', 'Ф' => 'F', 'ф' => 'f', 'Х' => 'H', 'х' => 'h', 'Ц' => 'Ts', 'ц' => 'ts', 'Ч' => 'Ch', 'ч' => 'ch', 'ш' => 'sh', 'Ш' => 'Sh', 'Щ' => 'Sch', 'щ' => 'sch', 'Ъ' => '', 'ъ' => '', 'Ы' => 'Y', 'ы' => 'y', 'Ь' => '', 'ь' => '', 'Э' => 'E', 'э' => 'e', 'Ю' => 'Yu', 'ю' => 'yu', 'Я' => 'Ya', 'я' => 'ya', ], // Russian - GOST 7.79-2000(B) // -> https://en.m.wikipedia.org/wiki/Romanization_of_Russian#content-collapsible-block-1 'ru__gost_2000_b' => [ 'А' => 'A', 'а' => 'a', 'Б' => 'B', 'б' => 'b', 'В' => 'V', 'в' => 'v', 'Г' => 'G', 'г' => 'g', 'Д' => 'D', 'д' => 'd', 'Е' => 'E', 'е' => 'e', 'Ё' => 'Yo', 'ё' => 'yo', 'Ж' => 'Zh', 'ж' => 'zh', 'З' => 'Z', 'з' => 'z', 'И' => 'i', 'и' => 'i', 'Й' => 'i', 'й' => 'i', 'К' => 'K', 'к' => 'k', 'Л' => 'L', 'л' => 'l', 'М' => 'M', 'м' => 'm', 'Н' => 'N', 'н' => 'n', 'О' => 'O', 'о' => 'o', 'П' => 'P', 'п' => 'p', 'Р' => 'R', 'р' => 'r', 'С' => 'S', 'с' => 's', 'Т' => 'T', 'т' => 't', 'У' => 'U', 'у' => 'u', 'Ф' => 'F', 'ф' => 'f', 'Х' => 'X', 'х' => 'x', 'Ц' => 'Cz', 'ц' => 'cz', 'Ч' => 'Ch', 'ч' => 'ch', 'ш' => 'sh', 'Ш' => 'Sh', 'Щ' => 'Shh', 'щ' => 'shh', 'Ъ' => '', 'ъ' => '', 'Ы' => 'Y\'', 'ы' => 'y\'', 'Ь' => '', 'ь' => '', 'Э' => 'E\'', 'э' => 'e\'', 'Ю' => 'Yu', 'ю' => 'yu', 'Я' => 'Ya', 'я' => 'ya', 'І' => 'I', 'і' => 'i', 'Ѳ' => 'Fh', 'ѳ' => 'fh', 'Ѣ' => 'Ye', 'ѣ' => 'ye', 'Ѵ' => 'Yh', 'ѵ' => 'yh', 'Є' => '', 'є' => '', 'Ѥ' => '', 'ѥ' => '', 'Ѕ' => 'Js', 'ѕ' => 'js', 'Ꙋ' => '', 'ꙋ' => '', 'Ѡ' => '', 'ѡ' => '', 'Ѿ' => '', 'ѿ' => '', 'Ѫ' => '', 'ѫ' => '', 'Ѧ' => '', 'ѧ' => '', 'Ѭ' => '', 'ѭ' => '', 'Ѩ' => '', 'ѩ' => '', 'Ѯ' => '', 'ѯ' => '', 'Ѱ' => '', 'ѱ' => '', ], // Russian - Passport (2013), ICAO // -> https://en.m.wikipedia.org/wiki/Romanization_of_Russian#content-collapsible-block-1 'ru__passport_2013' => [ 'А' => 'A', 'а' => 'a', 'Б' => 'B', 'б' => 'b', 'В' => 'V', 'в' => 'v', 'Г' => 'G', 'г' => 'g', 'Д' => 'D', 'д' => 'd', 'Е' => 'E', 'е' => 'e', 'Ё' => 'E', 'ё' => 'e', 'Ж' => 'Zh', 'ж' => 'zh', 'З' => 'Z', 'з' => 'z', 'И' => 'i', 'и' => 'i', 'Й' => 'i', 'й' => 'i', 'К' => 'K', 'к' => 'k', 'Л' => 'L', 'л' => 'l', 'М' => 'M', 'м' => 'm', 'Н' => 'N', 'н' => 'n', 'О' => 'O', 'о' => 'o', 'П' => 'P', 'п' => 'p', 'Р' => 'R', 'р' => 'r', 'С' => 'S', 'с' => 's', 'Т' => 'T', 'т' => 't', 'У' => 'U', 'у' => 'u', 'Ф' => 'F', 'ф' => 'f', 'Х' => 'Kh', 'х' => 'kh', 'Ц' => 'Ts', 'ц' => 'ts', 'Ч' => 'Ch', 'ч' => 'ch', 'ш' => 'sh', 'Ш' => 'Sh', 'Щ' => 'Shch', 'щ' => 'shch', 'Ъ' => 'Ie', 'ъ' => 'ie', 'Ы' => 'Y', 'ы' => 'y', 'Ь' => '', 'ь' => '', 'Э' => 'E', 'э' => 'e', 'Ю' => 'Iu', 'ю' => 'iu', 'Я' => 'Ia', 'я' => 'ia', 'І' => '', 'і' => '', 'Ѳ' => '', 'ѳ' => '', 'Ѣ' => '', 'ѣ' => '', 'Ѵ' => '', 'ѵ' => '', 'Є' => '', 'є' => '', 'Ѥ' => '', 'ѥ' => '', 'Ѕ' => '', 'ѕ' => '', 'Ꙋ' => '', 'ꙋ' => '', 'Ѡ' => '', 'ѡ' => '', 'Ѿ' => '', 'ѿ' => '', 'Ѫ' => '', 'ѫ' => '', 'Ѧ' => '', 'ѧ' => '', 'Ѭ' => '', 'ѭ' => '', 'Ѩ' => '', 'ѩ' => '', 'Ѯ' => '', 'ѯ' => '', 'Ѱ' => '', 'ѱ' => '', ], // Ukrainian // -> https://zakon.rada.gov.ua/laws/show/55-2010-%D0%BF?lang=en 'uk' => [ 'Г' => 'H', 'г' => 'h', 'Ґ' => 'G', 'ґ' => 'g', 'Є' => 'Ye', 'є' => 'ye', 'И' => 'Y', 'и' => 'y', 'І' => 'I', 'і' => 'i', 'Ї' => 'Yi', 'ї' => 'yi', 'Й' => 'Y', 'й' => 'y', 'Х' => 'Kh', 'х' => 'kh', 'Ц' => 'Ts', 'ц' => 'ts', 'Ч' => 'Ch', 'ч' => 'ch', 'Ш' => 'Sh', 'ш' => 'sh', 'Щ' => 'Shch', 'щ' => 'shch', ], // Kazakh 'kk' => [ 'Ә' => 'A', 'Ғ' => 'G', 'Қ' => 'Q', 'Ң' => 'N', 'Ө' => 'O', 'Ұ' => 'U', 'Ү' => 'U', 'Һ' => 'H', 'ә' => 'a', 'ғ' => 'g', 'қ' => 'q', 'ң' => 'n', 'ө' => 'o', 'ұ' => 'u', 'ү' => 'u', 'һ' => 'h', ], // Czech 'cs' => [ 'á' => 'a', 'Á' => 'A', 'č' => 'c', 'Č' => 'C', 'ď' => 'd', 'Ď' => 'D', 'é' => 'e', 'É' => 'E', 'ě' => 'e', 'Ě' => 'E', 'í' => 'i', 'Í' => 'I', 'ň' => 'n', 'Ň' => 'N', 'ó' => 'o', 'Ó' => 'O', 'ř' => 'r', 'Ř' => 'R', 'š' => 's', 'Š' => 'S', 'ť' => 't', 'Ť' => 'T', 'ú' => 'u', 'Ú' => 'U', 'ů' => 'u', 'Ů' => 'U', 'ý' => 'y', 'Ý' => 'Y', 'ž' => 'z', 'Ž' => 'Z', ], // Danish 'da' => [ 'Æ' => 'Ae', 'æ' => 'ae', 'Ø' => 'Oe', 'ø' => 'oe', 'Å' => 'Aa', 'å' => 'aa', 'É' => 'E', 'é' => 'e', ], // Polish 'pl' => [ 'ą' => 'a', 'ć' => 'c', 'ę' => 'e', 'ł' => 'l', 'ń' => 'n', 'ó' => 'o', 'ś' => 's', 'ź' => 'z', 'ż' => 'z', 'Ą' => 'A', 'Ć' => 'C', 'Ę' => 'E', 'Ł' => 'L', 'Ń' => 'N', 'Ó' => 'O', 'Ś' => 'S', 'Ź' => 'Z', 'Ż' => 'Z', ], // Romanian 'ro' => [ 'ă' => 'a', 'â' => 'a', 'Ă' => 'A', 'Â' => 'A', 'î' => 'i', 'Î' => 'I', 'ș' => 's', 'ş' => 's', 'Ş' => 'S', 'Ș' => 'S', 'ț' => 't', 'ţ' => 't', 'Ţ' => 'T', 'Ț' => 'T', ], // Esperanto 'eo' => [ 'ĉ' => 'cx', 'ĝ' => 'gx', 'ĥ' => 'hx', 'ĵ' => 'jx', 'ŝ' => 'sx', 'ŭ' => 'ux', 'Ĉ' => 'CX', 'Ĝ' => 'GX', 'Ĥ' => 'HX', 'Ĵ' => 'JX', 'Ŝ' => 'SX', 'Ŭ' => 'UX', ], // Estonian 'et' => [ 'Š' => 'S', 'Ž' => 'Z', 'Õ' => 'O', 'Ä' => 'A', 'Ö' => 'O', 'Ü' => 'U', 'š' => 's', 'ž' => 'z', 'õ' => 'o', 'ä' => 'a', 'ö' => 'o', 'ü' => 'u', ], // Latvian 'lv' => [ 'ā' => 'a', 'č' => 'c', 'ē' => 'e', 'ģ' => 'g', 'ī' => 'i', 'ķ' => 'k', 'ļ' => 'l', 'ņ' => 'n', 'š' => 's', 'ū' => 'u', 'ž' => 'z', 'Ā' => 'A', 'Č' => 'C', 'Ē' => 'E', 'Ģ' => 'G', 'Ī' => 'i', 'Ķ' => 'k', 'Ļ' => 'L', 'Ņ' => 'N', 'Š' => 'S', 'Ū' => 'u', 'Ž' => 'Z', ], // Lithuanian 'lt' => [ 'ą' => 'a', 'č' => 'c', 'ę' => 'e', 'ė' => 'e', 'į' => 'i', 'š' => 's', 'ų' => 'u', 'ū' => 'u', 'ž' => 'z', 'Ą' => 'A', 'Č' => 'C', 'Ę' => 'E', 'Ė' => 'E', 'Į' => 'I', 'Š' => 'S', 'Ų' => 'U', 'Ū' => 'U', 'Ž' => 'Z', ], // Norwegian 'no' => [ 'Æ' => 'AE', 'æ' => 'ae', 'Ø' => 'OE', 'ø' => 'oe', 'Å' => 'AA', 'å' => 'aa', ], // Vietnamese 'vi' => [ 'Á' => 'A', 'À' => 'A', 'Ả' => 'A', 'Ã' => 'A', 'Ạ' => 'A', 'Ă' => 'A', 'Ắ' => 'A', 'Ằ' => 'A', 'Ẳ' => 'A', 'Ẵ' => 'A', 'Ặ' => 'A', 'Â' => 'A', 'Ấ' => 'A', 'Ầ' => 'A', 'Ẩ' => 'A', 'Ẫ' => 'A', 'Ậ' => 'A', 'á' => 'a', 'à' => 'a', 'ả' => 'a', 'ã' => 'a', 'ạ' => 'a', 'ă' => 'a', 'ắ' => 'a', 'ằ' => 'a', 'ẳ' => 'a', 'ẵ' => 'a', 'ặ' => 'a', 'â' => 'a', 'ấ' => 'a', 'ầ' => 'a', 'ẩ' => 'a', 'ẫ' => 'a', 'ậ' => 'a', 'É' => 'E', 'È' => 'E', 'Ẻ' => 'E', 'Ẽ' => 'E', 'Ẹ' => 'E', 'Ê' => 'E', 'Ế' => 'E', 'Ề' => 'E', 'Ể' => 'E', 'Ễ' => 'E', 'Ệ' => 'E', 'é' => 'e', 'è' => 'e', 'ẻ' => 'e', 'ẽ' => 'e', 'ẹ' => 'e', 'ê' => 'e', 'ế' => 'e', 'ề' => 'e', 'ể' => 'e', 'ễ' => 'e', 'ệ' => 'e', 'Í' => 'I', 'Ì' => 'I', 'Ỉ' => 'I', 'Ĩ' => 'I', 'Ị' => 'I', 'í' => 'i', 'ì' => 'i', 'ỉ' => 'i', 'ĩ' => 'i', 'ị' => 'i', 'Ó' => 'O', 'Ò' => 'O', 'Ỏ' => 'O', 'Õ' => 'O', 'Ọ' => 'O', 'Ô' => 'O', 'Ố' => 'O', 'Ồ' => 'O', 'Ổ' => 'O', 'Ỗ' => 'O', 'Ộ' => 'O', 'Ơ' => 'O', 'Ớ' => 'O', 'Ờ' => 'O', 'Ở' => 'O', 'Ỡ' => 'O', 'Ợ' => 'O', 'ó' => 'o', 'ò' => 'o', 'ỏ' => 'o', 'õ' => 'o', 'ọ' => 'o', 'ô' => 'o', 'ố' => 'o', 'ồ' => 'o', 'ổ' => 'o', 'ỗ' => 'o', 'ộ' => 'o', 'ơ' => 'o', 'ớ' => 'o', 'ờ' => 'o', 'ở' => 'o', 'ỡ' => 'o', 'ợ' => 'o', 'Ú' => 'U', 'Ù' => 'U', 'Ủ' => 'U', 'Ũ' => 'U', 'Ụ' => 'U', 'Ư' => 'U', 'Ứ' => 'U', 'Ừ' => 'U', 'Ử' => 'U', 'Ữ' => 'U', 'Ự' => 'U', 'ú' => 'u', 'ù' => 'u', 'ủ' => 'u', 'ũ' => 'u', 'ụ' => 'u', 'ư' => 'u', 'ứ' => 'u', 'ừ' => 'u', 'ử' => 'u', 'ữ' => 'u', 'ự' => 'u', 'Ý' => 'Y', 'Ỳ' => 'Y', 'Ỷ' => 'Y', 'Ỹ' => 'Y', 'Ỵ' => 'Y', 'ý' => 'y', 'ỳ' => 'y', 'ỷ' => 'y', 'ỹ' => 'y', 'ỵ' => 'y', 'Đ' => 'D', 'đ' => 'd', ], // Persian (Farsi) 'fa' => [ 'ا' => 'a', 'ب' => 'b', 'پ' => 'p', 'ت' => 't', 'ث' => 's', 'ج' => 'j', 'چ' => 'ch', 'ح' => 'h', 'خ' => 'kh', 'د' => 'd', 'ذ' => 'z', 'ر' => 'r', 'ز' => 'z', 'س' => 's', 'ش' => 'sh', 'ص' => 's', 'ض' => 'z', 'ط' => 't', 'ظ' => 'z', 'ع' => 'a', 'غ' => 'gh', 'ف' => 'f', 'ق' => 'gh', 'ک' => 'k', 'گ' => 'g', 'ل' => 'l', 'ژ' => 'zh', 'ك' => 'k', 'م' => 'm', 'ن' => 'n', 'ه' => 'h', 'و' => 'o', 'ی' => 'y', 'آ' => 'a', '٠' => '0', '١' => '1', '٢' => '2', '٣' => '3', '٤' => '4', '٥' => '5', '٦' => '6', '٧' => '7', '٨' => '8', '٩' => '9', ], // Arabic 'ar' => [ 'أ' => 'a', 'ب' => 'b', 'ت' => 't', 'ث' => 'th', 'ج' => 'g', 'ح' => 'h', 'خ' => 'kh', 'د' => 'd', 'ذ' => 'th', 'ر' => 'r', 'ز' => 'z', 'س' => 's', 'ش' => 'sh', 'ص' => 's', 'ض' => 'd', 'ط' => 't', 'ظ' => 'th', 'ع' => 'aa', 'غ' => 'gh', 'ف' => 'f', 'ق' => 'k', 'ك' => 'k', 'ل' => 'l', 'م' => 'm', 'ن' => 'n', 'ه' => 'h', 'و' => 'o', 'ي' => 'y', 'ا' => 'a', 'إ' => 'a', 'آ' => 'a', 'ؤ' => 'o', 'ئ' => 'y', 'ء' => 'aa', '٠' => '0', '١' => '1', '٢' => '2', '٣' => '3', '٤' => '4', '٥' => '5', '٦' => '6', '٧' => '7', '٨' => '8', '٩' => '9', ], // Serbian 'sr' => [ 'đ' => 'dj', 'ž' => 'z', 'ć' => 'c', 'č' => 'c', 'š' => 's', 'Đ' => 'Dj', 'Ž' => 'Z', 'Ć' => 'C', 'Č' => 'C', 'Š' => 'S', 'а' => 'a', 'б' => 'b', 'в' => 'v', 'г' => 'g', 'д' => 'd', 'ђ' => 'dj', 'е' => 'e', 'ж' => 'z', 'з' => 'z', 'и' => 'i', 'ј' => 'j', 'к' => 'k', 'л' => 'l', 'љ' => 'lj', 'м' => 'm', 'н' => 'n', 'њ' => 'nj', 'о' => 'o', 'п' => 'p', 'р' => 'r', 'с' => 's', 'т' => 't', 'ћ' => 'c', 'у' => 'u', 'ф' => 'f', 'х' => 'h', 'ц' => 'c', 'ч' => 'c', 'џ' => 'dz', 'ш' => 's', 'А' => 'A', 'Б' => 'B', 'В' => 'V', 'Г' => 'G', 'Д' => 'D', 'Ђ' => 'Dj', 'Е' => 'E', 'Ж' => 'Z', 'З' => 'Z', 'И' => 'I', 'Ј' => 'j', 'К' => 'K', 'Л' => 'L', 'Љ' => 'Lj', 'М' => 'M', 'Н' => 'N', 'Њ' => 'Nj', 'О' => 'O', 'П' => 'P', 'Р' => 'R', 'С' => 'S', 'Т' => 'T', 'Ћ' => 'C', 'У' => 'U', 'Ф' => 'F', 'Х' => 'H', 'Ц' => 'C', 'Ч' => 'C', 'Џ' => 'Dz', 'Ш' => 'S', ], // Serbian - Cyrillic 'sr__cyr' => [ 'а' => 'a', 'б' => 'b', 'в' => 'v', 'г' => 'g', 'д' => 'd', 'ђ' => 'dj', 'е' => 'e', 'ж' => 'z', 'з' => 'z', 'и' => 'i', 'ј' => 'j', 'к' => 'k', 'л' => 'l', 'љ' => 'lj', 'м' => 'm', 'н' => 'n', 'њ' => 'nj', 'о' => 'o', 'п' => 'p', 'р' => 'r', 'с' => 's', 'т' => 't', 'ћ' => 'c', 'у' => 'u', 'ф' => 'f', 'х' => 'h', 'ц' => 'c', 'ч' => 'c', 'џ' => 'dz', 'ш' => 's', 'А' => 'A', 'Б' => 'B', 'В' => 'V', 'Г' => 'G', 'Д' => 'D', 'Ђ' => 'Dj', 'Е' => 'E', 'Ж' => 'Z', 'З' => 'Z', 'И' => 'I', 'Ј' => 'j', 'К' => 'K', 'Л' => 'L', 'Љ' => 'Lj', 'М' => 'M', 'Н' => 'N', 'Њ' => 'Nj', 'О' => 'O', 'П' => 'P', 'Р' => 'R', 'С' => 'S', 'Т' => 'T', 'Ћ' => 'C', 'У' => 'U', 'Ф' => 'F', 'Х' => 'H', 'Ц' => 'C', 'Ч' => 'C', 'Џ' => 'Dz', 'Ш' => 'S', ], // Serbian - Latin 'sr__lat' => [ 'đ' => 'dj', 'ž' => 'z', 'ć' => 'c', 'č' => 'c', 'š' => 's', 'Đ' => 'Dj', 'Ž' => 'Z', 'Ć' => 'C', 'Č' => 'C', 'Š' => 'S', ], // Azerbaijani 'az' => [ 'ç' => 'c', 'ə' => 'e', 'ğ' => 'g', 'ı' => 'i', 'ö' => 'o', 'ş' => 's', 'ü' => 'u', 'Ç' => 'C', 'Ə' => 'E', 'Ğ' => 'G', 'İ' => 'I', 'Ö' => 'O', 'Ş' => 'S', 'Ü' => 'U', ], // Slovak 'sk' => [ 'á' => 'a', 'ä' => 'a', 'č' => 'c', 'ď' => 'd', 'é' => 'e', 'í' => 'i', 'ľ' => 'l', 'ĺ' => 'l', 'ň' => 'n', 'ó' => 'o', 'ô' => 'o', 'ŕ' => 'r', 'š' => 's', 'ť' => 't', 'ú' => 'u', 'ý' => 'y', 'ž' => 'z', 'Á' => 'A', 'Ä' => 'A', 'Č' => 'C', 'Ď' => 'D', 'É' => 'E', 'Í' => 'I', 'Ľ' => 'L', 'Ĺ' => 'L', 'Ň' => 'N', 'Ó' => 'O', 'Ô' => 'O', 'Ŕ' => 'R', 'Š' => 'S', 'Ť' => 'T', 'Ú' => 'U', 'Ý' => 'Y', 'Ž' => 'Z', ], // French 'fr' => [ 'Æ' => 'AE', 'æ' => 'ae', 'Œ' => 'OE', 'œ' => 'oe', 'â' => 'a', 'Â' => 'A', 'à' => 'a', 'À' => 'A', 'ä' => 'a', 'Ä' => 'A', 'ç' => 'c', 'Ç' => 'C', 'é' => 'e', 'É' => 'E', 'ê' => 'e', 'Ê' => 'E', 'ë' => 'e', 'Ë' => 'E', 'è' => 'e', 'È' => 'E', 'ï' => 'i', 'î' => 'i', 'Ï' => 'I', 'Î' => 'I', 'ÿ' => 'y', 'Ÿ' => 'Y', 'ô' => 'o', 'Ô' => 'O', 'ö' => 'o', 'Ö' => 'O', 'û' => 'u', 'Û' => 'U', 'ù' => 'u', 'Ù' => 'U', 'ü' => 'u', 'Ü' => 'U', ], // Austrian (French) 'fr_at' => [ 'ß' => 'sz', 'ẞ' => 'SZ', 'Æ' => 'AE', 'æ' => 'ae', 'Œ' => 'OE', 'œ' => 'oe', 'â' => 'a', 'Â' => 'A', 'à' => 'a', 'À' => 'A', 'ä' => 'a', 'Ä' => 'A', 'ç' => 'c', 'Ç' => 'C', 'é' => 'e', 'É' => 'E', 'ê' => 'e', 'Ê' => 'E', 'ë' => 'e', 'Ë' => 'E', 'è' => 'e', 'È' => 'E', 'ï' => 'i', 'î' => 'i', 'Ï' => 'I', 'Î' => 'I', 'ÿ' => 'y', 'Ÿ' => 'Y', 'ô' => 'o', 'Ô' => 'O', 'ö' => 'o', 'Ö' => 'O', 'û' => 'u', 'Û' => 'U', 'ù' => 'u', 'Ù' => 'U', 'ü' => 'u', 'Ü' => 'U', ], // Switzerland (French) 'fr_ch' => [ 'ß' => 'ss', 'ẞ' => 'SS', 'Æ' => 'AE', 'æ' => 'ae', 'Œ' => 'OE', 'œ' => 'oe', 'â' => 'a', 'Â' => 'A', 'à' => 'a', 'À' => 'A', 'ä' => 'a', 'Ä' => 'A', 'ç' => 'c', 'Ç' => 'C', 'é' => 'e', 'É' => 'E', 'ê' => 'e', 'Ê' => 'E', 'ë' => 'e', 'Ë' => 'E', 'è' => 'e', 'È' => 'E', 'ï' => 'i', 'î' => 'i', 'Ï' => 'I', 'Î' => 'I', 'ÿ' => 'y', 'Ÿ' => 'Y', 'ô' => 'o', 'Ô' => 'O', 'ö' => 'o', 'Ö' => 'O', 'û' => 'u', 'Û' => 'U', 'ù' => 'u', 'Ù' => 'U', 'ü' => 'u', 'Ü' => 'U', ], // German 'de' => [ 'Ä' => 'Ae', 'Ö' => 'Oe', 'Ü' => 'Ue', 'ä' => 'ae', 'ö' => 'oe', 'ü' => 'ue', 'ß' => 'ss', 'ẞ' => 'SS', ], // Austrian (German) 'de_at' => [ 'Ä' => 'Ae', 'Ö' => 'Oe', 'Ü' => 'Ue', 'ä' => 'ae', 'ö' => 'oe', 'ü' => 'ue', 'ß' => 'sz', 'ẞ' => 'SZ', ], // Switzerland (German) 'de_ch' => [ 'Ä' => 'Ae', 'Ö' => 'Oe', 'Ü' => 'Ue', 'ä' => 'ae', 'ö' => 'oe', 'ü' => 'ue', 'ß' => 'ss', 'ẞ' => 'SS', ], // Bengali (Bangla) 'bn' => [ 'ভ্ল' => 'vl', 'পশ' => 'psh', 'ব্ধ' => 'bdh', 'ব্জ' => 'bj', 'ব্দ' => 'bd', 'ব্ব' => 'bb', 'ব্ল' => 'bl', 'ভ' => 'v', 'ব' => 'b', 'চ্ঞ' => 'cNG', 'চ্ছ' => 'cch', 'চ্চ' => 'cc', 'ছ' => 'ch', 'চ' => 'c', 'ধ্ন' => 'dhn', 'ধ্ম' => 'dhm', 'দ্ঘ' => 'dgh', 'দ্ধ' => 'ddh', 'দ্ভ' => 'dv', 'দ্ম' => 'dm', 'ড্ড' => 'DD', 'ঢ' => 'Dh', 'ধ' => 'dh', 'দ্গ' => 'dg', 'দ্দ' => 'dd', 'ড' => 'D', 'দ' => 'd', '।' => '.', 'ঘ্ন' => 'Ghn', 'গ্ধ' => 'Gdh', 'গ্ণ' => 'GN', 'গ্ন' => 'Gn', 'গ্ম' => 'Gm', 'গ্ল' => 'Gl', 'জ্ঞ' => 'jNG', 'ঘ' => 'Gh', 'গ' => 'g', 'হ্ণ' => 'hN', 'হ্ন' => 'hn', 'হ্ম' => 'hm', 'হ্ল' => 'hl', 'হ' => 'h', 'জ্ঝ' => 'jjh', 'ঝ' => 'jh', 'জ্জ' => 'jj', 'জ' => 'j', 'ক্ষ্ণ' => 'kxN', 'ক্ষ্ম' => 'kxm', 'ক্ষ' => 'ksh', 'কশ' => 'ksh', 'ক্ক' => 'kk', 'ক্ট' => 'kT', 'ক্ত' => 'kt', 'ক্ল' => 'kl', 'ক্স' => 'ks', 'খ' => 'kh', 'ক' => 'k', 'ল্ভ' => 'lv', 'ল্ধ' => 'ldh', 'লখ' => 'lkh', 'লঘ' => 'lgh', 'লফ' => 'lph', 'ল্ক' => 'lk', 'ল্গ' => 'lg', 'ল্ট' => 'lT', 'ল্ড' => 'lD', 'ল্প' => 'lp', 'ল্ম' => 'lm', 'ল্ল' => 'll', 'ল্ব' => 'lb', 'ল' => 'l', 'ম্থ' => 'mth', 'ম্ফ' => 'mf', 'ম্ভ' => 'mv', 'মপ্ল' => 'mpl', 'ম্ন' => 'mn', 'ম্প' => 'mp', 'ম্ম' => 'mm', 'ম্ল' => 'ml', 'ম্ব' => 'mb', 'ম' => 'm', '০' => '0', '১' => '1', '২' => '2', '৩' => '3', '৪' => '4', '৫' => '5', '৬' => '6', '৭' => '7', '৮' => '8', '৯' => '9', 'ঙ্ক্ষ' => 'Ngkx', 'ঞ্ছ' => 'nch', 'ঙ্ঘ' => 'ngh', 'ঙ্খ' => 'nkh', 'ঞ্ঝ' => 'njh', 'ঙ্গৌ' => 'ngOU', 'ঙ্গৈ' => 'ngOI', 'ঞ্চ' => 'nc', 'ঙ্ক' => 'nk', 'ঙ্ষ' => 'Ngx', 'ঙ্গ' => 'ngo', 'ঙ্ম' => 'Ngm', 'ঞ্জ' => 'nj', 'ন্ধ' => 'ndh', 'ন্ঠ' => 'nTh', 'ণ্ঠ' => 'NTh', 'ন্থ' => 'nth', 'ঙ্গা' => 'nga', 'ঙ্গি' => 'ngi', 'ঙ্গী' => 'ngI', 'ঙ্গু' => 'ngu', 'ঙ্গূ' => 'ngU', 'ঙ্গে' => 'nge', 'ঙ্গো' => 'ngO', 'ণ্ঢ' => 'NDh', 'নশ' => 'nsh', 'ঙর' => 'Ngr', 'ঞর' => 'NGr', 'ংর' => 'ngr', 'ঙ' => 'Ng', 'ঞ' => 'NG', 'ং' => 'ng', 'ন্ন' => 'nn', 'ণ্ণ' => 'NN', 'ণ্ন' => 'Nn', 'ন্ম' => 'nm', 'ণ্ম' => 'Nm', 'ন্দ' => 'nd', 'ন্ট' => 'nT', 'ণ্ট' => 'NT', 'ন্ড' => 'nD', 'ণ্ড' => 'ND', 'ন্ত' => 'nt', 'ন্স' => 'ns', 'ন' => 'n', 'ণ' => 'N', 'ৈ' => 'OI', 'ৌ' => 'OU', 'ো' => 'O', 'ঐ' => 'OI', 'ঔ' => 'OU', 'অ' => 'o', 'ও' => 'oo', 'ফ্ল' => 'fl', 'প্ট' => 'pT', 'প্ত' => 'pt', 'প্ন' => 'pn', 'প্প' => 'pp', 'প্ল' => 'pl', 'প্স' => 'ps', 'ফ' => 'f', 'প' => 'p', 'ৃ' => 'rri', 'ঋ' => 'rri', 'রর‍্য' => 'rry', '্র্য' => 'ry', '্রর' => 'rr', 'ড়্গ' => 'Rg', 'ঢ়' => 'Rh', 'ড়' => 'R', 'র' => 'r', '্র' => 'r', 'শ্ছ' => 'Sch', 'ষ্ঠ' => 'ShTh', 'ষ্ফ' => 'Shf', 'স্ক্ল' => 'skl', 'স্খ' => 'skh', 'স্থ' => 'sth', 'স্ফ' => 'sf', 'শ্চ' => 'Sc', 'শ্ত' => 'St', 'শ্ন' => 'Sn', 'শ্ম' => 'Sm', 'শ্ল' => 'Sl', 'ষ্ক' => 'Shk', 'ষ্ট' => 'ShT', 'ষ্ণ' => 'ShN', 'ষ্প' => 'Shp', 'ষ্ম' => 'Shm', 'স্প্ল' => 'spl', 'স্ক' => 'sk', 'স্ট' => 'sT', 'স্ত' => 'st', 'স্ন' => 'sn', 'স্প' => 'sp', 'স্ম' => 'sm', 'স্ল' => 'sl', 'শ' => 'S', 'ষ' => 'Sh', 'স' => 's', 'ু' => 'u', 'উ' => 'u', 'অ্য' => 'oZ', 'ত্থ' => 'tth', 'ৎ' => 'tt', 'ট্ট' => 'TT', 'ট্ম' => 'Tm', 'ঠ' => 'Th', 'ত্ন' => 'tn', 'ত্ম' => 'tm', 'থ' => 'th', 'ত্ত' => 'tt', 'ট' => 'T', 'ত' => 't', 'অ্যা' => 'AZ', 'া' => 'a', 'আ' => 'a', 'য়া' => 'ya', 'য়' => 'y', 'ি' => 'i', 'ই' => 'i', 'ী' => 'ee', 'ঈ' => 'ee', 'ূ' => 'uu', 'ঊ' => 'uu', 'ে' => 'e', 'এ' => 'e', 'য' => 'z', '্য' => 'Z', 'ইয়' => 'y', 'ওয়' => 'w', '্ব' => 'w', 'এক্স' => 'x', 'ঃ' => ':', 'ঁ' => 'nn', '্‌' => '', ], // English 'en' => [ ], // Latin (+ Cyrillic ?) chars // // -> Mix of languages, but we need to keep this here, so that different languages can handle there own behavior. 'latin' => [ '˚' => '0', '¹' => '1', '²' => '2', '³' => '3', '⁴' => '4', '⁵' => '5', '⁶' => '6', '⁷' => '7', '⁸' => '8', '⁹' => '9', '₀' => '0', '₁' => '1', '₂' => '2', '₃' => '3', '₄' => '4', '₅' => '5', '₆' => '6', '₇' => '7', '₈' => '8', '₉' => '9', '௦' => '0', '௧' => '1', '௨' => '2', '௩' => '3', '௪' => '4', '௫' => '5', '௬' => '6', '௭' => '7', '௮' => '8', '௯' => '9', '௰' => '10', '௱' => '100', '௲' => '1000', 'Ꜳ' => 'AA', 'ꜳ' => 'aa', 'Æ' => 'AE', 'æ' => 'ae', 'Ǽ' => 'AE', 'ǽ' => 'ae', 'Ꜵ' => 'AO', 'ꜵ' => 'ao', 'Ꜷ' => 'AU', 'ꜷ' => 'au', 'Ꜹ' => 'AV', 'ꜹ' => 'av', 'Ꜻ' => 'av', 'ꜻ' => 'av', 'Ꜽ' => 'AY', 'ꜽ' => 'ay', 'ȸ' => 'db', 'ʣ' => 'dz', 'ʥ' => 'dz', 'ʤ' => 'dezh', '🙰' => 'et', 'ff' => 'ff', 'ffi' => 'ffi', 'ffl' => 'ffl', 'fi' => 'fi', 'fl' => 'fl', 'ʩ' => 'feng', 'IJ' => 'IJ', 'ij' => 'ij', 'ʪ' => 'ls', 'ʫ' => 'lz', 'ɮ' => 'lezh', 'ȹ' => 'qp', 'ʨ' => 'tc', 'ʦ' => 'ts', 'ʧ' => 'tesh', 'Œ' => 'OE', 'œ' => 'oe', 'Ꝏ' => 'OO', 'ꝏ' => 'oo', 'ẞ' => 'SS', 'ß' => 'ss', 'st' => 'st', 'ſt' => 'st', 'Ꜩ' => 'TZ', 'ꜩ' => 'tz', 'ᵫ' => 'ue', 'Aι' => 'Ai', 'αι' => 'ai', 'Ει' => 'Ei', 'ει' => 'ei', 'Οι' => 'Oi', 'οι' => 'oi', 'Ου' => 'Oy', 'ου' => 'oy', 'Υι' => 'Yi', 'υι' => 'yi', 'ἀ' => 'a', 'ἁ' => 'a', 'ἂ' => 'a', 'ἃ' => 'a', 'ἄ' => 'a', 'ἅ' => 'a', 'ἆ' => 'a', 'ἇ' => 'a', 'Ἀ' => 'A', 'Ἁ' => 'A', 'Ἂ' => 'A', 'Ἃ' => 'A', 'Ἄ' => 'A', 'Ἅ' => 'A', 'Ἆ' => 'A', 'Ἇ' => 'A', 'ᾰ' => 'a', 'ᾱ' => 'a', 'ᾲ' => 'a', 'ᾳ' => 'a', 'ᾴ' => 'a', 'ᾶ' => 'a', 'ᾷ' => 'a', 'Ᾰ' => 'A', 'Ᾱ' => 'A', 'Ὰ' => 'A', 'Ά' => 'A', 'ᾼ' => 'A', 'Ä' => 'A', 'ä' => 'a', 'À' => 'A', 'à' => 'a', 'Á' => 'A', 'á' => 'a', 'Â' => 'A', 'â' => 'a', 'Ã' => 'A', 'ã' => 'a', 'A̧' => 'A', 'a̧' => 'a', 'Ą' => 'A', 'ą' => 'a', 'Ⱥ' => 'A', 'ⱥ' => 'a', 'Å' => 'A', 'å' => 'a', 'Ǻ' => 'A', 'ǻ' => 'a', 'Ă' => 'A', 'ă' => 'a', 'Ǎ' => 'A', 'ǎ' => 'a', 'Ȧ' => 'A', 'ȧ' => 'a', 'Ạ' => 'A', 'ạ' => 'a', 'Ā' => 'A', 'ā' => 'a', 'ª' => 'a', 'Ɓ' => 'B', 'Ѣ' => 'E', 'ѣ' => 'e', 'Ç' => 'C', 'ç' => 'c', 'Ĉ' => 'C', 'ĉ' => 'c', 'C̈' => 'C', 'c̈' => 'c', 'C̨' => 'C', 'c̨' => 'c', 'Ȼ' => 'C', 'ȼ' => 'c', 'Č' => 'C', 'č' => 'c', 'Ć' => 'C', 'ć' => 'c', 'C̀' => 'C', 'c̀' => 'c', 'Ċ' => 'C', 'ċ' => 'c', 'C̣' => 'C', 'c̣' => 'c', 'C̄' => 'C', 'c̄' => 'c', 'C̃' => 'C', 'c̃' => 'c', 'Ð' => 'D', 'Đ' => 'D', 'ð' => 'd', 'đ' => 'd', 'È' => 'E', 'É' => 'E', 'Ê' => 'E', 'Ë' => 'E', 'Ĕ' => 'E', 'Ė' => 'E', 'Ȩ' => 'E', 'ȩ' => 'e', 'Ę' => 'E', 'ę' => 'e', 'Ɇ' => 'E', 'ɇ' => 'e', 'Ě' => 'E', 'ě' => 'e', 'Ẹ' => 'E', 'ẹ' => 'e', 'Ē' => 'E', 'ē' => 'e', 'Ẽ' => 'E', 'ẽ' => 'e', 'è' => 'e', 'é' => 'e', 'ê' => 'e', 'ë' => 'e', 'ĕ' => 'e', 'ė' => 'e', 'ƒ' => 'f', 'Ѳ' => 'F', 'ѳ' => 'f', 'Ĝ' => 'G', 'Ġ' => 'G', 'ĝ' => 'g', 'ġ' => 'g', 'Ĥ' => 'H', 'Ħ' => 'H', 'ĥ' => 'h', 'ħ' => 'h', 'Ì' => 'I', 'Í' => 'I', 'Î' => 'I', 'Ï' => 'I', 'Ĩ' => 'I', 'Ĭ' => 'I', 'Ǐ' => 'I', 'Į' => 'I', 'ì' => 'i', 'í' => 'i', 'î' => 'i', 'ï' => 'i', 'ĩ' => 'i', 'ĭ' => 'i', 'ǐ' => 'i', 'į' => 'i', 'І' => 'I', 'і' => 'i', 'I̧' => 'I', 'i̧' => 'i', 'Ɨ' => 'I', 'ɨ' => 'i', 'İ' => 'I', 'i' => 'i', 'Ị' => 'I', 'ị' => 'i', 'Ī' => 'I', 'ī' => 'i', 'Ĵ' => 'J', 'ĵ' => 'j', 'J́́' => 'J', 'j́' => 'j', 'J̀̀' => 'J', 'j̀' => 'j', 'J̈' => 'J', 'j̈' => 'j', 'J̧' => 'J', 'j̧' => 'j', 'J̨' => 'J', 'j̨' => 'j', 'Ɉ' => 'J', 'ɉ' => 'j', 'J̌' => 'J', 'ǰ' => 'j', 'J̇' => 'J', 'j' => 'j', 'J̣' => 'J', 'j̣' => 'j', 'J̄' => 'J', 'j̄' => 'j', 'J̃' => 'J', 'j̃' => 'j', 'Й' => 'i', 'й' => 'i', 'ĸ' => 'k', 'Ĺ' => 'L', 'Ľ' => 'L', 'Ŀ' => 'L', 'ĺ' => 'l', 'ľ' => 'l', 'ŀ' => 'l', 'L̀' => 'L', 'l̀' => 'l', 'L̂' => 'L', 'l̂' => 'l', 'L̈' => 'L', 'l̈' => 'l', 'Ļ' => 'L', 'ļ' => 'l', 'L̨' => 'L', 'l̨' => 'l', 'Ł' => 'L', 'ł' => 'l', 'Ƚ' => 'L', 'ƚ' => 'l', 'L̇' => 'L', 'l̇' => 'l', 'Ḷ' => 'L', 'ḷ' => 'l', 'L̄' => 'L', 'l̄' => 'l', 'L̃' => 'L', 'l̃' => 'l', 'Ñ' => 'N', 'ñ' => 'n', 'Ŋ' => 'N', 'ŋ' => 'n', 'ʼn' => 'n', 'Ń' => 'N', 'ń' => 'n', 'Ǹ' => 'N', 'ǹ' => 'n', 'N̂' => 'N', 'n̂' => 'n', 'N̈' => 'N', 'n̈' => 'n', 'Ņ' => 'N', 'ņ' => 'n', 'N̨' => 'N', 'n̨' => 'n', 'Ꞥ' => 'N', 'ꞥ' => 'n', 'Ň' => 'N', 'ň' => 'n', 'Ṅ' => 'N', 'ṅ' => 'n', 'Ṇ' => 'N', 'ṇ' => 'n', 'N̄' => 'N', 'n̄' => 'n', 'Ö' => 'O', 'Ò' => 'O', 'Ó' => 'O', 'Ô' => 'O', 'Õ' => 'O', 'Ō' => 'O', 'Ŏ' => 'O', 'Ǒ' => 'O', 'Ő' => 'O', 'Ơ' => 'O', 'Ø' => 'O', 'Ǿ' => 'O', 'ö' => 'o', 'ò' => 'o', 'ó' => 'o', 'ô' => 'o', 'õ' => 'o', 'ō' => 'o', 'ŏ' => 'o', 'ǒ' => 'o', 'ő' => 'o', 'ơ' => 'o', 'ø' => 'o', 'ǿ' => 'o', 'º' => 'o', 'O̧' => 'O', 'o̧' => 'o', 'Ǫ' => 'O', 'ǫ' => 'o', 'Ɵ' => 'O', 'ɵ' => 'o', 'Ȯ' => 'O', 'ȯ' => 'o', 'Ọ' => 'O', 'ọ' => 'o', 'Ŕ' => 'R', 'Ŗ' => 'R', 'ŕ' => 'r', 'ŗ' => 'r', 'Ŝ' => 'S', 'Ș' => 'S', 'ș' => 's', 'Ś' => 'S', 'ś' => 's', 'S̀' => 'S', 's̀' => 's', 'Ŝ̀' => 'S', 'ŝ' => 's', 'S̈' => 'S', 's̈' => 's', 'Ş' => 'S', 'ş' => 's', 'S̨' => 'S', 's̨' => 's', 'Ꞩ' => 'S', 'ꞩ' => 's', 'Š' => 'S', 'š' => 's', 'Ṡ' => 'S', 'ṡ' => 's', 'Ṣ' => 'S', 'ṣ' => 's', 'S̄' => 'S', 's̄' => 's', 'S̃' => 'S', 's̃' => 's', 'ſ' => 's', 'Ţ' => 'T', 'Ț' => 'T', 'Ŧ' => 'T', 'Þ' => 'TH', 'ţ' => 't', 'ț' => 't', 'ŧ' => 't', 'þ' => 'th', 'T́' => 'T', 't́' => 't', 'T̀' => 'T', 't̀' => 't', 'T̂' => 'T', 't̂' => 't', 'T̈' => 'T', 'ẗ' => 't', 'T̨' => 'T', 't̨' => 't', 'Ⱦ' => 'T', 'ⱦ' => 't', 'Ť' => 'T', 'ť' => 't', 'Ṫ' => 'T', 'ṫ' => 't', 'Ṭ' => 'T', 'ṭ' => 't', 'T̄' => 'T', 't̄' => 't', 'T̃' => 'T', 't̃' => 't', 'Ü' => 'U', 'Ù' => 'U', 'Ú' => 'U', 'Û' => 'U', 'Ũ' => 'U', 'Ŭ' => 'U', 'Ű' => 'U', 'Ų' => 'U', 'Ư' => 'U', 'Ǔ' => 'U', 'Ǖ' => 'U', 'Ǘ' => 'U', 'Ǚ' => 'U', 'Ǜ' => 'U', 'ü' => 'u', 'ù' => 'u', 'ú' => 'u', 'û' => 'u', 'ũ' => 'u', 'ŭ' => 'u', 'ű' => 'u', 'ų' => 'u', 'ư' => 'u', 'ǔ' => 'u', 'ǖ' => 'u', 'ǘ' => 'u', 'ǚ' => 'u', 'ǜ' => 'u', 'U̧' => 'U', 'u̧' => 'u', 'Ʉ' => 'U', 'ʉ' => 'u', 'U̇' => 'U', 'u̇' => 'u', 'Ụ' => 'U', 'ụ' => 'u', 'Ū' => 'U', 'ū' => 'u', 'Ʊ' => 'U', 'ʊ' => 'u', 'Ŵ' => 'W', 'ŵ' => 'w', 'Ẁ' => 'W', 'ẁ' => 'w', 'Ẃ' => 'W', 'ẃ' => 'w', 'Ẅ' => 'W', 'ẅ' => 'w', 'Ѵ' => 'I', 'ѵ' => 'i', 'Ꙗ' => 'Ja', 'ꙗ' => 'ja', 'Є' => 'Je', 'є' => 'je', 'Ѥ' => 'Je', 'ѥ' => 'je', 'Ѕ' => 'Dz', 'ѕ' => 'dz', 'Ꙋ' => 'U', 'ꙋ' => 'u', 'Ѡ' => 'O', 'ѡ' => 'o', 'Ѿ' => 'Ot', 'ѿ' => 'ot', 'Ѫ' => 'U', 'ѫ' => 'u', 'Ѧ' => 'Ja', 'ѧ' => 'ja', 'Ѭ' => 'Ju', 'ѭ' => 'ju', 'Ѩ' => 'Ja', 'ѩ' => 'Ja', 'Ѯ' => 'Ks', 'ѯ' => 'ks', 'Ѱ' => 'Ps', 'ѱ' => 'ps', 'Х' => 'X', 'х' => 'x', 'Ý' => 'Y', 'Ÿ' => 'Y', 'Ŷ' => 'Y', 'ý' => 'y', 'ÿ' => 'y', 'ŷ' => 'y', 'Ỳ' => 'Y', 'ỳ' => 'y', 'Y̧' => 'Y', 'y̧' => 'y', 'Y̨' => 'Y', 'y̨' => 'y', 'Ɏ' => 'Y', 'ɏ' => 'y', 'Y̌' => 'Y', 'y̌' => 'y', 'Ẏ' => 'Y', 'ẏ' => 'y', 'Ỵ' => 'Y', 'ỵ' => 'y', 'Ȳ' => 'Y', 'ȳ' => 'y', 'Ỹ' => 'Y', 'ỹ' => 'y', 'Щ' => 'Shh', 'щ' => 'shh', 'Ź' => 'Z', 'ź' => 'z', 'Z̀' => 'Z', 'z̀' => 'z', 'Ẑ' => 'Z', 'ẑ' => 'z', 'Z̈' => 'Z', 'z̈' => 'z', 'Z̧' => 'Z', 'z̧' => 'z', 'Z̨' => 'Z', 'z̨' => 'z', 'Ƶ' => 'Z', 'ƶ' => 'z', 'Ž' => 'Z', 'ž' => 'z', 'Ż' => 'Z', 'ż' => 'z', 'Ẓ' => 'Z', 'ẓ' => 'z', 'Z̄' => 'Z', 'z̄' => 'z', 'Z̃' => 'Z', 'z̃' => 'z', ], // whitespace chars ' ' => [ "\xc2\xa0" => ' ', // 'NO-BREAK SPACE' "\xe1\x9a\x80" => ' ', // 'OGHAM SPACE MARK' "\xe2\x80\x80" => ' ', // 'EN QUAD' "\xe2\x80\x81" => ' ', // 'EM QUAD' "\xe2\x80\x82" => ' ', // 'EN SPACE' "\xe2\x80\x83" => ' ', // 'EM SPACE' "\xe2\x80\x84" => ' ', // 'THREE-PER-EM SPACE' "\xe2\x80\x85" => ' ', // 'FOUR-PER-EM SPACE' "\xe2\x80\x86" => ' ', // 'SIX-PER-EM SPACE' "\xe2\x80\x87" => ' ', // 'FIGURE SPACE' "\xe2\x80\x88" => ' ', // 'PUNCTUATION SPACE' "\xe2\x80\x89" => ' ', // 'THIN SPACE' "\xe2\x80\x8a" => ' ', // 'HAIR SPACE' "\xe2\x80\xa8" => ' ', // 'LINE SEPARATOR' "\xe2\x80\xa9" => ' ', // 'PARAGRAPH SEPARATOR' "\xe2\x80\x8b" => ' ', // 'ZERO WIDTH SPACE' "\xe2\x80\xaf" => ' ', // 'NARROW NO-BREAK SPACE' "\xe2\x81\x9f" => ' ', // 'MEDIUM MATHEMATICAL SPACE' "\xe3\x80\x80" => ' ', // 'IDEOGRAPHIC SPACE' "\xef\xbe\xa0" => ' ', // 'HALFWIDTH HANGUL FILLER' ], // commonly used in Word documents 'msword' => [ "\xc2\xab" => '<<', // « (U+00AB) in UTF-8 "\xc2\xbb" => '>>', // » (U+00BB) in UTF-8 "\xe2\x80\x98" => "'", // ‘ (U+2018) in UTF-8 "\xe2\x80\x99" => "'", // ’ (U+2019) in UTF-8 "\xe2\x80\x9a" => "'", // ‚ (U+201A) in UTF-8 "\xe2\x80\x9b" => "'", // ‛ (U+201B) in UTF-8 "\xe2\x80\x9c" => '"', // “ (U+201C) in UTF-8 "\xe2\x80\x9d" => '"', // ” (U+201D) in UTF-8 "\xe2\x80\x9e" => '"', // „ (U+201E) in UTF-8 "\xe2\x80\x9f" => '"', // ‟ (U+201F) in UTF-8 "\xe2\x80\xb9" => "'", // ‹ (U+2039) in UTF-8 "\xe2\x80\xba" => "'", // › (U+203A) in UTF-8 "\xe2\x80\x93" => '-', // – (U+2013) in UTF-8 "\xe2\x80\x94" => '-', // — (U+2014) in UTF-8 "\xe2\x80\xa6" => '...', // … (U+2026) in UTF-8 ], // Currency // // url => https://en.wikipedia.org/wiki/Currency_symbol 'currency_short' => [ '€' => 'EUR', '$' => '$', '₢' => 'Cr', '₣' => 'Fr.', '£' => 'PS', '₤' => 'L.', 'ℳ' => 'M', '₥' => 'mil', '₦' => 'N', '₧' => 'Pts', '₨' => 'Rs', 'රු' => 'LKR', 'ரூ' => 'LKR', '௹' => 'Rs', 'रू' => 'NPR', '₹' => 'Rs', '૱' => 'Rs', '₩' => 'W', '₪' => 'NS', '₸' => 'KZT', '₫' => 'D', '֏' => 'AMD', '₭' => 'K', '₺' => 'TL', '₼' => 'AZN', '₮' => 'T', '₯' => 'Dr', '₲' => 'PYG', '₾' => 'GEL', '₳' => 'ARA', '₴' => 'UAH', '₽' => 'RUB', '₵' => 'GHS', '₡' => 'CL', '¢' => 'c', '¥' => 'YEN', '円' => 'JPY', '৳' => 'BDT', '元' => 'CNY', '﷼' => 'SAR', '៛' => 'KR', '₠' => 'ECU', '¤' => '$?', '฿' => 'THB', '؋' => 'AFN', ], ]; PK,Z:~=L,portable-ascii/src/voku/helper/data/x006.phpnuW+A,portable-ascii/src/voku/helper/data/x0cc.phpnuW+A 'a', 'b', 'c', 'd', 'e', 'f', 'g', 'h', 'i', 'j', 'k', 'l', 'm', 'n', 'o', 'p', 'q', 'r', 's', 't', 'u', 'v', 'w', 'x', 'y', 'z', 52 => 'A', 'B', 'C', 'D', 'E', 'F', 'G', 'H', 'I', 'J', 'K', 'L', 'M', 'N', 'O', 'P', 'Q', 'R', 'S', 'T', 'U', 'V', 'W', 'X', 'Y', 'Z', 78 => 'a', 'b', 'c', 'd', 'e', 'f', 'g', 'h', 'i', 'j', 'k', 'l', 'm', 'n', 'o', 'p', 'q', 'r', 's', 't', 'u', 'v', 'w', 'x', 'y', 'z', 104 => 'A', 'B', 'C', 'D', 'E', 'F', 'G', 'H', 'I', 'J', 'K', 'L', 'M', 'N', 'O', 'P', 'Q', 'R', 'S', 'T', 'U', 'V', 'W', 'X', 'Y', 'Z', 130 => 'a', 'b', 'c', 'd', 'e', 'f', 'g', 'h', 'i', 'j', 'k', 'l', 'm', 'n', 'o', 'p', 'q', 'r', 's', 't', 'u', 'v', 'w', 'x', 'y', 'z', 156 => 'B', 'C', 'D', 'E', 'F', 'G', 'H', 'I', 'J', 'K', 'L', 'M', 'N', 'O', 'P', 'Q', 'R', 'S', 'T', 'U', 'V', 'W', 'X', 'Y', 'Z', 181 => 'Z', 182 => 'a', 'b', 'c', 'd', 'e', 'f', 'g', 'h', 'i', 'j', 'k', 'l', 'm', 'n', 'o', 'p', 'q', 'r', 's', 't', 'u', 'v', 'w', 'x', 'y', 'z', 208 => 'A', 'B', 'C', 'D', 'E', 'F', 'G', 'H', 'I', 'J', 'K', 'L', 'M', 'N', 'O', 'P', 'Q', 'R', 'S', 'T', 'U', 'V', 'W', 'X', 'Y', 'Z', 234 => 'a', 'b', 'c', 'd', 'e', 'f', 'g', 'h', 'i', 'j', 'k', 'l', 'm', 'n', 'o', 'p', 'q', 'r', 's', 't', 'u', 'v', 'w', 'x', 'y', 'z']; PK,Z ,portable-ascii/src/voku/helper/data/x0c4.phpnuW+A 'A', 'B', 'C', 'D', 'E', 'F', 'G', 'H', 'I', 'J', 'K', 'L', 'M', 'N', 'O', 'P', 'Q', 'R', 'S', 'T', 'U', 'V', 'W', 'X', 'Y', 'Z', 80 => 'a', 'b', 'c', 'd', 'e', 'f', 'g', 'h', 'i', 'j', 'k', 'l', 'm', 'n', 'o', 'p', 'q', 'r', 's', 't', 'u', 'v', 'w', 'x', 'y', 'z', 112 => 'A', 'B', 'C', 'D', 'E', 'F', 'G', 'H', 'I', 'J', 'K', 'L', 'M', 'N', 'O', 'P', 'Q', 'R', 'S', 'T', 'U', 'V', 'W', 'X', 'Y', 'Z', 230 => 'A', 'B', 'C', 'D', 'E', 'F', 'G', 'H', 'I', 'J', 'K', 'L', 'M', 'N', 'O', 'P', 'Q', 'R', 'S', 'T', 'U', 'V', 'W', 'X', 'Y', 'Z', ]; PK,Z)ٛ,portable-ascii/src/voku/helper/data/x0a2.phpnuW+A>,portable-ascii/src/voku/helper/data/x093.phpnuW+A 0, "\x00" => 0, "\x01" => 1, "\x02" => 2, "\x03" => 3, "\x04" => 4, "\x05" => 5, "\x06" => 6, "\x07" => 7, "\x08" => 8, "\x09" => 9, "\x0A" => 10, "\x0B" => 11, "\x0C" => 12, "\x0D" => 13, "\x0E" => 14, "\x0F" => 15, "\x10" => 16, "\x11" => 17, "\x12" => 18, "\x13" => 19, "\x14" => 20, "\x15" => 21, "\x16" => 22, "\x17" => 23, "\x18" => 24, "\x19" => 25, "\x1A" => 26, "\x1B" => 27, "\x1C" => 28, "\x1D" => 29, "\x1E" => 30, "\x1F" => 31, "\x20" => 32, "\x21" => 33, "\x22" => 34, "\x23" => 35, "\x24" => 36, "\x25" => 37, "\x26" => 38, "\x27" => 39, "\x28" => 40, "\x29" => 41, "\x2A" => 42, "\x2B" => 43, "\x2C" => 44, "\x2D" => 45, "\x2E" => 46, "\x2F" => 47, "\x30" => 48, "\x31" => 49, "\x32" => 50, "\x33" => 51, "\x34" => 52, "\x35" => 53, "\x36" => 54, "\x37" => 55, "\x38" => 56, "\x39" => 57, "\x3A" => 58, "\x3B" => 59, "\x3C" => 60, "\x3D" => 61, "\x3E" => 62, "\x3F" => 63, "\x40" => 64, "\x41" => 65, "\x42" => 66, "\x43" => 67, "\x44" => 68, "\x45" => 69, "\x46" => 70, "\x47" => 71, "\x48" => 72, "\x49" => 73, "\x4A" => 74, "\x4B" => 75, "\x4C" => 76, "\x4D" => 77, "\x4E" => 78, "\x4F" => 79, "\x50" => 80, "\x51" => 81, "\x52" => 82, "\x53" => 83, "\x54" => 84, "\x55" => 85, "\x56" => 86, "\x57" => 87, "\x58" => 88, "\x59" => 89, "\x5A" => 90, "\x5B" => 91, "\x5C" => 92, "\x5D" => 93, "\x5E" => 94, "\x5F" => 95, "\x60" => 96, "\x61" => 97, "\x62" => 98, "\x63" => 99, "\x64" => 100, "\x65" => 101, "\x66" => 102, "\x67" => 103, "\x68" => 104, "\x69" => 105, "\x6A" => 106, "\x6B" => 107, "\x6C" => 108, "\x6D" => 109, "\x6E" => 110, "\x6F" => 111, "\x70" => 112, "\x71" => 113, "\x72" => 114, "\x73" => 115, "\x74" => 116, "\x75" => 117, "\x76" => 118, "\x77" => 119, "\x78" => 120, "\x79" => 121, "\x7A" => 122, "\x7B" => 123, "\x7C" => 124, "\x7D" => 125, "\x7E" => 126, "\x7F" => 127, "\x80" => 128, "\x81" => 129, "\x82" => 130, "\x83" => 131, "\x84" => 132, "\x85" => 133, "\x86" => 134, "\x87" => 135, "\x88" => 136, "\x89" => 137, "\x8A" => 138, "\x8B" => 139, "\x8C" => 140, "\x8D" => 141, "\x8E" => 142, "\x8F" => 143, "\x90" => 144, "\x91" => 145, "\x92" => 146, "\x93" => 147, "\x94" => 148, "\x95" => 149, "\x96" => 150, "\x97" => 151, "\x98" => 152, "\x99" => 153, "\x9A" => 154, "\x9B" => 155, "\x9C" => 156, "\x9D" => 157, "\x9E" => 158, "\x9F" => 159, "\xA0" => 160, "\xA1" => 161, "\xA2" => 162, "\xA3" => 163, "\xA4" => 164, "\xA5" => 165, "\xA6" => 166, "\xA7" => 167, "\xA8" => 168, "\xA9" => 169, "\xAA" => 170, "\xAB" => 171, "\xAC" => 172, "\xAD" => 173, "\xAE" => 174, "\xAF" => 175, "\xB0" => 176, "\xB1" => 177, "\xB2" => 178, "\xB3" => 179, "\xB4" => 180, "\xB5" => 181, "\xB6" => 182, "\xB7" => 183, "\xB8" => 184, "\xB9" => 185, "\xBA" => 186, "\xBB" => 187, "\xBC" => 188, "\xBD" => 189, "\xBE" => 190, "\xBF" => 191, "\xC0" => 192, "\xC1" => 193, "\xC2" => 194, "\xC3" => 195, "\xC4" => 196, "\xC5" => 197, "\xC6" => 198, "\xC7" => 199, "\xC8" => 200, "\xC9" => 201, "\xCA" => 202, "\xCB" => 203, "\xCC" => 204, "\xCD" => 205, "\xCE" => 206, "\xCF" => 207, "\xD0" => 208, "\xD1" => 209, "\xD2" => 210, "\xD3" => 211, "\xD4" => 212, "\xD5" => 213, "\xD6" => 214, "\xD7" => 215, "\xD8" => 216, "\xD9" => 217, "\xDA" => 218, "\xDB" => 219, "\xDC" => 220, "\xDD" => 221, "\xDE" => 222, "\xDF" => 223, "\xE0" => 224, "\xE1" => 225, "\xE2" => 226, "\xE3" => 227, "\xE4" => 228, "\xE5" => 229, "\xE6" => 230, "\xE7" => 231, "\xE8" => 232, "\xE9" => 233, "\xEA" => 234, "\xEB" => 235, "\xEC" => 236, "\xED" => 237, "\xEE" => 238, "\xEF" => 239, "\xF0" => 240, "\xF1" => 241, "\xF2" => 242, "\xF3" => 243, "\xF4" => 244, "\xF5" => 245, "\xF6" => 246, "\xF7" => 247, "\xF8" => 248, "\xF9" => 249, "\xFA" => 250, "\xFB" => 251, "\xFC" => 252, "\xFD" => 253, "\xFE" => 254, "\xFF" => 255]; PK,ZcPP,portable-ascii/src/voku/helper/data/x01f.phpnuW+A ', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]']; PK,Z,portable-ascii/src/voku/helper/data/x0b4.phpnuW+A>|null */ private static $ASCII_MAPS; /** * @var array>|null */ private static $ASCII_MAPS_AND_EXTRAS; /** * @var array>|null */ private static $ASCII_EXTRAS; /** * @var array|null */ private static $ORD; /** * @var array|null */ private static $LANGUAGE_MAX_KEY; /** * url: https://en.wikipedia.org/wiki/Wikipedia:ASCII#ASCII_printable_characters * * @var string */ private static $REGEX_ASCII = "[^\x09\x10\x13\x0A\x0D\x20-\x7E]"; /** * bidirectional text chars * * url: https://www.w3.org/International/questions/qa-bidi-unicode-controls * * @var array */ private static $BIDI_UNI_CODE_CONTROLS_TABLE = [ // LEFT-TO-RIGHT EMBEDDING (use -> dir = "ltr") 8234 => "\xE2\x80\xAA", // RIGHT-TO-LEFT EMBEDDING (use -> dir = "rtl") 8235 => "\xE2\x80\xAB", // POP DIRECTIONAL FORMATTING // (use ->
) 8236 => "\xE2\x80\xAC", // LEFT-TO-RIGHT OVERRIDE // (use -> ) 8237 => "\xE2\x80\xAD", // RIGHT-TO-LEFT OVERRIDE // (use -> ) 8238 => "\xE2\x80\xAE", // LEFT-TO-RIGHT ISOLATE // (use -> dir = "ltr") 8294 => "\xE2\x81\xA6", // RIGHT-TO-LEFT ISOLATE // (use -> dir = "rtl") 8295 => "\xE2\x81\xA7", // FIRST STRONG ISOLATE // (use -> dir = "auto") 8296 => "\xE2\x81\xA8", // POP DIRECTIONAL ISOLATE 8297 => "\xE2\x81\xA9", ]; /** * Get all languages from the constants "ASCII::.*LANGUAGE_CODE". * * @return array *

An associative array where the key is the language code in lowercase * and the value is the corresponding language string.

*/ public static function getAllLanguages(): array { // init static $LANGUAGES = []; if ($LANGUAGES !== []) { return $LANGUAGES; } foreach ((new \ReflectionClass(__CLASS__))->getConstants() as $constant => $lang) { if (\strpos($constant, 'EXTRA') !== false) { $LANGUAGES[\strtolower($constant)] = $lang; } else { $LANGUAGES[\strtolower(\str_replace('_LANGUAGE_CODE', '', $constant))] = $lang; } } return $LANGUAGES; } /** * Returns an replacement array for ASCII methods. * * EXAMPLE: * $array = ASCII::charsArray(); * var_dump($array['ru']['б']); // 'b' * * * @param bool $replace_extra_symbols [optional]

Add some more replacements e.g. "£" with " pound ".

* * @psalm-pure * * @return array> *

An array where the key is the language code, and the value is * an associative array mapping original characters to their replacements.

*/ public static function charsArray(bool $replace_extra_symbols = false): array { if ($replace_extra_symbols) { self::prepareAsciiAndExtrasMaps(); return self::$ASCII_MAPS_AND_EXTRAS ?? []; } self::prepareAsciiMaps(); return self::$ASCII_MAPS ?? []; } /** * Returns an replacement array for ASCII methods with a mix of multiple languages. * * EXAMPLE: * $array = ASCII::charsArrayWithMultiLanguageValues(); * var_dump($array['b']); // ['β', 'б', 'ဗ', 'ბ', 'ب'] * * * @param bool $replace_extra_symbols [optional]

Add some more replacements e.g. "£" with " pound ".

* * @psalm-pure * * @return array> *

An array of replacements.

*/ public static function charsArrayWithMultiLanguageValues(bool $replace_extra_symbols = false): array { static $CHARS_ARRAY = []; $cacheKey = '' . $replace_extra_symbols; if (isset($CHARS_ARRAY[$cacheKey])) { return $CHARS_ARRAY[$cacheKey]; } // init $return = []; $language_all_chars = self::charsArrayWithSingleLanguageValues( $replace_extra_symbols, false ); /* @noinspection AlterInForeachInspection | ok here */ foreach ($language_all_chars as $key => &$value) { $return[$value][] = $key; } $CHARS_ARRAY[$cacheKey] = $return; return $return; } /** * Returns an replacement array for ASCII methods with one language. * * For example, German will map 'ä' to 'ae', while other languages * will simply return e.g. 'a'. * * EXAMPLE: * $array = ASCII::charsArrayWithOneLanguage('ru'); * $tmpKey = \array_search('yo', $array['replace']); * echo $array['orig'][$tmpKey]; // 'ё' * * * @param string $language [optional]

Language of the source string e.g.: en, de_at, or de-ch. * (default is 'en') | ASCII::*_LANGUAGE_CODE

* @param bool $replace_extra_symbols [optional]

Add some more replacements e.g. "£" with " pound ".

* @param bool $asOrigReplaceArray [optional]

TRUE === return {orig: list, replace: list} * array

* * @psalm-pure * * @return ($asOrigReplaceArray is true ? array{orig: list, replace: list} : array) * * @phpstan-param ASCII::*_LANGUAGE_CODE $language */ public static function charsArrayWithOneLanguage( string $language = self::ENGLISH_LANGUAGE_CODE, bool $replace_extra_symbols = false, bool $asOrigReplaceArray = true ): array { $language = self::get_language($language); // init static $CHARS_ARRAY = []; $cacheKey = '' . $replace_extra_symbols . '-' . $asOrigReplaceArray; // check static cache if (isset($CHARS_ARRAY[$cacheKey][$language])) { return $CHARS_ARRAY[$cacheKey][$language]; } if ($replace_extra_symbols) { self::prepareAsciiAndExtrasMaps(); if (isset(self::$ASCII_MAPS_AND_EXTRAS[$language])) { $tmpArray = self::$ASCII_MAPS_AND_EXTRAS[$language]; if ($asOrigReplaceArray) { $CHARS_ARRAY[$cacheKey][$language] = [ 'orig' => \array_keys($tmpArray), 'replace' => \array_values($tmpArray), ]; } else { $CHARS_ARRAY[$cacheKey][$language] = $tmpArray; } } else { if ($asOrigReplaceArray) { $CHARS_ARRAY[$cacheKey][$language] = [ 'orig' => [], 'replace' => [], ]; } else { $CHARS_ARRAY[$cacheKey][$language] = []; } } } else { self::prepareAsciiMaps(); if (isset(self::$ASCII_MAPS[$language])) { $tmpArray = self::$ASCII_MAPS[$language]; if ($asOrigReplaceArray) { $CHARS_ARRAY[$cacheKey][$language] = [ 'orig' => \array_keys($tmpArray), 'replace' => \array_values($tmpArray), ]; } else { $CHARS_ARRAY[$cacheKey][$language] = $tmpArray; } } else { if ($asOrigReplaceArray) { $CHARS_ARRAY[$cacheKey][$language] = [ 'orig' => [], 'replace' => [], ]; } else { $CHARS_ARRAY[$cacheKey][$language] = []; } } } return $CHARS_ARRAY[$cacheKey][$language] ?? ['orig' => [], 'replace' => []]; } /** * Returns an replacement array for ASCII methods with multiple languages. * * EXAMPLE: * $array = ASCII::charsArrayWithSingleLanguageValues(); * $tmpKey = \array_search('hnaik', $array['replace']); * echo $array['orig'][$tmpKey]; // '၌' * * * @param bool $replace_extra_symbols [optional]

Add some more replacements e.g. "£" with " pound ".

* @param bool $asOrigReplaceArray [optional]

TRUE === return {orig: list, replace: list} * array

* * @psalm-pure * * @return ($asOrigReplaceArray is true ? array{orig: list, replace: list} : array) */ public static function charsArrayWithSingleLanguageValues( bool $replace_extra_symbols = false, bool $asOrigReplaceArray = true ): array { // init static $CHARS_ARRAY = []; $cacheKey = '' . $replace_extra_symbols . '-' . $asOrigReplaceArray; if (isset($CHARS_ARRAY[$cacheKey])) { return $CHARS_ARRAY[$cacheKey]; } if ($replace_extra_symbols) { self::prepareAsciiAndExtrasMaps(); /* @noinspection AlterInForeachInspection | ok here */ foreach (self::$ASCII_MAPS_AND_EXTRAS ?? [] as &$map) { $CHARS_ARRAY[$cacheKey][] = $map; } } else { self::prepareAsciiMaps(); /* @noinspection AlterInForeachInspection | ok here */ foreach (self::$ASCII_MAPS ?? [] as &$map) { $CHARS_ARRAY[$cacheKey][] = $map; } } $CHARS_ARRAY[$cacheKey] = \array_merge([], ...$CHARS_ARRAY[$cacheKey]); if ($asOrigReplaceArray) { $CHARS_ARRAY[$cacheKey] = [ 'orig' => \array_keys($CHARS_ARRAY[$cacheKey]), 'replace' => \array_values($CHARS_ARRAY[$cacheKey]), ]; } return $CHARS_ARRAY[$cacheKey]; } /** * Accepts a string and removes all non-UTF-8 characters from it + extras if needed. * * @param string $str

The string to be sanitized.

* @param bool $normalize_whitespace [optional]

Set to true, if you need to normalize the * whitespace.

* @param bool $normalize_msword [optional]

Set to true, if you need to normalize MS Word chars * e.g.: "…" * => "..."

* @param bool $keep_non_breaking_space [optional]

Set to true, to keep non-breaking-spaces, in * combination with * $normalize_whitespace

* @param bool $remove_invisible_characters [optional]

Set to false, if you not want to remove invisible * characters e.g.: "\0"

* * @psalm-pure * * @return string *

A clean UTF-8 string.

*/ public static function clean( string $str, bool $normalize_whitespace = true, bool $keep_non_breaking_space = false, bool $normalize_msword = true, bool $remove_invisible_characters = true ): string { // http://stackoverflow.com/questions/1401317/remove-non-utf8-characters-from-string // caused connection reset problem on larger strings $regex = '/ ( (?: [\x00-\x7F] # single-byte sequences 0xxxxxxx | [\xC0-\xDF][\x80-\xBF] # double-byte sequences 110xxxxx 10xxxxxx | [\xE0-\xEF][\x80-\xBF]{2} # triple-byte sequences 1110xxxx 10xxxxxx * 2 | [\xF0-\xF7][\x80-\xBF]{3} # quadruple-byte sequence 11110xxx 10xxxxxx * 3 ){1,100} # ...one or more times ) | ( [\x80-\xBF] ) # invalid byte in range 10000000 - 10111111 | ( [\xC0-\xFF] ) # invalid byte in range 11000000 - 11111111 /x'; $str = (string) \preg_replace($regex, '$1', $str); if ($normalize_whitespace) { $str = self::normalize_whitespace($str, $keep_non_breaking_space); } if ($normalize_msword) { $str = self::normalize_msword($str); } if ($remove_invisible_characters) { $str = self::remove_invisible_characters($str); } return $str; } /** * Checks if a string is 7 bit ASCII. * * EXAMPLE: * ASCII::is_ascii('白'); // false * * * @param string $str

The string to check.

* * @psalm-pure * * @return bool *

* true if it is ASCII
* false otherwise *

*/ public static function is_ascii(string $str): bool { if ($str === '') { return true; } return !\preg_match('/' . self::$REGEX_ASCII . '/', $str); } /** * Returns a string with smart quotes, ellipsis characters, and dashes from * Windows-1252 (commonly used in Word documents) replaced by their ASCII * equivalents. * * EXAMPLE: * ASCII::normalize_msword('„Abcdef…”'); // '"Abcdef..."' * * * @param string $str

The string to be normalized.

* * @psalm-pure * * @return string *

A string with normalized characters for commonly used chars in Word documents.

*/ public static function normalize_msword(string $str): string { if ($str === '') { return ''; } static $MSWORD_CACHE = ['orig' => [], 'replace' => []]; if (empty($MSWORD_CACHE['orig'])) { self::prepareAsciiMaps(); $map = self::$ASCII_MAPS[self::EXTRA_MSWORD_CHARS_LANGUAGE_CODE] ?? []; $MSWORD_CACHE = [ 'orig' => \array_keys($map), 'replace' => \array_values($map), ]; } return \str_replace($MSWORD_CACHE['orig'], $MSWORD_CACHE['replace'], $str); } /** * Normalize the whitespace. * * EXAMPLE: * ASCII::normalize_whitespace("abc-\xc2\xa0-öäü-\xe2\x80\xaf-\xE2\x80\xAC", true); // "abc-\xc2\xa0-öäü- -" * * * @param string $str

The string to be normalized.

* @param bool $keepNonBreakingSpace [optional]

Set to true, to keep non-breaking-spaces.

* @param bool $keepBidiUnicodeControls [optional]

Set to true, to keep non-printable (for the web) * bidirectional text chars.

* @param bool $normalize_control_characters [optional]

Set to true, to convert e.g. LINE-, PARAGRAPH-SEPARATOR with "\n" and LINE TABULATION with "\t".

* * @psalm-pure * * @return string *

A string with normalized whitespace.

*/ public static function normalize_whitespace( string $str, bool $keepNonBreakingSpace = false, bool $keepBidiUnicodeControls = false, bool $normalize_control_characters = false ): string { if ($str === '') { return ''; } static $WHITESPACE_CACHE = []; $cacheKey = (int) $keepNonBreakingSpace; if ($normalize_control_characters) { $str = \str_replace( [ "\x0d\x0c", // 'END OF LINE' "\xe2\x80\xa8", // 'LINE SEPARATOR' "\xe2\x80\xa9", // 'PARAGRAPH SEPARATOR' "\x0c", // 'FORM FEED' // "\f" "\x0b", // 'VERTICAL TAB' // "\v" ], [ "\n", "\n", "\n", "\n", "\t", ], $str ); } if (!isset($WHITESPACE_CACHE[$cacheKey])) { self::prepareAsciiMaps(); $WHITESPACE_CACHE[$cacheKey] = self::$ASCII_MAPS[self::EXTRA_WHITESPACE_CHARS_LANGUAGE_CODE] ?? []; if ($keepNonBreakingSpace) { unset($WHITESPACE_CACHE[$cacheKey]["\xc2\xa0"]); } $WHITESPACE_CACHE[$cacheKey] = array_keys($WHITESPACE_CACHE[$cacheKey]); } if (!$keepBidiUnicodeControls) { static $BIDI_UNICODE_CONTROLS_CACHE = null; if ($BIDI_UNICODE_CONTROLS_CACHE === null) { $BIDI_UNICODE_CONTROLS_CACHE = self::$BIDI_UNI_CODE_CONTROLS_TABLE; } $str = \str_replace($BIDI_UNICODE_CONTROLS_CACHE, '', $str); } return \str_replace($WHITESPACE_CACHE[$cacheKey], ' ', $str); } /** * Remove invisible characters from a string. * * This prevents malicious code injection through null bytes or other control characters. * * copy&past from https://github.com/bcit-ci/CodeIgniter/blob/develop/system/core/Common.php * * @param string $str * @param bool $url_encoded * @param string $replacement * @param bool $keep_basic_control_characters * * @psalm-pure * * @return string */ public static function remove_invisible_characters( string $str, bool $url_encoded = false, string $replacement = '', bool $keep_basic_control_characters = true ): string { // init $non_displayables = []; // every control character except: // - newline (dec 10), // - carriage return (dec 13), // - horizontal tab (dec 09) if ($url_encoded) { $non_displayables[] = '/%0[0-8bcefBCEF]/'; // url encoded 00-08, 11, 12, 14, 15 $non_displayables[] = '/%1[0-9a-fA-F]/'; // url encoded 16-31 } if ($keep_basic_control_characters) { $non_displayables[] = '/[\x00-\x08\x0B\x0C\x0E-\x1F\x7F]+/S'; // 00-08, 11, 12, 14-31, 127 } else { $str = self::normalize_whitespace($str, false, false, true); $non_displayables[] = '/[^\P{C}\s]/u'; } do { $str = (string) \preg_replace($non_displayables, $replacement, $str, -1, $count); } while ($count !== 0); return $str; } /** * WARNING: This method will return broken characters and is only for special cases. * * Convert two UTF-8 encoded strings to a single-byte strings suitable for * functions that need the same string length after the conversion. * * The function simply uses (and updates) a tailored dynamic encoding * (in/out map parameter) where non-ascii characters are remapped to * the range [128-255] in order of appearance. * * @return array{0: string, 1: string} */ public static function to_ascii_remap(string $str1, string $str2): array { $charMap = []; $str1 = self::to_ascii_remap_intern($str1, $charMap); $str2 = self::to_ascii_remap_intern($str2, $charMap); return [$str1, $str2]; } /** * Returns an ASCII version of the string. A set of non-ASCII characters are * replaced with their closest ASCII counterparts, and the rest are removed * by default. The language or locale of the source string can be supplied * for language-specific transliteration in any of the following formats: * en, en_GB, or en-GB. For example, passing "de" results in "äöü" mapping * to "aeoeue" rather than "aou" as in other languages. * * EXAMPLE: * ASCII::to_ascii('�Düsseldorf�', 'en'); // Dusseldorf * * * @param string $str

The input string.

* @param string $language [optional]

Language of the source string. * (default is 'en') | ASCII::*_LANGUAGE_CODE

* @param bool $remove_unsupported_chars [optional]

Whether to remove the * unsupported characters.

* @param bool $replace_extra_symbols [optional]

Add some more replacements e.g. "£" with " pound * ".

* @param bool $use_transliterate [optional]

Use ASCII::to_transliterate() for unknown chars.

* @param bool $replace_single_chars_only [optional]

Single char replacement is better for the * performance, but some languages need to replace more than one char * at the same time. If FALSE === auto-setting, depended on the * language

* * @psalm-pure * * @return string *

A string that contains only ASCII characters.

* * @phpstan-param ASCII::*_LANGUAGE_CODE $language */ public static function to_ascii( string $str, string $language = self::ENGLISH_LANGUAGE_CODE, bool $remove_unsupported_chars = true, bool $replace_extra_symbols = false, bool $use_transliterate = false, bool $replace_single_chars_only = false ): string { if ($str === '') { return ''; } /** @phpstan-var ASCII::*_LANGUAGE_CODE $language - hack for phpstan */ $language = self::get_language($language); static $EXTRA_SYMBOLS_CACHE = null; static $REPLACE_HELPER_CACHE = []; $cacheKey = $language . '-' . $replace_extra_symbols; if (!isset($REPLACE_HELPER_CACHE[$cacheKey])) { $langAll = self::charsArrayWithSingleLanguageValues($replace_extra_symbols, false); $langSpecific = self::charsArrayWithOneLanguage($language, $replace_extra_symbols, false); if ($langSpecific === []) { $REPLACE_HELPER_CACHE[$cacheKey] = $langAll; } else { $REPLACE_HELPER_CACHE[$cacheKey] = \array_merge([], $langAll, $langSpecific); } } if ( $replace_extra_symbols && $EXTRA_SYMBOLS_CACHE === null ) { $EXTRA_SYMBOLS_CACHE = []; foreach (self::$ASCII_EXTRAS ?? [] as $extrasDataTmp) { foreach ($extrasDataTmp as $extrasDataKeyTmp => $extrasDataValueTmp) { $EXTRA_SYMBOLS_CACHE[$extrasDataKeyTmp] = $extrasDataKeyTmp; } } $EXTRA_SYMBOLS_CACHE = \implode('', $EXTRA_SYMBOLS_CACHE); } $charDone = []; if (\preg_match_all('/' . self::$REGEX_ASCII . ($replace_extra_symbols ? '|[' . $EXTRA_SYMBOLS_CACHE . ']' : '') . '/u', $str, $matches)) { if (!$replace_single_chars_only) { if (self::$LANGUAGE_MAX_KEY === null) { self::$LANGUAGE_MAX_KEY = self::getData('ascii_language_max_key'); } $maxKeyLength = self::$LANGUAGE_MAX_KEY[$language] ?? 0; if ($maxKeyLength >= 5) { foreach ($matches[0] as $keyTmp => $char) { if (isset($matches[0][$keyTmp + 4])) { $fiveChars = $matches[0][$keyTmp + 0] . $matches[0][$keyTmp + 1] . $matches[0][$keyTmp + 2] . $matches[0][$keyTmp + 3] . $matches[0][$keyTmp + 4]; } else { $fiveChars = null; } if ( $fiveChars && !isset($charDone[$fiveChars]) && isset($REPLACE_HELPER_CACHE[$cacheKey][$fiveChars]) && \strpos($str, $fiveChars) !== false ) { // DEBUG //\var_dump($str, $fiveChars, $REPLACE_HELPER_CACHE[$cacheKey][$fiveChars]); $charDone[$fiveChars] = true; $str = \str_replace($fiveChars, $REPLACE_HELPER_CACHE[$cacheKey][$fiveChars], $str); // DEBUG //\var_dump($str, "\n"); } } } if ($maxKeyLength >= 4) { foreach ($matches[0] as $keyTmp => $char) { if (isset($matches[0][$keyTmp + 3])) { $fourChars = $matches[0][$keyTmp + 0] . $matches[0][$keyTmp + 1] . $matches[0][$keyTmp + 2] . $matches[0][$keyTmp + 3]; } else { $fourChars = null; } if ( $fourChars && !isset($charDone[$fourChars]) && isset($REPLACE_HELPER_CACHE[$cacheKey][$fourChars]) && \strpos($str, $fourChars) !== false ) { // DEBUG //\var_dump($str, $fourChars, $REPLACE_HELPER_CACHE[$cacheKey][$fourChars]); $charDone[$fourChars] = true; $str = \str_replace($fourChars, $REPLACE_HELPER_CACHE[$cacheKey][$fourChars], $str); // DEBUG //\var_dump($str, "\n"); } } } foreach ($matches[0] as $keyTmp => $char) { if (isset($matches[0][$keyTmp + 2])) { $threeChars = $matches[0][$keyTmp + 0] . $matches[0][$keyTmp + 1] . $matches[0][$keyTmp + 2]; } else { $threeChars = null; } if ( $threeChars && !isset($charDone[$threeChars]) && isset($REPLACE_HELPER_CACHE[$cacheKey][$threeChars]) && \strpos($str, $threeChars) !== false ) { // DEBUG //\var_dump($str, $threeChars, $REPLACE_HELPER_CACHE[$cacheKey][$threeChars]); $charDone[$threeChars] = true; $str = \str_replace($threeChars, $REPLACE_HELPER_CACHE[$cacheKey][$threeChars], $str); // DEBUG //\var_dump($str, "\n"); } } foreach ($matches[0] as $keyTmp => $char) { if (isset($matches[0][$keyTmp + 1])) { $twoChars = $matches[0][$keyTmp + 0] . $matches[0][$keyTmp + 1]; } else { $twoChars = null; } if ( $twoChars && !isset($charDone[$twoChars]) && isset($REPLACE_HELPER_CACHE[$cacheKey][$twoChars]) && \strpos($str, $twoChars) !== false ) { // DEBUG //\var_dump($str, $twoChars, $REPLACE_HELPER_CACHE[$cacheKey][$twoChars]); $charDone[$twoChars] = true; $str = \str_replace($twoChars, $REPLACE_HELPER_CACHE[$cacheKey][$twoChars], $str); // DEBUG //\var_dump($str, "\n"); } } } foreach ($matches[0] as $char) { if ( !isset($charDone[$char]) && isset($REPLACE_HELPER_CACHE[$cacheKey][$char]) && \strpos($str, $char) !== false ) { // DEBUG //\var_dump($str, $char, $REPLACE_HELPER_CACHE[$cacheKey][$char]); $charDone[$char] = true; $str = \str_replace($char, $REPLACE_HELPER_CACHE[$cacheKey][$char], $str); // DEBUG //\var_dump($str, "\n"); } } } if (!isset(self::$ASCII_MAPS[$language])) { $use_transliterate = true; } if ($use_transliterate) { $str = self::to_transliterate($str, null, false); } if ($remove_unsupported_chars) { $str = (string) \str_replace(["\n\r", "\n", "\r", "\t"], ' ', $str); $str = (string) \preg_replace('/' . self::$REGEX_ASCII . '/', '', $str); } return $str; } /** * Convert given string to safe filename (and keep string case). * * EXAMPLE: * ASCII::to_filename('שדגשדג.png', true)); // 'shdgshdg.png' * * * @param string $str

The string input.

* @param bool $use_transliterate

ASCII::to_transliterate() is used by default - unsafe characters are * simply replaced with hyphen otherwise.

* @param string $fallback_char

The fallback character. - "-" is the default

* * @psalm-pure * * @return string *

A string that contains only safe characters for a filename.

*/ public static function to_filename( string $str, bool $use_transliterate = true, string $fallback_char = '-' ): string { if ($use_transliterate) { $str = self::to_transliterate($str, $fallback_char); } $fallback_char_escaped = \preg_quote($fallback_char, '/'); $str = (string) \preg_replace( [ '/[^' . $fallback_char_escaped . '.\\-a-zA-Z\d\\s]/', // 1) remove un-needed chars '/\s+/u', // 2) convert spaces to $fallback_char '/[' . $fallback_char_escaped . ']+/u', // 3) remove double $fallback_char's ], [ '', $fallback_char, $fallback_char, ], $str ); return \trim($str, $fallback_char); } /** * Converts a string into a URL-friendly slug. * * - This includes replacing non-ASCII characters with their closest ASCII equivalents, removing remaining * non-ASCII and non-alphanumeric characters, and replacing whitespace with $separator. * - The separator defaults to a single dash, and the string is also converted to lowercase. * - The language of the source string can also be supplied for language-specific transliteration. * * @param string $str

The string input.

* @param string $separator [optional]

The string used to replace whitespace.

* @param string $language [optional]

Language of the source string. * (default is 'en') | ASCII::*_LANGUAGE_CODE

* @param array $replacements [optional]

A map of replaceable strings.

* @param bool $replace_extra_symbols [optional]

Add some more replacements e.g. "£" with " * pound ".

* @param bool $use_str_to_lower [optional]

Use "string to lower" for the input.

* @param bool $use_transliterate [optional]

Use ASCII::to_transliterate() for unknown * chars.

* @psalm-pure * * @return string *

The URL-friendly slug.

* * @phpstan-param ASCII::*_LANGUAGE_CODE $language */ public static function to_slugify( string $str, string $separator = '-', string $language = self::ENGLISH_LANGUAGE_CODE, array $replacements = [], bool $replace_extra_symbols = false, bool $use_str_to_lower = true, bool $use_transliterate = false ): string { if ($str === '') { return ''; } foreach ($replacements as $from => $to) { $str = \str_replace($from, $to, $str); } $str = self::to_ascii( $str, $language, false, $replace_extra_symbols, $use_transliterate ); $str = \str_replace('@', $separator, $str); $str = (string) \preg_replace( '/[^a-zA-Z\\d\\s\\-_' . \preg_quote($separator, '/') . ']/', '', $str ); if ($use_str_to_lower) { $str = \strtolower($str); } $str = (string) \preg_replace('/^[\'\\s]+|[\'\\s]+$/', '', $str); $str = (string) \preg_replace('/\\B([A-Z])/', '-\1', $str); $str = (string) \preg_replace('/[\\-_\\s]+/', $separator, $str); $l = \strlen($separator); if ($l && \strpos($str, $separator) === 0) { $str = (string) \substr($str, $l); } if (\substr($str, -$l) === $separator) { $str = (string) \substr($str, 0, \strlen($str) - $l); } return $str; } /** * Returns an ASCII version of the string. A set of non-ASCII characters are * replaced with their closest ASCII counterparts, and the rest are removed * unless instructed otherwise. * * EXAMPLE: * ASCII::to_transliterate('déjà σσς iıii'); // 'deja sss iiii' * * * @param string $str

The input string.

* @param string|null $unknown [optional]

Character use if character unknown. (default is '?') * But you can also use NULL to keep the unknown chars.

* @param bool $strict [optional]

Use "transliterator_transliterate()" from PHP-Intl * * @psalm-pure * * @return string *

A String that contains only ASCII characters.

*/ public static function to_transliterate( string $str, $unknown = '?', bool $strict = false ): string { static $UTF8_TO_TRANSLIT = null; static $TRANSLITERATOR = null; static $SUPPORT_INTL = null; if ($str === '') { return ''; } if ($SUPPORT_INTL === null) { $SUPPORT_INTL = \extension_loaded('intl'); } // check if we only have ASCII, first (better performance) $str_tmp = $str; if (self::is_ascii($str)) { return $str; } $str = self::clean($str); // check again if we only have ASCII, now ... if ( $str_tmp !== $str && self::is_ascii($str) ) { return $str; } if ( $strict && $SUPPORT_INTL === true ) { if (!isset($TRANSLITERATOR)) { // INFO: see "*-Latin" rules via "transliterator_list_ids()" $TRANSLITERATOR = \transliterator_create('NFKC; [:Nonspacing Mark:] Remove; NFKC; Any-Latin; Latin-ASCII;'); } // INFO: https://unicode.org/cldr/utility/character.jsp $str_tmp = \transliterator_transliterate($TRANSLITERATOR, $str); if ($str_tmp !== false) { // check again if we only have ASCII, now ... if ( $str_tmp !== $str && self::is_ascii($str_tmp) ) { return $str_tmp; } $str = $str_tmp; } } if (self::$ORD === null) { self::$ORD = self::getData('ascii_ord'); } \preg_match_all('/.|[^\x00]$/us', $str, $array_tmp); $chars = $array_tmp[0]; $ord = null; $str_tmp = ''; foreach ($chars as &$c) { $ordC0 = self::$ORD[$c[0]]; if ($ordC0 >= 0 && $ordC0 <= 127) { $str_tmp .= $c; continue; } $ordC1 = self::$ORD[$c[1]]; // ASCII - next please if ($ordC0 >= 192 && $ordC0 <= 223) { $ord = ($ordC0 - 192) * 64 + ($ordC1 - 128); } if ($ordC0 >= 224) { $ordC2 = self::$ORD[$c[2]]; if ($ordC0 <= 239) { $ord = ($ordC0 - 224) * 4096 + ($ordC1 - 128) * 64 + ($ordC2 - 128); } if ($ordC0 >= 240) { $ordC3 = self::$ORD[$c[3]]; if ($ordC0 <= 247) { $ord = ($ordC0 - 240) * 262144 + ($ordC1 - 128) * 4096 + ($ordC2 - 128) * 64 + ($ordC3 - 128); } // We only process valid UTF-8 chars (<= 4 byte), so we don't need this code here ... /* if ($ordC0 >= 248) { $ordC4 = self::$ORD[$c[4]]; if ($ordC0 <= 251) { $ord = ($ordC0 - 248) * 16777216 + ($ordC1 - 128) * 262144 + ($ordC2 - 128) * 4096 + ($ordC3 - 128) * 64 + ($ordC4 - 128); } if ($ordC0 >= 252) { $ordC5 = self::$ORD[$c[5]]; if ($ordC0 <= 253) { $ord = ($ordC0 - 252) * 1073741824 + ($ordC1 - 128) * 16777216 + ($ordC2 - 128) * 262144 + ($ordC3 - 128) * 4096 + ($ordC4 - 128) * 64 + ($ordC5 - 128); } } } */ } } if ( $ordC0 === 254 || $ordC0 === 255 || $ord === null ) { $str_tmp .= $unknown ?? $c; continue; } $bank = $ord >> 8; if (!isset($UTF8_TO_TRANSLIT[$bank])) { $UTF8_TO_TRANSLIT[$bank] = self::getDataIfExists(\sprintf('x%03x', $bank)); } $new_char = $ord & 255; if (isset($UTF8_TO_TRANSLIT[$bank][$new_char])) { // keep for debugging /* echo "file: " . sprintf('x%02x', $bank) . "\n"; echo "char: " . $c . "\n"; echo "ord: " . $ord . "\n"; echo "new_char: " . $new_char . "\n"; echo "new_char: " . mb_chr($new_char) . "\n"; echo "ascii: " . $UTF8_TO_TRANSLIT[$bank][$new_char] . "\n"; echo "bank:" . $bank . "\n\n"; */ $new_char = $UTF8_TO_TRANSLIT[$bank][$new_char]; /* @noinspection PhpStatementHasEmptyBodyInspection */ if ($unknown === null && $new_char === '') { // nothing } elseif ( $new_char === '[?]' || $new_char === '[?] ' ) { $c = $unknown ?? $c; } else { $c = $new_char; } } else { // keep for debugging missing chars /* echo "file: " . sprintf('x%02x', $bank) . "\n"; echo "char: " . $c . "\n"; echo "ord: " . $ord . "\n"; echo "new_char: " . $new_char . "\n"; echo "new_char: " . mb_chr($new_char) . "\n"; echo "bank:" . $bank . "\n\n"; */ $c = $unknown ?? $c; } $str_tmp .= $c; } return $str_tmp; } /** * WARNING: This method will return broken characters and is only for special cases. * * Convert a UTF-8 encoded string to a single-byte string suitable for * functions that need the same string length after the conversion. * * The function simply uses (and updates) a tailored dynamic encoding * (in/out map parameter) where non-ascii characters are remapped to * the range [128-255] in order of appearance. * * Thus, it supports up to 128 different multibyte code points max over * the whole set of strings sharing this encoding. * * Source: https://github.com/KEINOS/mb_levenshtein * * @param string $str

UTF-8 string to be converted to extended ASCII.

* @param array $map

Internal-Map of code points to ASCII characters.

* * @return string *

Mapped broken string.

* * @phpstan-param array $map */ private static function to_ascii_remap_intern(string $str, array &$map): string { // find all utf-8 characters $matches = []; if (!\preg_match_all('/[\xC0-\xF7][\x80-\xBF]+/', $str, $matches)) { return $str; // plain ascii string } // update the encoding map with the characters not already met $mapCount = \count($map); foreach ($matches[0] as $mbc) { if (!isset($map[$mbc])) { $map[$mbc] = \chr(128 + $mapCount); ++$mapCount; } } // finally, remap non-ascii characters return \strtr($str, $map); } /** * Get the language from a string. * * e.g.: de_at -> de_at * de_DE -> de * DE_DE -> de * de-de -> de * * @return string */ private static function get_language(string $language) { if ($language === '') { return ''; } if ( \strpos($language, '_') === false && \strpos($language, '-') === false ) { return \strtolower($language); } $language = \str_replace('-', '_', \strtolower($language)); $regex = '/(?[a-z]+)_\g{first}/'; return (string) \preg_replace($regex, '$1', $language); } /** * Get data from "/data/*.php". * * @return array */ private static function getData(string $file) { return include __DIR__ . '/data/' . $file . '.php'; } /** * Get data from "/data/*.php". * * @return array */ private static function getDataIfExists(string $file): array { $file = __DIR__ . '/data/' . $file . '.php'; if (\is_file($file)) { return include $file; } return []; } /** * @return void */ private static function prepareAsciiAndExtrasMaps() { if (self::$ASCII_MAPS_AND_EXTRAS === null) { self::prepareAsciiMaps(); self::prepareAsciiExtras(); self::$ASCII_MAPS_AND_EXTRAS = \array_merge_recursive( self::$ASCII_MAPS ?? [], self::$ASCII_EXTRAS ?? [] ); } } /** * @return void */ private static function prepareAsciiMaps() { if (self::$ASCII_MAPS === null) { self::$ASCII_MAPS = self::getData('ascii_by_languages'); } } /** * @return void */ private static function prepareAsciiExtras() { if (self::$ASCII_EXTRAS === null) { self::$ASCII_EXTRAS = self::getData('ascii_extras_by_languages'); } } } PK,Z&''portable-ascii/.deepsource.tomlnuW+Aversion = 1 [[analyzers]] name = "php"PK,Z-D""portable-ascii/LICENSE.txtnuW+ACopyright (C) 2019 Lars Moelleken Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions: The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. PK,ZtlGlGportable-ascii/README.mdnuW+A[//]: # (AUTO-GENERATED BY "PHP README Helper": base file -> docs/base.md) [![SWUbanner](https://raw.githubusercontent.com/vshymanskyy/StandWithUkraine/main/banner2-direct.svg)](https://github.com/vshymanskyy/StandWithUkraine/blob/main/docs/README.md) [![Build Status](https://github.com/voku/portable-ascii/actions/workflows/ci.yml/badge.svg?branch=master)](https://github.com/voku/portable-ascii/actions) [![Build status](https://ci.appveyor.com/api/projects/status/gnejjnk7qplr7f5t/branch/master?svg=true)](https://ci.appveyor.com/project/voku/portable-ascii/branch/master) [![codecov.io](https://codecov.io/github/voku/portable-ascii/coverage.svg?branch=master)](https://codecov.io/github/voku/portable-ascii?branch=master) [![Codacy Badge](https://api.codacy.com/project/badge/Grade/997c9bb10d1c4791967bdf2e42013e8e)](https://www.codacy.com/app/voku/portable-ascii) [![Latest Stable Version](https://poser.pugx.org/voku/portable-ascii/v/stable)](https://packagist.org/packages/voku/portable-ascii) [![Total Downloads](https://poser.pugx.org/voku/portable-ascii/downloads)](https://packagist.org/packages/voku/portable-ascii) [![License](https://poser.pugx.org/voku/portable-ascii/license)](https://packagist.org/packages/voku/portable-ascii) [![Donate to this project using Paypal](https://img.shields.io/badge/paypal-donate-yellow.svg)](https://www.paypal.me/moelleken) [![Donate to this project using Patreon](https://img.shields.io/badge/patreon-donate-yellow.svg)](https://www.patreon.com/voku) # 🔡 Portable ASCII ## Description It is written in PHP (PHP 7+) and can work without "mbstring", "iconv" or any other extra encoding php-extension on your server. The benefit of Portable ASCII is that it is easy to use, easy to bundle. The project based on ... + Sean M. Burke's work (https://metacpan.org/pod/Text::Unidecode) + Tomaz Solc's work (https://pypi.org/project/Unidecode/) + Portable UTF-8 work (https://github.com/voku/portable-utf8) + Daniel St. Jules's work (https://github.com/danielstjules/Stringy) + Johnny Broadway's work (https://github.com/jbroadway/urlify) + and many cherry-picks from "github"-gists and "Stack Overflow"-snippets ... ## Index * [Alternative](#alternative) * [Install](#install-portable-ascii-via-composer-require) * [Why Portable ASCII?](#why-portable-ascii) * [Requirements and Recommendations](#requirements-and-recommendations) * [Usage](#usage) * [Class methods](#class-methods) * [Unit Test](#unit-test) * [License and Copyright](#license-and-copyright) ## Alternative If you like a more Object Oriented Way to edit strings, then you can take a look at [voku/Stringy](https://github.com/voku/Stringy), it's a fork of "danielstjules/Stringy" but it used the "Portable ASCII"-Class and some extra methods. ```php // Portable ASCII use voku\helper\ASCII; ASCII::to_transliterate('déjà σσς iıii'); // 'deja sss iiii' // voku/Stringy use Stringy\Stringy as S; $stringy = S::create('déjà σσς iıii'); $stringy->toTransliterate(); // 'deja sss iiii' ``` ## Install "Portable ASCII" via "composer require" ```shell composer require voku/portable-ascii ``` ## Why Portable ASCII?[]() I need ASCII char handling in different classes and before I added this functions into "Portable UTF-8", but this repo is more modular and portable, because it has no dependencies. ## Requirements and Recommendations * No extensions are required to run this library. Portable ASCII only needs PCRE library that is available by default since PHP 4.2.0 and cannot be disabled since PHP 5.3.0. "\u" modifier support in PCRE for ASCII handling is not a must. * PHP 7.0 is the minimum requirement * PHP 8.0 is also supported ## Usage Example: ASCII::to_ascii() ```php echo ASCII::to_ascii('�Düsseldorf�', 'de'); // will output // Duesseldorf echo ASCII::to_ascii('�Düsseldorf�', 'en'); // will output // Dusseldorf ``` # Portable ASCII | API The API from the "ASCII"-Class is written as small static methods. ## Class methods

charsArray charsArrayWithMultiLanguageValues charsArrayWithOneLanguage charsArrayWithSingleLanguageValues
clean getAllLanguages is_ascii normalize_msword
normalize_whitespace remove_invisible_characters to_ascii to_ascii_remap
to_filename to_slugify to_transliterate
#### charsArray(bool $replace_extra_symbols): array Returns an replacement array for ASCII methods. EXAMPLE: $array = ASCII::charsArray(); var_dump($array['ru']['б']); // 'b' **Parameters:** - `bool $replace_extra_symbols [optional]

Add some more replacements e.g. "£" with " pound ".

` **Return:** - `array` -------- #### charsArrayWithMultiLanguageValues(bool $replace_extra_symbols): array Returns an replacement array for ASCII methods with a mix of multiple languages. EXAMPLE: $array = ASCII::charsArrayWithMultiLanguageValues(); var_dump($array['b']); // ['β', 'б', 'ဗ', 'ბ', 'ب'] **Parameters:** - `bool $replace_extra_symbols [optional]

Add some more replacements e.g. "£" with " pound ".

` **Return:** - `array

An array of replacements.

` -------- #### charsArrayWithOneLanguage(string $language, bool $replace_extra_symbols, bool $asOrigReplaceArray): array Returns an replacement array for ASCII methods with one language. For example, German will map 'ä' to 'ae', while other languages will simply return e.g. 'a'. EXAMPLE: $array = ASCII::charsArrayWithOneLanguage('ru'); $tmpKey = \array_search('yo', $array['replace']); echo $array['orig'][$tmpKey]; // 'ё' **Parameters:** - `ASCII::* $language [optional]

Language of the source string e.g.: en, de_at, or de-ch. (default is 'en') | ASCII::*_LANGUAGE_CODE

` - `bool $replace_extra_symbols [optional]

Add some more replacements e.g. "£" with " pound ".

` - `bool $asOrigReplaceArray [optional]

TRUE === return {orig: string[], replace: string[]} array

` **Return:** - `array

An array of replacements.

` -------- #### charsArrayWithSingleLanguageValues(bool $replace_extra_symbols, bool $asOrigReplaceArray): array Returns an replacement array for ASCII methods with multiple languages. EXAMPLE: $array = ASCII::charsArrayWithSingleLanguageValues(); $tmpKey = \array_search('hnaik', $array['replace']); echo $array['orig'][$tmpKey]; // '၌' **Parameters:** - `bool $replace_extra_symbols [optional]

Add some more replacements e.g. "£" with " pound ".

` - `bool $asOrigReplaceArray [optional]

TRUE === return {orig: string[], replace: string[]} array

` **Return:** - `array

An array of replacements.

` -------- #### clean(string $str, bool $normalize_whitespace, bool $keep_non_breaking_space, bool $normalize_msword, bool $remove_invisible_characters): string Accepts a string and removes all non-UTF-8 characters from it + extras if needed. **Parameters:** - `string $str

The string to be sanitized.

` - `bool $normalize_whitespace [optional]

Set to true, if you need to normalize the whitespace.

` - `bool $keep_non_breaking_space [optional]

Set to true, to keep non-breaking-spaces, in combination with $normalize_whitespace

` - `bool $normalize_msword [optional]

Set to true, if you need to normalize MS Word chars e.g.: "…" => "..."

` - `bool $remove_invisible_characters [optional]

Set to false, if you not want to remove invisible characters e.g.: "\0"

` **Return:** - `string

A clean UTF-8 string.

` -------- #### getAllLanguages(): string[] Get all languages from the constants "ASCII::.*LANGUAGE_CODE". **Parameters:** __nothing__ **Return:** - `string[]` -------- #### is_ascii(string $str): bool Checks if a string is 7 bit ASCII. EXAMPLE: ASCII::is_ascii('白'); // false **Parameters:** - `string $str

The string to check.

` **Return:** - `bool

true if it is ASCII
false otherwise

` -------- #### normalize_msword(string $str): string Returns a string with smart quotes, ellipsis characters, and dashes from Windows-1252 (commonly used in Word documents) replaced by their ASCII equivalents. EXAMPLE: ASCII::normalize_msword('„Abcdef…”'); // '"Abcdef..."' **Parameters:** - `string $str

The string to be normalized.

` **Return:** - `string

A string with normalized characters for commonly used chars in Word documents.

` -------- #### normalize_whitespace(string $str, bool $keepNonBreakingSpace, bool $keepBidiUnicodeControls, bool $normalize_control_characters): string Normalize the whitespace. EXAMPLE: ASCII::normalize_whitespace("abc-\xc2\xa0-öäü-\xe2\x80\xaf-\xE2\x80\xAC", true); // "abc-\xc2\xa0-öäü- -" **Parameters:** - `string $str

The string to be normalized.

` - `bool $keepNonBreakingSpace [optional]

Set to true, to keep non-breaking-spaces.

` - `bool $keepBidiUnicodeControls [optional]

Set to true, to keep non-printable (for the web) bidirectional text chars.

` - `bool $normalize_control_characters [optional]

Set to true, to convert e.g. LINE-, PARAGRAPH-SEPARATOR with "\n" and LINE TABULATION with "\t".

` **Return:** - `string

A string with normalized whitespace.

` -------- #### remove_invisible_characters(string $str, bool $url_encoded, string $replacement, bool $keep_basic_control_characters): string Remove invisible characters from a string. e.g.: This prevents sandwiching null characters between ascii characters, like Java\0script. copy&past from https://github.com/bcit-ci/CodeIgniter/blob/develop/system/core/Common.php **Parameters:** - `string $str` - `bool $url_encoded` - `string $replacement` - `bool $keep_basic_control_characters` **Return:** - `string` -------- #### to_ascii(string $str, string $language, bool $remove_unsupported_chars, bool $replace_extra_symbols, bool $use_transliterate, bool|null $replace_single_chars_only): string Returns an ASCII version of the string. A set of non-ASCII characters are replaced with their closest ASCII counterparts, and the rest are removed by default. The language or locale of the source string can be supplied for language-specific transliteration in any of the following formats: en, en_GB, or en-GB. For example, passing "de" results in "äöü" mapping to "aeoeue" rather than "aou" as in other languages. EXAMPLE: ASCII::to_ascii('�Düsseldorf�', 'en'); // Dusseldorf **Parameters:** - `string $str

The input string.

` - `ASCII::* $language [optional]

Language of the source string. (default is 'en') | ASCII::*_LANGUAGE_CODE

` - `bool $remove_unsupported_chars [optional]

Whether or not to remove the unsupported characters.

` - `bool $replace_extra_symbols [optional]

Add some more replacements e.g. "£" with " pound ".

` - `bool $use_transliterate [optional]

Use ASCII::to_transliterate() for unknown chars.

` - `bool|null $replace_single_chars_only [optional]

Single char replacement is better for the performance, but some languages need to replace more then one char at the same time. | NULL === auto-setting, depended on the language

` **Return:** - `string

A string that contains only ASCII characters.

` -------- #### to_ascii_remap(string $str1, string $str2): string[] WARNING: This method will return broken characters and is only for special cases. Convert two UTF-8 encoded string to a single-byte strings suitable for functions that need the same string length after the conversion. The function simply uses (and updates) a tailored dynamic encoding (in/out map parameter) where non-ascii characters are remapped to the range [128-255] in order of appearance. **Parameters:** - `string $str1` - `string $str2` **Return:** - `string[]` -------- #### to_filename(string $str, bool $use_transliterate, string $fallback_char): string Convert given string to safe filename (and keep string case). EXAMPLE: ASCII::to_filename('שדגשדג.png', true)); // 'shdgshdg.png' **Parameters:** - `string $str` - `bool $use_transliterate

ASCII::to_transliterate() is used by default - unsafe characters are simply replaced with hyphen otherwise.

` - `string $fallback_char` **Return:** - `string

A string that contains only safe characters for a filename.

` -------- #### to_slugify(string $str, string $separator, string $language, string[] $replacements, bool $replace_extra_symbols, bool $use_str_to_lower, bool $use_transliterate): string Converts the string into an URL slug. This includes replacing non-ASCII characters with their closest ASCII equivalents, removing remaining non-ASCII and non-alphanumeric characters, and replacing whitespace with $separator. The separator defaults to a single dash, and the string is also converted to lowercase. The language of the source string can also be supplied for language-specific transliteration. **Parameters:** - `string $str` - `string $separator [optional]

The string used to replace whitespace.

` - `ASCII::* $language [optional]

Language of the source string. (default is 'en') | ASCII::*_LANGUAGE_CODE

` - `array $replacements [optional]

A map of replaceable strings.

` - `bool $replace_extra_symbols [optional]

Add some more replacements e.g. "£" with " pound ".

` - `bool $use_str_to_lower [optional]

Use "string to lower" for the input.

` - `bool $use_transliterate [optional]

Use ASCII::to_transliterate() for unknown chars.

` **Return:** - `string

A string that has been converted to an URL slug.

` -------- #### to_transliterate(string $str, string|null $unknown, bool $strict): string Returns an ASCII version of the string. A set of non-ASCII characters are replaced with their closest ASCII counterparts, and the rest are removed unless instructed otherwise. EXAMPLE: ASCII::to_transliterate('déjà σσς iıii'); // 'deja sss iiii' **Parameters:** - `string $str

The input string.

` - `string|null $unknown [optional]

Character use if character unknown. (default is '?') But you can also use NULL to keep the unknown chars.

` - `bool $strict [optional]

Use "transliterator_transliterate()" from PHP-Intl` **Return:** - `string

A String that contains only ASCII characters.

` -------- ## Unit Test 1) [Composer](https://getcomposer.org) is a prerequisite for running the tests. ``` composer install ``` 2) The tests can be executed by running this command from the root directory: ```bash ./vendor/bin/phpunit ``` ### Support For support and donations please visit [Github](https://github.com/voku/portable-ascii/) | [Issues](https://github.com/voku/portable-ascii/issues) | [PayPal](https://paypal.me/moelleken) | [Patreon](https://www.patreon.com/voku). For status updates and release announcements please visit [Releases](https://github.com/voku/portable-ascii/releases) | [Twitter](https://twitter.com/suckup_de) | [Patreon](https://www.patreon.com/voku/posts). For professional support please contact [me](https://about.me/voku). ### Thanks - Thanks to [GitHub](https://github.com) (Microsoft) for hosting the code and a good infrastructure including Issues-Managment, etc. - Thanks to [IntelliJ](https://www.jetbrains.com) as they make the best IDEs for PHP and they gave me an open source license for PhpStorm! - Thanks to [Travis CI](https://travis-ci.com/) for being the most awesome, easiest continous integration tool out there! - Thanks to [StyleCI](https://styleci.io/) for the simple but powerful code style check. - Thanks to [PHPStan](https://github.com/phpstan/phpstan) && [Psalm](https://github.com/vimeo/psalm) for really great Static analysis tools and for discover bugs in the code! ### License and Copyright Released under the MIT License - see `LICENSE.txt` for details. PK,Z-M]]portable-ascii/composer.jsonnuW+A{ "name": "voku/portable-ascii", "description": "Portable ASCII library - performance optimized (ascii) string functions for php.", "type": "library", "keywords": [ "clean", "php", "ascii" ], "homepage": "https://github.com/voku/portable-ascii", "license": "MIT", "authors": [ { "name": "Lars Moelleken", "homepage": "https://www.moelleken.org/" } ], "require": { "php": ">=7.0.0" }, "require-dev": { "phpunit/phpunit": "~6.0 || ~7.0 || ~9.0" }, "suggest": { "ext-intl": "Use Intl for transliterator_transliterate() support" }, "autoload": { "psr-4": { "voku\\": "src/voku/" } }, "autoload-dev": { "psr-4": { "voku\\tests\\": "tests/" } } } PKZ +8 helper/data/x0ca.phpnuW+APKZ}~ helper/data/x0fc.phpnuW+APKZoKnee*helper/data/x0d3.phpnuW+APKZU9helper/data/x004.phpnuW+APKZA*Sܓ helper/data/x032.phpnuW+APKZ7{M$helper/data/x0ff.phpnuW+APKZ4??*helper/data/x002.phpnuW+APKZ˛=0helper/data/x08c.phpnuW+APKZ[~8helper/data/x05c.phpnuW+APKZoa@helper/data/x024.phpnuW+APKZDG77Ghelper/data/x08e.phpnuW+APKZ|_7{Ohelper/data/x079.phpnuW+APKZ#Whelper/data/x0ba.phpnuW+APKZg33`helper/data/x091.phpnuW+APKZRq**ihelper/data/x04e.phpnuW+APKZQ  qhelper/data/x085.phpnuW+APKZ2m[6yhelper/data/x04d.phpnuW+APKZ`helper/data/x0c6.phpnuW+APKZ 'helper/data/x09d.phpnuW+APKZk;;helper/data/x07c.phpnuW+APKZUkhelper/data/x09a.phpnuW+APKZ 899&helper/data/ascii_language_max_key.phpnuW+APKZ(O3helper/data/x022.phpnuW+APKZž,77helper/data/x072.phpnuW+APKZ]p  :helper/data/x053.phpnuW+APKZaA\\helper/data/x074.phpnuW+APKZ9jj*helper/data/x0c2.phpnuW+APKZw$QQhelper/data/x051.phpnuW+APKZmhelper/data/x062.phpnuW+APKZ//helper/data/x06d.phpnuW+APKZ&4helper/data/x02f.phpnuW+APKZ7333bhelper/data/x064.phpnuW+APKZ.,helper/data/x057.phpnuW+APKZr;*8helper/data/x0d4.phpnuW+APKZhelper/data/x01e.phpnuW+APKZOU++lhelper/data/x08a.phpnuW+APKZ~::helper/data/x016.phpnuW+APKZޕ"  Y#helper/data/x0ae.phpnuW+APKZwTFff,helper/data/x0d0.phpnuW+APKZtLV5helper/data/x013.phpnuW+APKZ:`,ss?<helper/data/x000.phpnuW+APKZLLDhelper/data/x0b2.phpnuW+APKZ80YYMhelper/data/x070.phpnuW+APKZE@LL#Vhelper/data/x0d5.phpnuW+APKZc44^helper/data/x063.phpnuW+APKZ4..+ghelper/data/x06f.phpnuW+APKZF2Q  ohelper/data/x086.phpnuW+APKZB NNwhelper/data/x07e.phpnuW+APKZ955}helper/data/x011.phpnuW+APKZ89((helper/data/x007.phpnuW+APKZ ~fIbhelper/data/x0f9.phpnuW+APKZ5SCPPhelper/data/x0a0.phpnuW+APKZ__/helper/data/x0bd.phpnuW+APKZ^W,,helper/data/x092.phpnuW+APKZy]helper/data/x020.phpnuW+APKZ)D6""nhelper/data/x065.phpnuW+APKZ?Լhelper/data/x01d.phpnuW+APKZ GGhelper/data/x077.phpnuW+APKZEC  &helper/data/x056.phpnuW+APKZQ33uhelper/data/x09b.phpnuW+APKZt͟ helper/data/x0c8.phpnuW+APKZkFihelper/data/x015.phpnuW+APKZ_&0AAhelper/data/x07a.phpnuW+APKZHrBtghelper/data/x021.phpnuW+APKZmUUehelper/data/x0fd.phpnuW+APKZ::helper/data/x061.phpnuW+APKZBAA|helper/data/x1d7.phpnuW+APKZ E{877pShelper/data/x001.phpnuW+APKZ?SIIXhelper/data/x066.phpnuW+APKZY**xahelper/data/x073.phpnuW+APKZEDDihelper/data/x0fa.phpnuW+APKZnqhelper/data/x096.phpnuW+APKZ8;yhelper/data/x0d6.phpnuW+APKZ0,,helper/data/x078.phpnuW+APKZOAA helper/data/x07b.phpnuW+APKZR]helper/data/x0c1.phpnuW+APKZMUqhhwhelper/data/x0ce.phpnuW+APKZUb'#helper/data/x055.phpnuW+APKZzDPJJbhelper/data/x07d.phpnuW+APKZMGPFFhelper/data/x06a.phpnuW+APKZG  zhelper/data/x09e.phpnuW+APKZhelper/data/x02a.phpnuW+APKZ helper/data/x054.phpnuW+APKZ6w Ohelper/data/x0af.phpnuW+APKZBB+helper/data/x05d.phpnuW+APKZK==helper/data/x02e.phpnuW+APKZNG2helper/data/x067.phpnuW+APKZE77helper/data/x09c.phpnuW+APKZhKfFFhelper/data/x068.phpnuW+APKZId helper/data/x0cb.phpnuW+APKZ4xxvhelper/data/x0d2.phpnuW+APKZGH2helper/data/x0be.phpnuW+APKZEQ~k"helper/data/x0d1.phpnuW+APKZ @R+helper/data/x0c7.phpnuW+APKZ}XCCn3helper/data/x095.phpnuW+APKZ0  ;helper/data/x05a.phpnuW+APKZ]znnYDhelper/data/x0b8.phpnuW+APKZ)'@  Mhelper/data/x028.phpnuW+APKZ>+ll Whelper/data/x017.phpnuW+APKZs+))]helper/data/x088.phpnuW+APKZARŽ=fhelper/data/x0b1.phpnuW+APKZGohelper/data/x0fe.phpnuW+APKZl''Hthelper/data/x083.phpnuW+APKZ|helper/data/x099.phpnuW+APKZ'$$helper/data/x06e.phpnuW+APKZw))xhelper/data/x098.phpnuW+APKZD helper/data/x1d5.phpnuW+APKZ2xlvvhelper/data/x0c9.phpnuW+APKZǗέhhelper/data/x0a3.phpnuW+APKZz>JJYhelper/data/x058.phpnuW+APKZkhelper/data/x089.phpnuW+APKZ@ZEEChelper/data/x069.phpnuW+APKZ7GGhelper/data/x075.phpnuW+APKZi/Whelper/data/x0b7.phpnuW+APKZK's s helper/data/x0c3.phpnuW+APKZ3@@7helper/data/x05b.phpnuW+APKZXgghelper/data/x0bc.phpnuW+APKZUg//fhelper/data/x080.phpnuW+APKZddhelper/data/x0b9.phpnuW+APKZhelper/data/x010.phpnuW+APKZtyy helper/data/x0a1.phpnuW+APKZm%\helper/data/x033.phpnuW+APKZ--helper/data/x087.phpnuW+APKZ7zOii"4"helper/data/ascii_by_languages.phpnuW+APKZ:~=L*helper/data/x006.phpnuW+APKZ!>0helper/data/x0cc.phpnuW+APKZab889helper/data/x05f.phpnuW+APKZJH99Bhelper/data/x094.phpnuW+APKZeffJhelper/data/x1d4.phpnuW+APKZ 6Phelper/data/x0c4.phpnuW+APKZ@MZhelper/data/x0b3.phpnuW+APKZ=1bhelper/data/x026.phpnuW+APKZңhhelper/data/x0d7.phpnuW+APKZp)22qhelper/data/x00b.phpnuW+APKZ ~~whelper/data/x0bb.phpnuW+APKZޑ7MMJhelper/data/x1f1.phpnuW+APKZ)ٛۃhelper/data/x0a2.phpnuW+APKZh>>helper/data/x093.phpnuW+APKZԱz  <helper/data/x00e.phpnuW+APKZI**helper/data/x084.phpnuW+APKZhelper/data/x009.phpnuW+APKZF_5helper/data/ascii_ord.phpnuW+APKZcPP(helper/data/x01f.phpnuW+APKZ_c^Hhelper/data/x00f.phpnuW+APKZx ##helper/data/x076.phpnuW+APKZ:l_Rhelper/data/x1d6.phpnuW+APKZ+'' helper/data/x097.phpnuW+APKZIhelper/data/x029.phpnuW+APKZP@@helper/data/x05e.phpnuW+APKZ+Lahelper/data/x00c.phpnuW+APKZHhelper/data/x027.phpnuW+APKZhelper/data/x0b4.phpnuW+APKZ//helper/data/x08f.phpnuW+APKZ1; ; 'helper/data/x0b5.phpnuW+APKZ-  helper/data/x014.phpnuW+APKZvKq1helper/data/x0c5.phpnuW+APKZ3$z]helper/data/x0cd.phpnuW+APKZn%helper/data/x04f.phpnuW+APKZK-helper/data/x012.phpnuW+APKZWa5helper/ASCII.phpnuW+APK,Zh8portable-ascii/CHANGELOG.mdnuW+APK,Z +8 ,portable-ascii/src/voku/helper/data/x0ca.phpnuW+APK,Z}~,portable-ascii/src/voku/helper/data/x0fc.phpnuW+APK,ZoKnee,r!portable-ascii/src/voku/helper/data/x0d3.phpnuW+APK,ZU9,3*portable-ascii/src/voku/helper/data/x004.phpnuW+APK,ZA*Sܓ,0portable-ascii/src/voku/helper/data/x032.phpnuW+APK,Z7{M,s8portable-ascii/src/voku/helper/data/x0ff.phpnuW+APK,Z4??,b>portable-ascii/src/voku/helper/data/x002.phpnuW+APK,Z˛,Cportable-ascii/src/voku/helper/data/x08c.phpnuW+APK,Z[~,sLportable-ascii/src/voku/helper/data/x05c.phpnuW+APK,Zoa,Tportable-ascii/src/voku/helper/data/x024.phpnuW+APK,ZDG77,[portable-ascii/src/voku/helper/data/x08e.phpnuW+APK,Z|_7,cportable-ascii/src/voku/helper/data/x079.phpnuW+APK,Z#,kportable-ascii/src/voku/helper/data/x0ba.phpnuW+APK,Zg33,tportable-ascii/src/voku/helper/data/x091.phpnuW+APK,ZRq**,}portable-ascii/src/voku/helper/data/x04e.phpnuW+APK,ZQ  ,portable-ascii/src/voku/helper/data/x085.phpnuW+APK,Z2m[6,portable-ascii/src/voku/helper/data/x04d.phpnuW+APK,Z`,portable-ascii/src/voku/helper/data/x0c6.phpnuW+APK,Z ',portable-ascii/src/voku/helper/data/x09d.phpnuW+APK,Zk;;,portable-ascii/src/voku/helper/data/x07c.phpnuW+APK,ZUk,portable-ascii/src/voku/helper/data/x09a.phpnuW+APK,Z 899>portable-ascii/src/voku/helper/data/ascii_language_max_key.phpnuW+APK,Z(O3,portable-ascii/src/voku/helper/data/x022.phpnuW+APK,Zž,77,portable-ascii/src/voku/helper/data/x072.phpnuW+APK,Z]p  ,portable-ascii/src/voku/helper/data/x053.phpnuW+APK,ZaA\\,portable-ascii/src/voku/helper/data/x074.phpnuW+APK,Z9jj,portable-ascii/src/voku/helper/data/x0c2.phpnuW+APK,Zw$QQ,xportable-ascii/src/voku/helper/data/x051.phpnuW+APK,Z,%portable-ascii/src/voku/helper/data/x062.phpnuW+APK,Z//,portable-ascii/src/voku/helper/data/x06d.phpnuW+APK,Z&, portable-ascii/src/voku/helper/data/x02f.phpnuW+APK,Z7333,b portable-ascii/src/voku/helper/data/x064.phpnuW+APK,Z.,, portable-ascii/src/voku/helper/data/x057.phpnuW+APK,Zr;*,h portable-ascii/src/voku/helper/data/x0d4.phpnuW+APK,Z,^% portable-ascii/src/voku/helper/data/x01e.phpnuW+APK,ZOU++,* portable-ascii/src/voku/helper/data/x08a.phpnuW+APK,Z~::,S3 portable-ascii/src/voku/helper/data/x016.phpnuW+APK,Zޕ"  ,9 portable-ascii/src/voku/helper/data/x0ae.phpnuW+APK,ZwTFff,TC portable-ascii/src/voku/helper/data/x0d0.phpnuW+APK,ZtL,L portable-ascii/src/voku/helper/data/x013.phpnuW+APK,Z:`,ss,S portable-ascii/src/voku/helper/data/x000.phpnuW+APK,ZLL,[ portable-ascii/src/voku/helper/data/x0b2.phpnuW+APK,Z80YY,d portable-ascii/src/voku/helper/data/x070.phpnuW+APK,ZE@LL,Cm portable-ascii/src/voku/helper/data/x0d5.phpnuW+APK,Zc44,u portable-ascii/src/voku/helper/data/x063.phpnuW+APK,Z4..,{~ portable-ascii/src/voku/helper/data/x06f.phpnuW+APK,ZF2Q  , portable-ascii/src/voku/helper/data/x086.phpnuW+APK,ZB NN,k portable-ascii/src/voku/helper/data/x07e.phpnuW+APK,Z955, portable-ascii/src/voku/helper/data/x011.phpnuW+APK,Z89((, portable-ascii/src/voku/helper/data/x007.phpnuW+APK,Z ~fI,* portable-ascii/src/voku/helper/data/x0f9.phpnuW+APK,Z5SCPP,a portable-ascii/src/voku/helper/data/x0a0.phpnuW+APK,Z__/, portable-ascii/src/voku/helper/data/x0bd.phpnuW+APK,Z^W,,, portable-ascii/src/voku/helper/data/x092.phpnuW+APK,Zy, portable-ascii/src/voku/helper/data/x020.phpnuW+APK,Z)D6"", portable-ascii/src/voku/helper/data/x065.phpnuW+APK,Z?,, portable-ascii/src/voku/helper/data/x01d.phpnuW+APK,Z GG, portable-ascii/src/voku/helper/data/x077.phpnuW+APK,ZEC  , portable-ascii/src/voku/helper/data/x056.phpnuW+APK,ZQ33, portable-ascii/src/voku/helper/data/x09b.phpnuW+APK,Zt͟ , portable-ascii/src/voku/helper/data/x0c8.phpnuW+APK,ZkFi, portable-ascii/src/voku/helper/data/x015.phpnuW+APK,Z_&0AA, portable-ascii/src/voku/helper/data/x07a.phpnuW+APK,ZHrBt,g portable-ascii/src/voku/helper/data/x021.phpnuW+APK,ZmUU,} portable-ascii/src/voku/helper/data/x0fd.phpnuW+APK,Z::,. portable-ascii/src/voku/helper/data/x061.phpnuW+APK,ZBAA, portable-ascii/src/voku/helper/data/x1d7.phpnuW+APK,Z E{877,p portable-ascii/src/voku/helper/data/x001.phpnuW+APK,Z?SII,u portable-ascii/src/voku/helper/data/x066.phpnuW+APK,ZY**,8~ portable-ascii/src/voku/helper/data/x073.phpnuW+APK,ZEDD, portable-ascii/src/voku/helper/data/x0fa.phpnuW+APK,Z,^ portable-ascii/src/voku/helper/data/x096.phpnuW+APK,Z8;, portable-ascii/src/voku/helper/data/x0d6.phpnuW+APK,Z0,,, portable-ascii/src/voku/helper/data/x078.phpnuW+APK,ZOAA,E portable-ascii/src/voku/helper/data/x07b.phpnuW+APK,ZR], portable-ascii/src/voku/helper/data/x0c1.phpnuW+APK,ZMUqhh,߹ portable-ascii/src/voku/helper/data/x0ce.phpnuW+APK,ZUb', portable-ascii/src/voku/helper/data/x055.phpnuW+APK,ZzDPJJ, portable-ascii/src/voku/helper/data/x07d.phpnuW+APK,ZMGPFF, portable-ascii/src/voku/helper/data/x06a.phpnuW+APK,ZG  ,B portable-ascii/src/voku/helper/data/x09e.phpnuW+APK,Z, portable-ascii/src/voku/helper/data/x02a.phpnuW+APK,Z, portable-ascii/src/voku/helper/data/x054.phpnuW+APK,Z6w ,_ portable-ascii/src/voku/helper/data/x0af.phpnuW+APK,ZBB,S portable-ascii/src/voku/helper/data/x05d.phpnuW+APK,ZK==, portable-ascii/src/voku/helper/data/x02e.phpnuW+APK,ZNG, portable-ascii/src/voku/helper/data/x067.phpnuW+APK,ZE77, portable-ascii/src/voku/helper/data/x09c.phpnuW+APK,ZhKfFF, portable-ascii/src/voku/helper/data/x068.phpnuW+APK,ZId ,:% portable-ascii/src/voku/helper/data/x0cb.phpnuW+APK,Z4xx,./ portable-ascii/src/voku/helper/data/x0d2.phpnuW+APK,ZGH,8 portable-ascii/src/voku/helper/data/x0be.phpnuW+APK,ZEQ~,SA portable-ascii/src/voku/helper/data/x0d1.phpnuW+APK,Z @,RJ portable-ascii/src/voku/helper/data/x0c7.phpnuW+APK,Z}XCC,R portable-ascii/src/voku/helper/data/x095.phpnuW+APK,Z0  ,%[ portable-ascii/src/voku/helper/data/x05a.phpnuW+APK,Z]znn,c portable-ascii/src/voku/helper/data/x0b8.phpnuW+APK,Z)'@ ,kl portable-ascii/src/voku/helper/data/x028.phpnuW+APK,Z>+ll,v portable-ascii/src/voku/helper/data/x017.phpnuW+APK,Zs+)),`} portable-ascii/src/voku/helper/data/x088.phpnuW+APK,ZARŽ, portable-ascii/src/voku/helper/data/x0b1.phpnuW+APK,ZG,ώ portable-ascii/src/voku/helper/data/x0fe.phpnuW+APK,Zl'', portable-ascii/src/voku/helper/data/x083.phpnuW+APK,Z, portable-ascii/src/voku/helper/data/x099.phpnuW+APK,Z'$$, portable-ascii/src/voku/helper/data/x06e.phpnuW+APK,Zw)), portable-ascii/src/voku/helper/data/x098.phpnuW+APK,ZD , portable-ascii/src/voku/helper/data/x1d5.phpnuW+APK,Z2xlvv, portable-ascii/src/voku/helper/data/x0c9.phpnuW+APK,ZǗέ, portable-ascii/src/voku/helper/data/x0a3.phpnuW+APK,Zz>JJ, portable-ascii/src/voku/helper/data/x058.phpnuW+APK,Zk, portable-ascii/src/voku/helper/data/x089.phpnuW+APK,Z@ZEE, portable-ascii/src/voku/helper/data/x069.phpnuW+APK,Z7GG, portable-ascii/src/voku/helper/data/x075.phpnuW+APK,Zi/,7 portable-ascii/src/voku/helper/data/x0b7.phpnuW+APK,ZK's s ,x portable-ascii/src/voku/helper/data/x0c3.phpnuW+APK,Z3@@,G portable-ascii/src/voku/helper/data/x05b.phpnuW+APK,ZXgg, portable-ascii/src/voku/helper/data/x0bc.phpnuW+APK,ZUg//, portable-ascii/src/voku/helper/data/x080.phpnuW+APK,Zdd,1 portable-ascii/src/voku/helper/data/x0b9.phpnuW+APK,Z,$ portable-ascii/src/voku/helper/data/x010.phpnuW+APK,Ztyy,i+ portable-ascii/src/voku/helper/data/x0a1.phpnuW+APK,Zm%\,>3 portable-ascii/src/voku/helper/data/x033.phpnuW+APK,Z--,{; portable-ascii/src/voku/helper/data/x087.phpnuW+APK,Z7zOii:D portable-ascii/src/voku/helper/data/ascii_by_languages.phpnuW+APK,Z:~=L,Lportable-ascii/src/voku/helper/data/x006.phpnuW+APK,Z!>,Rportable-ascii/src/voku/helper/data/x0cc.phpnuW+APK,Zab88,[portable-ascii/src/voku/helper/data/x05f.phpnuW+APK,ZJH99,?dportable-ascii/src/voku/helper/data/x094.phpnuW+APK,Zeff,lportable-ascii/src/voku/helper/data/x1d4.phpnuW+APK,Z ,rportable-ascii/src/voku/helper/data/x0c4.phpnuW+APK,Z@M,|portable-ascii/src/voku/helper/data/x0b3.phpnuW+APK,Z=1,{portable-ascii/src/voku/helper/data/x026.phpnuW+APK,Zң,portable-ascii/src/voku/helper/data/x0d7.phpnuW+APK,Zp)22,ғportable-ascii/src/voku/helper/data/x00b.phpnuW+APK,Z ~~,`portable-ascii/src/voku/helper/data/x0bb.phpnuW+APK,Zޑ7MM,:portable-ascii/src/voku/helper/data/x1f1.phpnuW+APK,Z)ٛ,portable-ascii/src/voku/helper/data/x0a2.phpnuW+APK,Zh>>,ڮportable-ascii/src/voku/helper/data/x093.phpnuW+APK,ZԱz  ,tportable-ascii/src/voku/helper/data/x00e.phpnuW+APK,ZI**,ڽportable-ascii/src/voku/helper/data/x084.phpnuW+APK,Z,`portable-ascii/src/voku/helper/data/x009.phpnuW+APK,ZF_1portable-ascii/src/voku/helper/data/ascii_ord.phpnuW+APK,ZcPP,portable-ascii/src/voku/helper/data/x01f.phpnuW+APK,Z_c^H,lportable-ascii/src/voku/helper/data/x00f.phpnuW+APK,Zx ##,portable-ascii/src/voku/helper/data/x076.phpnuW+APK,Z:l_,2portable-ascii/src/voku/helper/data/x1d6.phpnuW+APK,Z+'',portable-ascii/src/voku/helper/data/x097.phpnuW+APK,ZI,portable-ascii/src/voku/helper/data/x029.phpnuW+APK,ZP@@,portable-ascii/src/voku/helper/data/x05e.phpnuW+APK,Z+L, portable-ascii/src/voku/helper/data/x00c.phpnuW+APK,ZH,portable-ascii/src/voku/helper/data/x027.phpnuW+APK,Z,Bportable-ascii/src/voku/helper/data/x0b4.phpnuW+APK,Z//,< portable-ascii/src/voku/helper/data/x08f.phpnuW+APK,Z1; ; ,(portable-ascii/src/voku/helper/data/x0b5.phpnuW+APK,Z- ,^2portable-ascii/src/voku/helper/data/x014.phpnuW+APK,ZvKq1,9portable-ascii/src/voku/helper/data/x0c5.phpnuW+APK,Z3$z],Aportable-ascii/src/voku/helper/data/x0cd.phpnuW+APK,Zn,Jportable-ascii/src/voku/helper/data/x04f.phpnuW+APK,ZK,Sportable-ascii/src/voku/helper/data/x012.phpnuW+APK,ZWa(NZportable-ascii/src/voku/helper/ASCII.phpnuW+APK,Z&''Y portable-ascii/.deepsource.tomlnuW+APK,Z-D"" portable-ascii/LICENSE.txtnuW+APK,ZtlGlG;%portable-ascii/README.mdnuW+APK,Z-M]]lportable-ascii/composer.jsonnuW+APKp