From 652bb13d430750a2e395fba9c37b7a3c1b3d342c Mon Sep 17 00:00:00 2001 From: Sorin Sarca Date: Wed, 6 May 2020 02:43:09 +0300 Subject: [PATCH 01/20] Added code for next major release --- .travis.yml | 1 + README.md | 8 +- composer.json | 6 +- res/ascii.php | 1502 ++-- res/char.php | 259 - res/fold.php | 1417 ++++ res/lower.php | 8022 ++++--------------- res/ord.php | 259 - res/upper.php | 7889 ++++-------------- src/Exception/InvalidCharException.php | 46 + src/Exception/InvalidCodePointException.php | 46 + src/Exception/InvalidStringException.php | 61 + src/Exception/UnicodeException.php | 25 + src/UnicodeString.php | 1764 ++-- tests/UnicodeStringTest.php | 774 +- 15 files changed, 6951 insertions(+), 15128 deletions(-) delete mode 100644 res/char.php create mode 100644 res/fold.php delete mode 100644 res/ord.php create mode 100644 src/Exception/InvalidCharException.php create mode 100644 src/Exception/InvalidCodePointException.php create mode 100644 src/Exception/InvalidStringException.php create mode 100644 src/Exception/UnicodeException.php diff --git a/.travis.yml b/.travis.yml index 5e50001..6ce6f9c 100644 --- a/.travis.yml +++ b/.travis.yml @@ -6,6 +6,7 @@ matrix: - php: '7.1' - php: '7.2' - php: '7.3' + - php: '7.4' fast_finish: true sudo: false diff --git a/README.md b/README.md index bb947c0..4037993 100644 --- a/README.md +++ b/README.md @@ -8,7 +8,7 @@ Opis String Manipulate multibyte strings ---------------------------- -Opis String is a tiny library that allows you to work with multibyte encoded strings in an object-oriented manner. +Opis String is a tiny library that allows you to work with multibyte encoded strings in an object-oriented manner. The library has no dependencies to *mb_string* or similar PHP extensions. ### Documentation @@ -25,8 +25,8 @@ The full documentation for this library can be found [here][documentation]. ## Installation -**Opis String** is available on [Packagist] and it can be installed from a -command line interface by using [Composer]. +**Opis String** is available on [Packagist] and it can be installed from a +command line interface by using [Composer]. ```bash composer require opis/string @@ -37,7 +37,7 @@ Or you could directly reference it into your `composer.json` file as a dependenc ```json { "require": { - "opis/string": "^1.5" + "opis/string": "^2.0" } } ``` diff --git a/composer.json b/composer.json index e615495..36ed571 100644 --- a/composer.json +++ b/composer.json @@ -8,6 +8,10 @@ { "name": "Marius Sarca", "email": "marius.sarca@gmail.com" + }, + { + "name": "Sorin Sarca", + "email": "sarca_sorin@hotmail.com" } ], "require": { @@ -28,7 +32,7 @@ }, "extra": { "branch-alias": { - "dev-master": "1.5.x-dev" + "dev-master": "2.0.x-dev" } } } diff --git a/res/ascii.php b/res/ascii.php index d5cef4d..000a19f 100644 --- a/res/ascii.php +++ b/res/ascii.php @@ -1,753 +1,751 @@ 48, - 8320 => 48, - 1776 => 48, - 185 => 49, - 8321 => 49, - 1777 => 49, - 178 => 50, - 8322 => 50, - 1778 => 50, - 179 => 51, - 8323 => 51, - 1779 => 51, - 8308 => 52, - 8324 => 52, - 1780 => 52, - 1636 => 52, - 8309 => 53, - 8325 => 53, - 1781 => 53, - 1637 => 53, - 8310 => 54, - 8326 => 54, - 1782 => 54, - 1638 => 54, - 8311 => 55, - 8327 => 55, - 1783 => 55, - 8312 => 56, - 8328 => 56, - 1784 => 56, - 8313 => 57, - 8329 => 57, - 1785 => 57, - 224 => 97, - 225 => 97, - 7843 => 97, - 227 => 97, - 7841 => 97, - 259 => 97, - 7855 => 97, - 7857 => 97, - 7859 => 97, - 7861 => 97, - 7863 => 97, - 226 => 97, - 7845 => 97, - 7847 => 97, - 7849 => 97, - 7851 => 97, - 7853 => 97, - 257 => 97, - 261 => 97, - 229 => 97, - 945 => 97, - 940 => 97, - 7936 => 97, - 7937 => 97, - 7938 => 97, - 7939 => 97, - 7940 => 97, - 7941 => 97, - 7942 => 97, - 7943 => 97, - 8064 => 97, - 8065 => 97, - 8066 => 97, - 8067 => 97, - 8068 => 97, - 8069 => 97, - 8070 => 97, - 8071 => 97, - 8048 => 97, - 8112 => 97, - 8113 => 97, - 8114 => 97, - 8115 => 97, - 8116 => 97, - 8118 => 97, - 8119 => 97, - 1072 => 97, - 1571 => 97, - 4129 => 97, - 4140 => 97, - 4139 => 97, - 507 => 97, - 462 => 97, - 170 => 97, - 4304 => 97, - 2309 => 97, - 1575 => 97, - 1073 => 98, - 946 => 98, - 1066 => 98, - 1068 => 98, - 1576 => 98, - 4119 => 98, - 4305 => 98, - 231 => 99, - 263 => 99, - 269 => 99, - 265 => 99, - 267 => 99, - 271 => 100, - 240 => 100, - 273 => 100, - 396 => 100, - 545 => 100, - 598 => 100, - 599 => 100, - 7533 => 100, - 7553 => 100, - 7569 => 100, - 1076 => 100, - 948 => 100, - 1583 => 100, - 1590 => 100, - 4109 => 100, - 4114 => 100, - 4307 => 100, - 233 => 101, - 232 => 101, - 7867 => 101, - 7869 => 101, - 7865 => 101, - 234 => 101, - 7871 => 101, - 7873 => 101, - 7875 => 101, - 7877 => 101, - 7879 => 101, - 235 => 101, - 275 => 101, - 281 => 101, - 283 => 101, - 277 => 101, - 279 => 101, - 949 => 101, - 941 => 101, - 7952 => 101, - 7953 => 101, - 7954 => 101, - 7955 => 101, - 7956 => 101, - 7957 => 101, - 8050 => 101, - 1077 => 101, - 1105 => 101, - 1101 => 101, - 1108 => 101, - 601 => 101, - 4135 => 101, - 4145 => 101, - 4146 => 101, - 4308 => 101, - 2319 => 101, - 1573 => 101, - 1574 => 101, - 1092 => 102, - 966 => 102, - 1601 => 102, - 402 => 102, - 4324 => 102, - 285 => 103, - 287 => 103, - 289 => 103, - 291 => 103, - 1075 => 103, - 1169 => 103, - 947 => 103, - 4098 => 103, - 4306 => 103, - 1711 => 103, - 293 => 104, - 295 => 104, - 951 => 104, - 942 => 104, - 1581 => 104, - 1607 => 104, - 4127 => 104, - 4158 => 104, - 4336 => 104, - 237 => 105, - 236 => 105, - 7881 => 105, - 297 => 105, - 7883 => 105, - 238 => 105, - 239 => 105, - 299 => 105, - 301 => 105, - 303 => 105, - 305 => 105, - 953 => 105, - 943 => 105, - 970 => 105, - 912 => 105, - 7984 => 105, - 7985 => 105, - 7986 => 105, - 7987 => 105, - 7988 => 105, - 7989 => 105, - 7990 => 105, - 7991 => 105, - 8054 => 105, - 8144 => 105, - 8145 => 105, - 8146 => 105, - 8150 => 105, - 8151 => 105, - 1110 => 105, - 1111 => 105, - 1080 => 105, - 4131 => 105, - 4141 => 111, - 4142 => 105, - 4106 => 105, - 464 => 105, - 4312 => 105, - 2311 => 105, - 1740 => 105, - 309 => 106, - 1112 => 106, - 1032 => 106, - 4335 => 106, - 1580 => 106, - 311 => 107, - 312 => 107, - 1082 => 107, - 954 => 107, - 310 => 107, - 1602 => 107, - 1603 => 107, - 4096 => 107, - 4313 => 107, - 4325 => 107, - 1705 => 107, - 322 => 108, - 318 => 108, - 314 => 108, - 316 => 108, - 320 => 108, - 1083 => 108, - 955 => 108, - 1604 => 108, - 4124 => 108, - 4314 => 108, - 1084 => 109, - 956 => 109, - 1605 => 109, - 4121 => 109, - 4315 => 109, - 241 => 110, - 324 => 110, - 328 => 110, - 326 => 110, - 329 => 110, - 331 => 110, - 957 => 110, - 1085 => 110, - 1606 => 110, - 4116 => 110, - 4316 => 110, - 243 => 111, - 242 => 111, - 7887 => 111, - 245 => 111, - 7885 => 111, - 244 => 111, - 7889 => 111, - 7891 => 111, - 7893 => 111, - 7895 => 111, - 7897 => 111, - 417 => 111, - 7899 => 111, - 7901 => 111, - 7903 => 111, - 7905 => 111, - 7907 => 111, - 248 => 111, - 333 => 111, - 337 => 111, - 335 => 111, - 959 => 111, - 8000 => 111, - 8001 => 111, - 8002 => 111, - 8003 => 111, - 8004 => 111, - 8005 => 111, - 8056 => 111, - 972 => 111, - 1086 => 111, - 1608 => 111, - 952 => 111, - 466 => 111, - 511 => 111, - 186 => 111, - 4317 => 111, - 2323 => 111, - 1087 => 112, - 960 => 112, - 4117 => 112, - 4318 => 112, - 1662 => 112, - 4327 => 113, - 341 => 114, - 345 => 114, - 343 => 114, - 1088 => 114, - 961 => 114, - 1585 => 114, - 4320 => 114, - 347 => 115, - 353 => 115, - 351 => 115, - 1089 => 115, - 963 => 115, - 537 => 115, - 962 => 115, - 1587 => 115, - 1589 => 115, - 4101 => 115, - 383 => 115, - 4321 => 115, - 357 => 116, - 355 => 116, - 1090 => 116, - 964 => 116, - 539 => 116, - 1578 => 116, - 1591 => 116, - 4107 => 116, - 4112 => 116, - 359 => 116, - 4311 => 116, - 4322 => 116, - 250 => 117, - 249 => 117, - 7911 => 117, - 361 => 117, - 7909 => 117, - 432 => 117, - 7913 => 117, - 7915 => 117, - 7917 => 117, - 7919 => 117, - 7921 => 117, - 251 => 117, - 363 => 117, - 367 => 117, - 369 => 117, - 365 => 117, - 371 => 117, - 181 => 117, - 1091 => 117, - 4105 => 117, - 4143 => 117, - 4144 => 117, - 468 => 117, - 470 => 117, - 472 => 117, - 474 => 117, - 476 => 117, - 4323 => 117, - 2313 => 117, - 1074 => 118, - 4309 => 118, - 976 => 118, - 373 => 119, - 969 => 119, - 974 => 119, - 4125 => 119, - 4157 => 119, - 967 => 120, - 958 => 120, - 253 => 121, - 7923 => 121, - 7927 => 121, - 7929 => 121, - 7925 => 121, - 255 => 121, - 375 => 121, - 1081 => 121, - 1099 => 121, - 965 => 121, - 971 => 121, - 973 => 121, - 944 => 121, - 1610 => 121, - 4122 => 121, - 378 => 122, - 382 => 122, - 380 => 122, - 1079 => 122, - 950 => 122, - 1586 => 122, - 4103 => 122, - 4310 => 122, - 1593 => 97, - 2310 => 97, - 1570 => 97, - 228 => 97, - 230 => 97, - 509 => 97, - 2320 => 97, - 64 => 97, - 1095 => 99, - 4329 => 99, - 4333 => 99, - 1670 => 99, - 1106 => 100, - 1119 => 100, - 4331 => 100, - 2317 => 101, - 1594 => 103, - 4326 => 103, - 2312 => 105, - 307 => 105, - 1093 => 107, - 1582 => 107, - 4334 => 107, - 1113 => 108, - 1114 => 110, - 246 => 111, - 339 => 111, - 1572 => 111, - 2321 => 111, - 2322 => 111, - 968 => 112, - 1096 => 115, - 4328 => 115, - 1588 => 115, - 1097 => 115, - 223 => 115, - 349 => 115, - 254 => 116, - 977 => 116, - 1579 => 116, - 1584 => 116, - 1592 => 116, - 1094 => 116, - 4330 => 116, - 4332 => 116, - 252 => 117, - 2314 => 117, - 1103 => 121, - 1102 => 121, - 1078 => 122, - 4319 => 122, - 1688 => 122, - 169 => 40, - 193 => 65, - 192 => 65, - 7842 => 65, - 195 => 65, - 7840 => 65, - 258 => 65, - 7854 => 65, - 7856 => 65, - 7858 => 65, - 7860 => 65, - 7862 => 65, - 194 => 65, - 7844 => 65, - 7846 => 65, - 7848 => 65, - 7850 => 65, - 7852 => 65, - 197 => 65, - 256 => 65, - 260 => 65, - 913 => 65, - 902 => 65, - 7944 => 65, - 7945 => 65, - 7946 => 65, - 7947 => 65, - 7948 => 65, - 7949 => 65, - 7950 => 65, - 7951 => 65, - 8072 => 65, - 8073 => 65, - 8074 => 65, - 8075 => 65, - 8076 => 65, - 8077 => 65, - 8078 => 65, - 8079 => 65, - 8120 => 65, - 8121 => 65, - 8122 => 65, - 8124 => 65, - 1040 => 65, - 506 => 65, - 461 => 65, - 1041 => 66, - 914 => 66, - 2348 => 66, - 199 => 67, - 262 => 67, - 268 => 67, - 264 => 67, - 266 => 67, - 270 => 68, - 208 => 68, - 272 => 68, - 393 => 68, - 394 => 68, - 395 => 68, - 7429 => 68, - 7430 => 68, - 1044 => 68, - 916 => 68, - 201 => 69, - 200 => 69, - 7866 => 69, - 7868 => 69, - 7864 => 69, - 202 => 69, - 7870 => 69, - 7872 => 69, - 7874 => 69, - 7876 => 69, - 7878 => 69, - 203 => 69, - 274 => 69, - 280 => 69, - 282 => 69, - 276 => 69, - 278 => 69, - 917 => 69, - 904 => 69, - 7960 => 69, - 7961 => 69, - 7962 => 69, - 7963 => 69, - 7964 => 69, - 7965 => 69, - 8136 => 69, - 1045 => 69, - 1025 => 69, - 1069 => 69, - 1028 => 69, - 399 => 69, - 1060 => 70, - 934 => 70, - 286 => 71, - 288 => 71, - 290 => 71, - 1043 => 71, - 1168 => 71, - 915 => 71, - 919 => 72, - 905 => 72, - 294 => 72, - 205 => 73, - 204 => 73, - 7880 => 73, - 296 => 73, - 7882 => 73, - 206 => 73, - 207 => 73, - 298 => 73, - 300 => 73, - 302 => 73, - 304 => 73, - 921 => 73, - 906 => 73, - 938 => 73, - 7992 => 73, - 7993 => 73, - 7995 => 73, - 7996 => 73, - 7997 => 73, - 7998 => 73, - 7999 => 73, - 8152 => 73, - 8153 => 73, - 8154 => 73, - 1048 => 73, - 1030 => 73, - 1031 => 73, - 463 => 73, - 978 => 73, - 1050 => 75, - 922 => 75, - 313 => 76, - 321 => 76, - 1051 => 76, - 923 => 76, - 315 => 76, - 317 => 76, - 319 => 76, - 2354 => 76, - 1052 => 77, - 924 => 77, - 323 => 78, - 209 => 78, - 327 => 78, - 325 => 78, - 330 => 78, - 1053 => 78, - 925 => 78, - 211 => 79, - 210 => 79, - 7886 => 79, - 213 => 79, - 7884 => 79, - 212 => 79, - 7888 => 79, - 7890 => 79, - 7892 => 79, - 7894 => 79, - 7896 => 79, - 416 => 79, - 7898 => 79, - 7900 => 79, - 7902 => 79, - 7904 => 79, - 7906 => 79, - 216 => 79, - 332 => 79, - 336 => 79, - 334 => 79, - 927 => 79, - 908 => 79, - 8008 => 79, - 8009 => 79, - 8010 => 79, - 8011 => 79, - 8012 => 79, - 8013 => 79, - 8184 => 79, - 1054 => 79, - 920 => 79, - 1256 => 79, - 465 => 79, - 510 => 79, - 1055 => 80, - 928 => 80, - 344 => 82, - 340 => 82, - 1056 => 82, - 929 => 82, - 342 => 82, - 350 => 83, - 348 => 83, - 536 => 83, - 352 => 83, - 346 => 83, - 1057 => 83, - 931 => 83, - 356 => 84, - 354 => 84, - 358 => 84, - 538 => 84, - 1058 => 84, - 932 => 84, - 218 => 85, - 217 => 85, - 7910 => 85, - 360 => 85, - 7908 => 85, - 431 => 85, - 7912 => 85, - 7914 => 85, - 7916 => 85, - 7918 => 85, - 7920 => 85, - 219 => 85, - 362 => 85, - 366 => 85, - 368 => 85, - 364 => 85, - 370 => 85, - 1059 => 85, - 467 => 85, - 469 => 85, - 471 => 85, - 473 => 85, - 475 => 85, - 1042 => 86, - 937 => 87, - 911 => 87, - 372 => 87, - 935 => 88, - 926 => 88, - 221 => 89, - 7922 => 89, - 7926 => 89, - 7928 => 89, - 7924 => 89, - 376 => 89, - 8168 => 89, - 8169 => 89, - 8170 => 89, - 910 => 89, - 1067 => 89, - 1049 => 89, - 933 => 89, - 939 => 89, - 374 => 89, - 377 => 90, - 381 => 90, - 379 => 90, - 1047 => 90, - 918 => 90, - 196 => 65, - 198 => 65, - 508 => 65, - 1063 => 67, - 1026 => 68, - 1039 => 68, - 284 => 71, - 292 => 72, - 306 => 73, - 308 => 74, - 1061 => 75, - 1033 => 76, - 1034 => 78, - 214 => 79, - 338 => 79, - 936 => 80, - 1064 => 83, - 1065 => 83, - 7838 => 83, - 222 => 84, - 1062 => 84, - 220 => 85, - 1071 => 89, - 1070 => 89, - 1046 => 90, - 160 => 32, - 8192 => 32, - 8193 => 32, - 8194 => 32, - 8195 => 32, - 8196 => 32, - 8197 => 32, - 8198 => 32, - 8199 => 32, - 8200 => 32, - 8201 => 32, - 8202 => 32, - 8239 => 32, - 8287 => 32, - 12288 => 32, -); +return [ +0xA9 => 0x28, +0xAA => 0x61, +0xB0 => 0x30, +0xB2 => 0x32, +0xB3 => 0x33, +0xB5 => 0x75, +0xB9 => 0x31, +0xBA => 0x6F, +0xC0 => 0x41, +0xC1 => 0x41, +0xC2 => 0x41, +0xC3 => 0x41, +0xC4 => 0x41, +0xC5 => 0x41, +0xC6 => 0x41, +0xC7 => 0x43, +0xC8 => 0x45, +0xC9 => 0x45, +0xCA => 0x45, +0xCB => 0x45, +0xCC => 0x49, +0xCD => 0x49, +0xCE => 0x49, +0xCF => 0x49, +0xD0 => 0x44, +0xD1 => 0x4E, +0xD2 => 0x4F, +0xD3 => 0x4F, +0xD4 => 0x4F, +0xD5 => 0x4F, +0xD6 => 0x4F, +0xD8 => 0x4F, +0xD9 => 0x55, +0xDA => 0x55, +0xDB => 0x55, +0xDC => 0x55, +0xDD => 0x59, +0xDE => 0x54, +0xDF => 0x73, +0xE0 => 0x61, +0xE1 => 0x61, +0xE2 => 0x61, +0xE3 => 0x61, +0xE4 => 0x61, +0xE5 => 0x61, +0xE6 => 0x61, +0xE7 => 0x63, +0xE8 => 0x65, +0xE9 => 0x65, +0xEA => 0x65, +0xEB => 0x65, +0xEC => 0x69, +0xED => 0x69, +0xEE => 0x69, +0xEF => 0x69, +0xF0 => 0x64, +0xF1 => 0x6E, +0xF2 => 0x6F, +0xF3 => 0x6F, +0xF4 => 0x6F, +0xF5 => 0x6F, +0xF6 => 0x6F, +0xF8 => 0x6F, +0xF9 => 0x75, +0xFA => 0x75, +0xFB => 0x75, +0xFC => 0x75, +0xFD => 0x79, +0xFE => 0x74, +0xFF => 0x79, +0x100 => 0x41, +0x101 => 0x61, +0x102 => 0x41, +0x103 => 0x61, +0x104 => 0x41, +0x105 => 0x61, +0x106 => 0x43, +0x107 => 0x63, +0x108 => 0x43, +0x109 => 0x63, +0x10A => 0x43, +0x10B => 0x63, +0x10C => 0x43, +0x10D => 0x63, +0x10E => 0x44, +0x10F => 0x64, +0x110 => 0x44, +0x111 => 0x64, +0x112 => 0x45, +0x113 => 0x65, +0x114 => 0x45, +0x115 => 0x65, +0x116 => 0x45, +0x117 => 0x65, +0x118 => 0x45, +0x119 => 0x65, +0x11A => 0x45, +0x11B => 0x65, +0x11C => 0x47, +0x11D => 0x67, +0x11E => 0x47, +0x11F => 0x67, +0x120 => 0x47, +0x121 => 0x67, +0x122 => 0x47, +0x123 => 0x67, +0x124 => 0x48, +0x125 => 0x68, +0x126 => 0x48, +0x127 => 0x68, +0x128 => 0x49, +0x129 => 0x69, +0x12A => 0x49, +0x12B => 0x69, +0x12C => 0x49, +0x12D => 0x69, +0x12E => 0x49, +0x12F => 0x69, +0x130 => 0x49, +0x131 => 0x69, +0x132 => 0x49, +0x133 => 0x69, +0x134 => 0x4A, +0x135 => 0x6A, +0x136 => 0x6B, +0x137 => 0x6B, +0x138 => 0x6B, +0x139 => 0x4C, +0x13A => 0x6C, +0x13B => 0x4C, +0x13C => 0x6C, +0x13D => 0x4C, +0x13E => 0x6C, +0x13F => 0x4C, +0x140 => 0x6C, +0x141 => 0x4C, +0x142 => 0x6C, +0x143 => 0x4E, +0x144 => 0x6E, +0x145 => 0x4E, +0x146 => 0x6E, +0x147 => 0x4E, +0x148 => 0x6E, +0x149 => 0x6E, +0x14A => 0x4E, +0x14B => 0x6E, +0x14C => 0x4F, +0x14D => 0x6F, +0x14E => 0x4F, +0x14F => 0x6F, +0x150 => 0x4F, +0x151 => 0x6F, +0x152 => 0x4F, +0x153 => 0x6F, +0x154 => 0x52, +0x155 => 0x72, +0x156 => 0x52, +0x157 => 0x72, +0x158 => 0x52, +0x159 => 0x72, +0x15A => 0x53, +0x15B => 0x73, +0x15C => 0x53, +0x15D => 0x73, +0x15E => 0x53, +0x15F => 0x73, +0x160 => 0x53, +0x161 => 0x73, +0x162 => 0x54, +0x163 => 0x74, +0x164 => 0x54, +0x165 => 0x74, +0x166 => 0x54, +0x167 => 0x74, +0x168 => 0x55, +0x169 => 0x75, +0x16A => 0x55, +0x16B => 0x75, +0x16C => 0x55, +0x16D => 0x75, +0x16E => 0x55, +0x16F => 0x75, +0x170 => 0x55, +0x171 => 0x75, +0x172 => 0x55, +0x173 => 0x75, +0x174 => 0x57, +0x175 => 0x77, +0x176 => 0x59, +0x177 => 0x79, +0x178 => 0x59, +0x179 => 0x5A, +0x17A => 0x7A, +0x17B => 0x5A, +0x17C => 0x7A, +0x17D => 0x5A, +0x17E => 0x7A, +0x17F => 0x73, +0x189 => 0x44, +0x18A => 0x44, +0x18B => 0x44, +0x18C => 0x64, +0x18F => 0x45, +0x192 => 0x66, +0x1A0 => 0x4F, +0x1A1 => 0x6F, +0x1AF => 0x55, +0x1B0 => 0x75, +0x1CD => 0x41, +0x1CE => 0x61, +0x1CF => 0x49, +0x1D0 => 0x69, +0x1D1 => 0x4F, +0x1D2 => 0x6F, +0x1D3 => 0x55, +0x1D4 => 0x75, +0x1D5 => 0x55, +0x1D6 => 0x75, +0x1D7 => 0x55, +0x1D8 => 0x75, +0x1D9 => 0x55, +0x1DA => 0x75, +0x1DB => 0x55, +0x1DC => 0x75, +0x1FA => 0x41, +0x1FB => 0x61, +0x1FC => 0x41, +0x1FD => 0x61, +0x1FE => 0x4F, +0x1FF => 0x6F, +0x218 => 0x53, +0x219 => 0x73, +0x21A => 0x54, +0x21B => 0x74, +0x221 => 0x64, +0x256 => 0x64, +0x257 => 0x64, +0x259 => 0x65, +0x386 => 0x41, +0x388 => 0x45, +0x389 => 0x48, +0x38A => 0x49, +0x38C => 0x4F, +0x38E => 0x59, +0x38F => 0x57, +0x390 => 0x69, +0x391 => 0x41, +0x392 => 0x42, +0x393 => 0x47, +0x394 => 0x44, +0x395 => 0x45, +0x396 => 0x5A, +0x397 => 0x48, +0x398 => 0x4F, +0x399 => 0x49, +0x39A => 0x4B, +0x39B => 0x4C, +0x39C => 0x4D, +0x39D => 0x4E, +0x39E => 0x58, +0x39F => 0x4F, +0x3A0 => 0x50, +0x3A1 => 0x52, +0x3A3 => 0x53, +0x3A4 => 0x54, +0x3A5 => 0x59, +0x3A6 => 0x46, +0x3A7 => 0x58, +0x3A8 => 0x50, +0x3A9 => 0x57, +0x3AA => 0x49, +0x3AB => 0x59, +0x3AC => 0x61, +0x3AD => 0x65, +0x3AE => 0x68, +0x3AF => 0x69, +0x3B0 => 0x79, +0x3B1 => 0x61, +0x3B2 => 0x62, +0x3B3 => 0x67, +0x3B4 => 0x64, +0x3B5 => 0x65, +0x3B6 => 0x7A, +0x3B7 => 0x68, +0x3B8 => 0x6F, +0x3B9 => 0x69, +0x3BA => 0x6B, +0x3BB => 0x6C, +0x3BC => 0x6D, +0x3BD => 0x6E, +0x3BE => 0x78, +0x3BF => 0x6F, +0x3C0 => 0x70, +0x3C1 => 0x72, +0x3C2 => 0x73, +0x3C3 => 0x73, +0x3C4 => 0x74, +0x3C5 => 0x79, +0x3C6 => 0x66, +0x3C7 => 0x78, +0x3C8 => 0x70, +0x3C9 => 0x77, +0x3CA => 0x69, +0x3CB => 0x79, +0x3CC => 0x6F, +0x3CD => 0x79, +0x3CE => 0x77, +0x3D0 => 0x76, +0x3D1 => 0x74, +0x3D2 => 0x49, +0x401 => 0x45, +0x402 => 0x44, +0x404 => 0x45, +0x406 => 0x49, +0x407 => 0x49, +0x408 => 0x6A, +0x409 => 0x4C, +0x40A => 0x4E, +0x40F => 0x44, +0x410 => 0x41, +0x411 => 0x42, +0x412 => 0x56, +0x413 => 0x47, +0x414 => 0x44, +0x415 => 0x45, +0x416 => 0x5A, +0x417 => 0x5A, +0x418 => 0x49, +0x419 => 0x59, +0x41A => 0x4B, +0x41B => 0x4C, +0x41C => 0x4D, +0x41D => 0x4E, +0x41E => 0x4F, +0x41F => 0x50, +0x420 => 0x52, +0x421 => 0x53, +0x422 => 0x54, +0x423 => 0x55, +0x424 => 0x46, +0x425 => 0x4B, +0x426 => 0x54, +0x427 => 0x43, +0x428 => 0x53, +0x429 => 0x53, +0x42A => 0x62, +0x42B => 0x59, +0x42C => 0x62, +0x42D => 0x45, +0x42E => 0x59, +0x42F => 0x59, +0x430 => 0x61, +0x431 => 0x62, +0x432 => 0x76, +0x433 => 0x67, +0x434 => 0x64, +0x435 => 0x65, +0x436 => 0x7A, +0x437 => 0x7A, +0x438 => 0x69, +0x439 => 0x79, +0x43A => 0x6B, +0x43B => 0x6C, +0x43C => 0x6D, +0x43D => 0x6E, +0x43E => 0x6F, +0x43F => 0x70, +0x440 => 0x72, +0x441 => 0x73, +0x442 => 0x74, +0x443 => 0x75, +0x444 => 0x66, +0x445 => 0x6B, +0x446 => 0x74, +0x447 => 0x63, +0x448 => 0x73, +0x449 => 0x73, +0x44B => 0x79, +0x44D => 0x65, +0x44E => 0x79, +0x44F => 0x79, +0x451 => 0x65, +0x452 => 0x64, +0x454 => 0x65, +0x456 => 0x69, +0x457 => 0x69, +0x458 => 0x6A, +0x459 => 0x6C, +0x45A => 0x6E, +0x45F => 0x64, +0x490 => 0x47, +0x491 => 0x67, +0x4E8 => 0x4F, +0x622 => 0x61, +0x623 => 0x61, +0x624 => 0x6F, +0x625 => 0x65, +0x626 => 0x65, +0x627 => 0x61, +0x628 => 0x62, +0x62A => 0x74, +0x62B => 0x74, +0x62C => 0x6A, +0x62D => 0x68, +0x62E => 0x6B, +0x62F => 0x64, +0x630 => 0x74, +0x631 => 0x72, +0x632 => 0x7A, +0x633 => 0x73, +0x634 => 0x73, +0x635 => 0x73, +0x636 => 0x64, +0x637 => 0x74, +0x638 => 0x74, +0x639 => 0x61, +0x63A => 0x67, +0x641 => 0x66, +0x642 => 0x6B, +0x643 => 0x6B, +0x644 => 0x6C, +0x645 => 0x6D, +0x646 => 0x6E, +0x647 => 0x68, +0x648 => 0x6F, +0x64A => 0x79, +0x664 => 0x34, +0x665 => 0x35, +0x666 => 0x36, +0x67E => 0x70, +0x686 => 0x63, +0x698 => 0x7A, +0x6A9 => 0x6B, +0x6AF => 0x67, +0x6CC => 0x69, +0x6F0 => 0x30, +0x6F1 => 0x31, +0x6F2 => 0x32, +0x6F3 => 0x33, +0x6F4 => 0x34, +0x6F5 => 0x35, +0x6F6 => 0x36, +0x6F7 => 0x37, +0x6F8 => 0x38, +0x6F9 => 0x39, +0x905 => 0x61, +0x906 => 0x61, +0x907 => 0x69, +0x908 => 0x69, +0x909 => 0x75, +0x90A => 0x75, +0x90D => 0x65, +0x90F => 0x65, +0x910 => 0x61, +0x911 => 0x6F, +0x912 => 0x6F, +0x913 => 0x6F, +0x92C => 0x42, +0x932 => 0x4C, +0x1000 => 0x6B, +0x1002 => 0x67, +0x1005 => 0x73, +0x1007 => 0x7A, +0x1009 => 0x75, +0x100A => 0x69, +0x100B => 0x74, +0x100D => 0x64, +0x1010 => 0x74, +0x1012 => 0x64, +0x1014 => 0x6E, +0x1015 => 0x70, +0x1017 => 0x62, +0x1019 => 0x6D, +0x101A => 0x79, +0x101C => 0x6C, +0x101D => 0x77, +0x101F => 0x68, +0x1021 => 0x61, +0x1023 => 0x69, +0x1027 => 0x65, +0x102B => 0x61, +0x102C => 0x61, +0x102D => 0x6F, +0x102E => 0x69, +0x102F => 0x75, +0x1030 => 0x75, +0x1031 => 0x65, +0x1032 => 0x65, +0x103D => 0x77, +0x103E => 0x68, +0x10D0 => 0x61, +0x10D1 => 0x62, +0x10D2 => 0x67, +0x10D3 => 0x64, +0x10D4 => 0x65, +0x10D5 => 0x76, +0x10D6 => 0x7A, +0x10D7 => 0x74, +0x10D8 => 0x69, +0x10D9 => 0x6B, +0x10DA => 0x6C, +0x10DB => 0x6D, +0x10DC => 0x6E, +0x10DD => 0x6F, +0x10DE => 0x70, +0x10DF => 0x7A, +0x10E0 => 0x72, +0x10E1 => 0x73, +0x10E2 => 0x74, +0x10E3 => 0x75, +0x10E4 => 0x66, +0x10E5 => 0x6B, +0x10E6 => 0x67, +0x10E7 => 0x71, +0x10E8 => 0x73, +0x10E9 => 0x63, +0x10EA => 0x74, +0x10EB => 0x64, +0x10EC => 0x74, +0x10ED => 0x63, +0x10EE => 0x6B, +0x10EF => 0x6A, +0x10F0 => 0x68, +0x1D05 => 0x44, +0x1D06 => 0x44, +0x1D6D => 0x64, +0x1D81 => 0x64, +0x1D91 => 0x64, +0x1E9E => 0x53, +0x1EA0 => 0x41, +0x1EA1 => 0x61, +0x1EA2 => 0x41, +0x1EA3 => 0x61, +0x1EA4 => 0x41, +0x1EA5 => 0x61, +0x1EA6 => 0x41, +0x1EA7 => 0x61, +0x1EA8 => 0x41, +0x1EA9 => 0x61, +0x1EAA => 0x41, +0x1EAB => 0x61, +0x1EAC => 0x41, +0x1EAD => 0x61, +0x1EAE => 0x41, +0x1EAF => 0x61, +0x1EB0 => 0x41, +0x1EB1 => 0x61, +0x1EB2 => 0x41, +0x1EB3 => 0x61, +0x1EB4 => 0x41, +0x1EB5 => 0x61, +0x1EB6 => 0x41, +0x1EB7 => 0x61, +0x1EB8 => 0x45, +0x1EB9 => 0x65, +0x1EBA => 0x45, +0x1EBB => 0x65, +0x1EBC => 0x45, +0x1EBD => 0x65, +0x1EBE => 0x45, +0x1EBF => 0x65, +0x1EC0 => 0x45, +0x1EC1 => 0x65, +0x1EC2 => 0x45, +0x1EC3 => 0x65, +0x1EC4 => 0x45, +0x1EC5 => 0x65, +0x1EC6 => 0x45, +0x1EC7 => 0x65, +0x1EC8 => 0x49, +0x1EC9 => 0x69, +0x1ECA => 0x49, +0x1ECB => 0x69, +0x1ECC => 0x4F, +0x1ECD => 0x6F, +0x1ECE => 0x4F, +0x1ECF => 0x6F, +0x1ED0 => 0x4F, +0x1ED1 => 0x6F, +0x1ED2 => 0x4F, +0x1ED3 => 0x6F, +0x1ED4 => 0x4F, +0x1ED5 => 0x6F, +0x1ED6 => 0x4F, +0x1ED7 => 0x6F, +0x1ED8 => 0x4F, +0x1ED9 => 0x6F, +0x1EDA => 0x4F, +0x1EDB => 0x6F, +0x1EDC => 0x4F, +0x1EDD => 0x6F, +0x1EDE => 0x4F, +0x1EDF => 0x6F, +0x1EE0 => 0x4F, +0x1EE1 => 0x6F, +0x1EE2 => 0x4F, +0x1EE3 => 0x6F, +0x1EE4 => 0x55, +0x1EE5 => 0x75, +0x1EE6 => 0x55, +0x1EE7 => 0x75, +0x1EE8 => 0x55, +0x1EE9 => 0x75, +0x1EEA => 0x55, +0x1EEB => 0x75, +0x1EEC => 0x55, +0x1EED => 0x75, +0x1EEE => 0x55, +0x1EEF => 0x75, +0x1EF0 => 0x55, +0x1EF1 => 0x75, +0x1EF2 => 0x59, +0x1EF3 => 0x79, +0x1EF4 => 0x59, +0x1EF5 => 0x79, +0x1EF6 => 0x59, +0x1EF7 => 0x79, +0x1EF8 => 0x59, +0x1EF9 => 0x79, +0x1F00 => 0x61, +0x1F01 => 0x61, +0x1F02 => 0x61, +0x1F03 => 0x61, +0x1F04 => 0x61, +0x1F05 => 0x61, +0x1F06 => 0x61, +0x1F07 => 0x61, +0x1F08 => 0x41, +0x1F09 => 0x41, +0x1F0A => 0x41, +0x1F0B => 0x41, +0x1F0C => 0x41, +0x1F0D => 0x41, +0x1F0E => 0x41, +0x1F0F => 0x41, +0x1F10 => 0x65, +0x1F11 => 0x65, +0x1F12 => 0x65, +0x1F13 => 0x65, +0x1F14 => 0x65, +0x1F15 => 0x65, +0x1F18 => 0x45, +0x1F19 => 0x45, +0x1F1A => 0x45, +0x1F1B => 0x45, +0x1F1C => 0x45, +0x1F1D => 0x45, +0x1F30 => 0x69, +0x1F31 => 0x69, +0x1F32 => 0x69, +0x1F33 => 0x69, +0x1F34 => 0x69, +0x1F35 => 0x69, +0x1F36 => 0x69, +0x1F37 => 0x69, +0x1F38 => 0x49, +0x1F39 => 0x49, +0x1F3B => 0x49, +0x1F3C => 0x49, +0x1F3D => 0x49, +0x1F3E => 0x49, +0x1F3F => 0x49, +0x1F40 => 0x6F, +0x1F41 => 0x6F, +0x1F42 => 0x6F, +0x1F43 => 0x6F, +0x1F44 => 0x6F, +0x1F45 => 0x6F, +0x1F48 => 0x4F, +0x1F49 => 0x4F, +0x1F4A => 0x4F, +0x1F4B => 0x4F, +0x1F4C => 0x4F, +0x1F4D => 0x4F, +0x1F70 => 0x61, +0x1F72 => 0x65, +0x1F76 => 0x69, +0x1F78 => 0x6F, +0x1F80 => 0x61, +0x1F81 => 0x61, +0x1F82 => 0x61, +0x1F83 => 0x61, +0x1F84 => 0x61, +0x1F85 => 0x61, +0x1F86 => 0x61, +0x1F87 => 0x61, +0x1F88 => 0x41, +0x1F89 => 0x41, +0x1F8A => 0x41, +0x1F8B => 0x41, +0x1F8C => 0x41, +0x1F8D => 0x41, +0x1F8E => 0x41, +0x1F8F => 0x41, +0x1FB0 => 0x61, +0x1FB1 => 0x61, +0x1FB2 => 0x61, +0x1FB3 => 0x61, +0x1FB4 => 0x61, +0x1FB6 => 0x61, +0x1FB7 => 0x61, +0x1FB8 => 0x41, +0x1FB9 => 0x41, +0x1FBA => 0x41, +0x1FBC => 0x41, +0x1FC8 => 0x45, +0x1FD0 => 0x69, +0x1FD1 => 0x69, +0x1FD2 => 0x69, +0x1FD6 => 0x69, +0x1FD7 => 0x69, +0x1FD8 => 0x49, +0x1FD9 => 0x49, +0x1FDA => 0x49, +0x1FE8 => 0x59, +0x1FE9 => 0x59, +0x1FEA => 0x59, +0x1FF8 => 0x4F, +0x2000 => 0x20, +0x2001 => 0x20, +0x2002 => 0x20, +0x2003 => 0x20, +0x2004 => 0x20, +0x2005 => 0x20, +0x2006 => 0x20, +0x2007 => 0x20, +0x2008 => 0x20, +0x2009 => 0x20, +0x200A => 0x20, +0x202F => 0x20, +0x205F => 0x20, +0x2074 => 0x34, +0x2075 => 0x35, +0x2076 => 0x36, +0x2077 => 0x37, +0x2078 => 0x38, +0x2079 => 0x39, +0x2080 => 0x30, +0x2081 => 0x31, +0x2082 => 0x32, +0x2083 => 0x33, +0x2084 => 0x34, +0x2085 => 0x35, +0x2086 => 0x36, +0x2087 => 0x37, +0x2088 => 0x38, +0x2089 => 0x39, +0x3000 => 0x20, +]; diff --git a/res/char.php b/res/char.php deleted file mode 100644 index 2aa41a3..0000000 --- a/res/char.php +++ /dev/null @@ -1,259 +0,0 @@ - "\x00", - 1 => "\x01", - 2 => "\x02", - 3 => "\x03", - 4 => "\x04", - 5 => "\x05", - 6 => "\x06", - 7 => "\x07", - 8 => "\x08", - 9 => "\x09", - 10 => "\x0A", - 11 => "\x0B", - 12 => "\x0C", - 13 => "\x0D", - 14 => "\x0E", - 15 => "\x0F", - 16 => "\x10", - 17 => "\x11", - 18 => "\x12", - 19 => "\x13", - 20 => "\x14", - 21 => "\x15", - 22 => "\x16", - 23 => "\x17", - 24 => "\x18", - 25 => "\x19", - 26 => "\x1A", - 27 => "\x1B", - 28 => "\x1C", - 29 => "\x1D", - 30 => "\x1E", - 31 => "\x1F", - 32 => "\x20", - 33 => "\x21", - 34 => "\x22", - 35 => "\x23", - 36 => "\x24", - 37 => "\x25", - 38 => "\x26", - 39 => "\x27", - 40 => "\x28", - 41 => "\x29", - 42 => "\x2A", - 43 => "\x2B", - 44 => "\x2C", - 45 => "\x2D", - 46 => "\x2E", - 47 => "\x2F", - 48 => "\x30", - 49 => "\x31", - 50 => "\x32", - 51 => "\x33", - 52 => "\x34", - 53 => "\x35", - 54 => "\x36", - 55 => "\x37", - 56 => "\x38", - 57 => "\x39", - 58 => "\x3A", - 59 => "\x3B", - 60 => "\x3C", - 61 => "\x3D", - 62 => "\x3E", - 63 => "\x3F", - 64 => "\x40", - 65 => "\x41", - 66 => "\x42", - 67 => "\x43", - 68 => "\x44", - 69 => "\x45", - 70 => "\x46", - 71 => "\x47", - 72 => "\x48", - 73 => "\x49", - 74 => "\x4A", - 75 => "\x4B", - 76 => "\x4C", - 77 => "\x4D", - 78 => "\x4E", - 79 => "\x4F", - 80 => "\x50", - 81 => "\x51", - 82 => "\x52", - 83 => "\x53", - 84 => "\x54", - 85 => "\x55", - 86 => "\x56", - 87 => "\x57", - 88 => "\x58", - 89 => "\x59", - 90 => "\x5A", - 91 => "\x5B", - 92 => "\x5C", - 93 => "\x5D", - 94 => "\x5E", - 95 => "\x5F", - 96 => "\x60", - 97 => "\x61", - 98 => "\x62", - 99 => "\x63", - 100 => "\x64", - 101 => "\x65", - 102 => "\x66", - 103 => "\x67", - 104 => "\x68", - 105 => "\x69", - 106 => "\x6A", - 107 => "\x6B", - 108 => "\x6C", - 109 => "\x6D", - 110 => "\x6E", - 111 => "\x6F", - 112 => "\x70", - 113 => "\x71", - 114 => "\x72", - 115 => "\x73", - 116 => "\x74", - 117 => "\x75", - 118 => "\x76", - 119 => "\x77", - 120 => "\x78", - 121 => "\x79", - 122 => "\x7A", - 123 => "\x7B", - 124 => "\x7C", - 125 => "\x7D", - 126 => "\x7E", - 127 => "\x7F", - 128 => "\x80", - 129 => "\x81", - 130 => "\x82", - 131 => "\x83", - 132 => "\x84", - 133 => "\x85", - 134 => "\x86", - 135 => "\x87", - 136 => "\x88", - 137 => "\x89", - 138 => "\x8A", - 139 => "\x8B", - 140 => "\x8C", - 141 => "\x8D", - 142 => "\x8E", - 143 => "\x8F", - 144 => "\x90", - 145 => "\x91", - 146 => "\x92", - 147 => "\x93", - 148 => "\x94", - 149 => "\x95", - 150 => "\x96", - 151 => "\x97", - 152 => "\x98", - 153 => "\x99", - 154 => "\x9A", - 155 => "\x9B", - 156 => "\x9C", - 157 => "\x9D", - 158 => "\x9E", - 159 => "\x9F", - 160 => "\xA0", - 161 => "\xA1", - 162 => "\xA2", - 163 => "\xA3", - 164 => "\xA4", - 165 => "\xA5", - 166 => "\xA6", - 167 => "\xA7", - 168 => "\xA8", - 169 => "\xA9", - 170 => "\xAA", - 171 => "\xAB", - 172 => "\xAC", - 173 => "\xAD", - 174 => "\xAE", - 175 => "\xAF", - 176 => "\xB0", - 177 => "\xB1", - 178 => "\xB2", - 179 => "\xB3", - 180 => "\xB4", - 181 => "\xB5", - 182 => "\xB6", - 183 => "\xB7", - 184 => "\xB8", - 185 => "\xB9", - 186 => "\xBA", - 187 => "\xBB", - 188 => "\xBC", - 189 => "\xBD", - 190 => "\xBE", - 191 => "\xBF", - 192 => "\xC0", - 193 => "\xC1", - 194 => "\xC2", - 195 => "\xC3", - 196 => "\xC4", - 197 => "\xC5", - 198 => "\xC6", - 199 => "\xC7", - 200 => "\xC8", - 201 => "\xC9", - 202 => "\xCA", - 203 => "\xCB", - 204 => "\xCC", - 205 => "\xCD", - 206 => "\xCE", - 207 => "\xCF", - 208 => "\xD0", - 209 => "\xD1", - 210 => "\xD2", - 211 => "\xD3", - 212 => "\xD4", - 213 => "\xD5", - 214 => "\xD6", - 215 => "\xD7", - 216 => "\xD8", - 217 => "\xD9", - 218 => "\xDA", - 219 => "\xDB", - 220 => "\xDC", - 221 => "\xDD", - 222 => "\xDE", - 223 => "\xDF", - 224 => "\xE0", - 225 => "\xE1", - 226 => "\xE2", - 227 => "\xE3", - 228 => "\xE4", - 229 => "\xE5", - 230 => "\xE6", - 231 => "\xE7", - 232 => "\xE8", - 233 => "\xE9", - 234 => "\xEA", - 235 => "\xEB", - 236 => "\xEC", - 237 => "\xED", - 238 => "\xEE", - 239 => "\xEF", - 240 => "\xF0", - 241 => "\xF1", - 242 => "\xF2", - 243 => "\xF3", - 244 => "\xF4", - 245 => "\xF5", - 246 => "\xF6", - 247 => "\xF7", - 248 => "\xF8", - 249 => "\xF9", - 250 => "\xFA", - 251 => "\xFB", - 252 => "\xFC", - 253 => "\xFD", - 254 => "\xFE", - 255 => "\xFF", -); diff --git a/res/fold.php b/res/fold.php new file mode 100644 index 0000000..e93f981 --- /dev/null +++ b/res/fold.php @@ -0,0 +1,1417 @@ + 0x61, +0x42 => 0x62, +0x43 => 0x63, +0x44 => 0x64, +0x45 => 0x65, +0x46 => 0x66, +0x47 => 0x67, +0x48 => 0x68, +0x49 => 0x69, +0x4A => 0x6A, +0x4B => 0x6B, +0x4C => 0x6C, +0x4D => 0x6D, +0x4E => 0x6E, +0x4F => 0x6F, +0x50 => 0x70, +0x51 => 0x71, +0x52 => 0x72, +0x53 => 0x73, +0x54 => 0x74, +0x55 => 0x75, +0x56 => 0x76, +0x57 => 0x77, +0x58 => 0x78, +0x59 => 0x79, +0x5A => 0x7A, +0xB5 => 0x3BC, +0xC0 => 0xE0, +0xC1 => 0xE1, +0xC2 => 0xE2, +0xC3 => 0xE3, +0xC4 => 0xE4, +0xC5 => 0xE5, +0xC6 => 0xE6, +0xC7 => 0xE7, +0xC8 => 0xE8, +0xC9 => 0xE9, +0xCA => 0xEA, +0xCB => 0xEB, +0xCC => 0xEC, +0xCD => 0xED, +0xCE => 0xEE, +0xCF => 0xEF, +0xD0 => 0xF0, +0xD1 => 0xF1, +0xD2 => 0xF2, +0xD3 => 0xF3, +0xD4 => 0xF4, +0xD5 => 0xF5, +0xD6 => 0xF6, +0xD8 => 0xF8, +0xD9 => 0xF9, +0xDA => 0xFA, +0xDB => 0xFB, +0xDC => 0xFC, +0xDD => 0xFD, +0xDE => 0xFE, +0x100 => 0x101, +0x102 => 0x103, +0x104 => 0x105, +0x106 => 0x107, +0x108 => 0x109, +0x10A => 0x10B, +0x10C => 0x10D, +0x10E => 0x10F, +0x110 => 0x111, +0x112 => 0x113, +0x114 => 0x115, +0x116 => 0x117, +0x118 => 0x119, +0x11A => 0x11B, +0x11C => 0x11D, +0x11E => 0x11F, +0x120 => 0x121, +0x122 => 0x123, +0x124 => 0x125, +0x126 => 0x127, +0x128 => 0x129, +0x12A => 0x12B, +0x12C => 0x12D, +0x12E => 0x12F, +0x132 => 0x133, +0x134 => 0x135, +0x136 => 0x137, +0x139 => 0x13A, +0x13B => 0x13C, +0x13D => 0x13E, +0x13F => 0x140, +0x141 => 0x142, +0x143 => 0x144, +0x145 => 0x146, +0x147 => 0x148, +0x14A => 0x14B, +0x14C => 0x14D, +0x14E => 0x14F, +0x150 => 0x151, +0x152 => 0x153, +0x154 => 0x155, +0x156 => 0x157, +0x158 => 0x159, +0x15A => 0x15B, +0x15C => 0x15D, +0x15E => 0x15F, +0x160 => 0x161, +0x162 => 0x163, +0x164 => 0x165, +0x166 => 0x167, +0x168 => 0x169, +0x16A => 0x16B, +0x16C => 0x16D, +0x16E => 0x16F, +0x170 => 0x171, +0x172 => 0x173, +0x174 => 0x175, +0x176 => 0x177, +0x178 => 0xFF, +0x179 => 0x17A, +0x17B => 0x17C, +0x17D => 0x17E, +0x17F => 0x73, +0x181 => 0x253, +0x182 => 0x183, +0x184 => 0x185, +0x186 => 0x254, +0x187 => 0x188, +0x189 => 0x256, +0x18A => 0x257, +0x18B => 0x18C, +0x18E => 0x1DD, +0x18F => 0x259, +0x190 => 0x25B, +0x191 => 0x192, +0x193 => 0x260, +0x194 => 0x263, +0x196 => 0x269, +0x197 => 0x268, +0x198 => 0x199, +0x19C => 0x26F, +0x19D => 0x272, +0x19F => 0x275, +0x1A0 => 0x1A1, +0x1A2 => 0x1A3, +0x1A4 => 0x1A5, +0x1A6 => 0x280, +0x1A7 => 0x1A8, +0x1A9 => 0x283, +0x1AC => 0x1AD, +0x1AE => 0x288, +0x1AF => 0x1B0, +0x1B1 => 0x28A, +0x1B2 => 0x28B, +0x1B3 => 0x1B4, +0x1B5 => 0x1B6, +0x1B7 => 0x292, +0x1B8 => 0x1B9, +0x1BC => 0x1BD, +0x1C4 => 0x1C6, +0x1C5 => 0x1C6, +0x1C7 => 0x1C9, +0x1C8 => 0x1C9, +0x1CA => 0x1CC, +0x1CB => 0x1CC, +0x1CD => 0x1CE, +0x1CF => 0x1D0, +0x1D1 => 0x1D2, +0x1D3 => 0x1D4, +0x1D5 => 0x1D6, +0x1D7 => 0x1D8, +0x1D9 => 0x1DA, +0x1DB => 0x1DC, +0x1DE => 0x1DF, +0x1E0 => 0x1E1, +0x1E2 => 0x1E3, +0x1E4 => 0x1E5, +0x1E6 => 0x1E7, +0x1E8 => 0x1E9, +0x1EA => 0x1EB, +0x1EC => 0x1ED, +0x1EE => 0x1EF, +0x1F1 => 0x1F3, +0x1F2 => 0x1F3, +0x1F4 => 0x1F5, +0x1F6 => 0x195, +0x1F7 => 0x1BF, +0x1F8 => 0x1F9, +0x1FA => 0x1FB, +0x1FC => 0x1FD, +0x1FE => 0x1FF, +0x200 => 0x201, +0x202 => 0x203, +0x204 => 0x205, +0x206 => 0x207, +0x208 => 0x209, +0x20A => 0x20B, +0x20C => 0x20D, +0x20E => 0x20F, +0x210 => 0x211, +0x212 => 0x213, +0x214 => 0x215, +0x216 => 0x217, +0x218 => 0x219, +0x21A => 0x21B, +0x21C => 0x21D, +0x21E => 0x21F, +0x220 => 0x19E, +0x222 => 0x223, +0x224 => 0x225, +0x226 => 0x227, +0x228 => 0x229, +0x22A => 0x22B, +0x22C => 0x22D, +0x22E => 0x22F, +0x230 => 0x231, +0x232 => 0x233, +0x23A => 0x2C65, +0x23B => 0x23C, +0x23D => 0x19A, +0x23E => 0x2C66, +0x241 => 0x242, +0x243 => 0x180, +0x244 => 0x289, +0x245 => 0x28C, +0x246 => 0x247, +0x248 => 0x249, +0x24A => 0x24B, +0x24C => 0x24D, +0x24E => 0x24F, +0x345 => 0x3B9, +0x370 => 0x371, +0x372 => 0x373, +0x376 => 0x377, +0x37F => 0x3F3, +0x386 => 0x3AC, +0x388 => 0x3AD, +0x389 => 0x3AE, +0x38A => 0x3AF, +0x38C => 0x3CC, +0x38E => 0x3CD, +0x38F => 0x3CE, +0x391 => 0x3B1, +0x392 => 0x3B2, +0x393 => 0x3B3, +0x394 => 0x3B4, +0x395 => 0x3B5, +0x396 => 0x3B6, +0x397 => 0x3B7, +0x398 => 0x3B8, +0x399 => 0x3B9, +0x39A => 0x3BA, +0x39B => 0x3BB, +0x39C => 0x3BC, +0x39D => 0x3BD, +0x39E => 0x3BE, +0x39F => 0x3BF, +0x3A0 => 0x3C0, +0x3A1 => 0x3C1, +0x3A3 => 0x3C3, +0x3A4 => 0x3C4, +0x3A5 => 0x3C5, +0x3A6 => 0x3C6, +0x3A7 => 0x3C7, +0x3A8 => 0x3C8, +0x3A9 => 0x3C9, +0x3AA => 0x3CA, +0x3AB => 0x3CB, +0x3C2 => 0x3C3, +0x3CF => 0x3D7, +0x3D0 => 0x3B2, +0x3D1 => 0x3B8, +0x3D5 => 0x3C6, +0x3D6 => 0x3C0, +0x3D8 => 0x3D9, +0x3DA => 0x3DB, +0x3DC => 0x3DD, +0x3DE => 0x3DF, +0x3E0 => 0x3E1, +0x3E2 => 0x3E3, +0x3E4 => 0x3E5, +0x3E6 => 0x3E7, +0x3E8 => 0x3E9, +0x3EA => 0x3EB, +0x3EC => 0x3ED, +0x3EE => 0x3EF, +0x3F0 => 0x3BA, +0x3F1 => 0x3C1, +0x3F4 => 0x3B8, +0x3F5 => 0x3B5, +0x3F7 => 0x3F8, +0x3F9 => 0x3F2, +0x3FA => 0x3FB, +0x3FD => 0x37B, +0x3FE => 0x37C, +0x3FF => 0x37D, +0x400 => 0x450, +0x401 => 0x451, +0x402 => 0x452, +0x403 => 0x453, +0x404 => 0x454, +0x405 => 0x455, +0x406 => 0x456, +0x407 => 0x457, +0x408 => 0x458, +0x409 => 0x459, +0x40A => 0x45A, +0x40B => 0x45B, +0x40C => 0x45C, +0x40D => 0x45D, +0x40E => 0x45E, +0x40F => 0x45F, +0x410 => 0x430, +0x411 => 0x431, +0x412 => 0x432, +0x413 => 0x433, +0x414 => 0x434, +0x415 => 0x435, +0x416 => 0x436, +0x417 => 0x437, +0x418 => 0x438, +0x419 => 0x439, +0x41A => 0x43A, +0x41B => 0x43B, +0x41C => 0x43C, +0x41D => 0x43D, +0x41E => 0x43E, +0x41F => 0x43F, +0x420 => 0x440, +0x421 => 0x441, +0x422 => 0x442, +0x423 => 0x443, +0x424 => 0x444, +0x425 => 0x445, +0x426 => 0x446, +0x427 => 0x447, +0x428 => 0x448, +0x429 => 0x449, +0x42A => 0x44A, +0x42B => 0x44B, +0x42C => 0x44C, +0x42D => 0x44D, +0x42E => 0x44E, +0x42F => 0x44F, +0x460 => 0x461, +0x462 => 0x463, +0x464 => 0x465, +0x466 => 0x467, +0x468 => 0x469, +0x46A => 0x46B, +0x46C => 0x46D, +0x46E => 0x46F, +0x470 => 0x471, +0x472 => 0x473, +0x474 => 0x475, +0x476 => 0x477, +0x478 => 0x479, +0x47A => 0x47B, +0x47C => 0x47D, +0x47E => 0x47F, +0x480 => 0x481, +0x48A => 0x48B, +0x48C => 0x48D, +0x48E => 0x48F, +0x490 => 0x491, +0x492 => 0x493, +0x494 => 0x495, +0x496 => 0x497, +0x498 => 0x499, +0x49A => 0x49B, +0x49C => 0x49D, +0x49E => 0x49F, +0x4A0 => 0x4A1, +0x4A2 => 0x4A3, +0x4A4 => 0x4A5, +0x4A6 => 0x4A7, +0x4A8 => 0x4A9, +0x4AA => 0x4AB, +0x4AC => 0x4AD, +0x4AE => 0x4AF, +0x4B0 => 0x4B1, +0x4B2 => 0x4B3, +0x4B4 => 0x4B5, +0x4B6 => 0x4B7, +0x4B8 => 0x4B9, +0x4BA => 0x4BB, +0x4BC => 0x4BD, +0x4BE => 0x4BF, +0x4C0 => 0x4CF, +0x4C1 => 0x4C2, +0x4C3 => 0x4C4, +0x4C5 => 0x4C6, +0x4C7 => 0x4C8, +0x4C9 => 0x4CA, +0x4CB => 0x4CC, +0x4CD => 0x4CE, +0x4D0 => 0x4D1, +0x4D2 => 0x4D3, +0x4D4 => 0x4D5, +0x4D6 => 0x4D7, +0x4D8 => 0x4D9, +0x4DA => 0x4DB, +0x4DC => 0x4DD, +0x4DE => 0x4DF, +0x4E0 => 0x4E1, +0x4E2 => 0x4E3, +0x4E4 => 0x4E5, +0x4E6 => 0x4E7, +0x4E8 => 0x4E9, +0x4EA => 0x4EB, +0x4EC => 0x4ED, +0x4EE => 0x4EF, +0x4F0 => 0x4F1, +0x4F2 => 0x4F3, +0x4F4 => 0x4F5, +0x4F6 => 0x4F7, +0x4F8 => 0x4F9, +0x4FA => 0x4FB, +0x4FC => 0x4FD, +0x4FE => 0x4FF, +0x500 => 0x501, +0x502 => 0x503, +0x504 => 0x505, +0x506 => 0x507, +0x508 => 0x509, +0x50A => 0x50B, +0x50C => 0x50D, +0x50E => 0x50F, +0x510 => 0x511, +0x512 => 0x513, +0x514 => 0x515, +0x516 => 0x517, +0x518 => 0x519, +0x51A => 0x51B, +0x51C => 0x51D, +0x51E => 0x51F, +0x520 => 0x521, +0x522 => 0x523, +0x524 => 0x525, +0x526 => 0x527, +0x528 => 0x529, +0x52A => 0x52B, +0x52C => 0x52D, +0x52E => 0x52F, +0x531 => 0x561, +0x532 => 0x562, +0x533 => 0x563, +0x534 => 0x564, +0x535 => 0x565, +0x536 => 0x566, +0x537 => 0x567, +0x538 => 0x568, +0x539 => 0x569, +0x53A => 0x56A, +0x53B => 0x56B, +0x53C => 0x56C, +0x53D => 0x56D, +0x53E => 0x56E, +0x53F => 0x56F, +0x540 => 0x570, +0x541 => 0x571, +0x542 => 0x572, +0x543 => 0x573, +0x544 => 0x574, +0x545 => 0x575, +0x546 => 0x576, +0x547 => 0x577, +0x548 => 0x578, +0x549 => 0x579, +0x54A => 0x57A, +0x54B => 0x57B, +0x54C => 0x57C, +0x54D => 0x57D, +0x54E => 0x57E, +0x54F => 0x57F, +0x550 => 0x580, +0x551 => 0x581, +0x552 => 0x582, +0x553 => 0x583, +0x554 => 0x584, +0x555 => 0x585, +0x556 => 0x586, +0x10A0 => 0x2D00, +0x10A1 => 0x2D01, +0x10A2 => 0x2D02, +0x10A3 => 0x2D03, +0x10A4 => 0x2D04, +0x10A5 => 0x2D05, +0x10A6 => 0x2D06, +0x10A7 => 0x2D07, +0x10A8 => 0x2D08, +0x10A9 => 0x2D09, +0x10AA => 0x2D0A, +0x10AB => 0x2D0B, +0x10AC => 0x2D0C, +0x10AD => 0x2D0D, +0x10AE => 0x2D0E, +0x10AF => 0x2D0F, +0x10B0 => 0x2D10, +0x10B1 => 0x2D11, +0x10B2 => 0x2D12, +0x10B3 => 0x2D13, +0x10B4 => 0x2D14, +0x10B5 => 0x2D15, +0x10B6 => 0x2D16, +0x10B7 => 0x2D17, +0x10B8 => 0x2D18, +0x10B9 => 0x2D19, +0x10BA => 0x2D1A, +0x10BB => 0x2D1B, +0x10BC => 0x2D1C, +0x10BD => 0x2D1D, +0x10BE => 0x2D1E, +0x10BF => 0x2D1F, +0x10C0 => 0x2D20, +0x10C1 => 0x2D21, +0x10C2 => 0x2D22, +0x10C3 => 0x2D23, +0x10C4 => 0x2D24, +0x10C5 => 0x2D25, +0x10C7 => 0x2D27, +0x10CD => 0x2D2D, +0x13F8 => 0x13F0, +0x13F9 => 0x13F1, +0x13FA => 0x13F2, +0x13FB => 0x13F3, +0x13FC => 0x13F4, +0x13FD => 0x13F5, +0x1C80 => 0x432, +0x1C81 => 0x434, +0x1C82 => 0x43E, +0x1C83 => 0x441, +0x1C84 => 0x442, +0x1C85 => 0x442, +0x1C86 => 0x44A, +0x1C87 => 0x463, +0x1C88 => 0xA64B, +0x1C90 => 0x10D0, +0x1C91 => 0x10D1, +0x1C92 => 0x10D2, +0x1C93 => 0x10D3, +0x1C94 => 0x10D4, +0x1C95 => 0x10D5, +0x1C96 => 0x10D6, +0x1C97 => 0x10D7, +0x1C98 => 0x10D8, +0x1C99 => 0x10D9, +0x1C9A => 0x10DA, +0x1C9B => 0x10DB, +0x1C9C => 0x10DC, +0x1C9D => 0x10DD, +0x1C9E => 0x10DE, +0x1C9F => 0x10DF, +0x1CA0 => 0x10E0, +0x1CA1 => 0x10E1, +0x1CA2 => 0x10E2, +0x1CA3 => 0x10E3, +0x1CA4 => 0x10E4, +0x1CA5 => 0x10E5, +0x1CA6 => 0x10E6, +0x1CA7 => 0x10E7, +0x1CA8 => 0x10E8, +0x1CA9 => 0x10E9, +0x1CAA => 0x10EA, +0x1CAB => 0x10EB, +0x1CAC => 0x10EC, +0x1CAD => 0x10ED, +0x1CAE => 0x10EE, +0x1CAF => 0x10EF, +0x1CB0 => 0x10F0, +0x1CB1 => 0x10F1, +0x1CB2 => 0x10F2, +0x1CB3 => 0x10F3, +0x1CB4 => 0x10F4, +0x1CB5 => 0x10F5, +0x1CB6 => 0x10F6, +0x1CB7 => 0x10F7, +0x1CB8 => 0x10F8, +0x1CB9 => 0x10F9, +0x1CBA => 0x10FA, +0x1CBD => 0x10FD, +0x1CBE => 0x10FE, +0x1CBF => 0x10FF, +0x1E00 => 0x1E01, +0x1E02 => 0x1E03, +0x1E04 => 0x1E05, +0x1E06 => 0x1E07, +0x1E08 => 0x1E09, +0x1E0A => 0x1E0B, +0x1E0C => 0x1E0D, +0x1E0E => 0x1E0F, +0x1E10 => 0x1E11, +0x1E12 => 0x1E13, +0x1E14 => 0x1E15, +0x1E16 => 0x1E17, +0x1E18 => 0x1E19, +0x1E1A => 0x1E1B, +0x1E1C => 0x1E1D, +0x1E1E => 0x1E1F, +0x1E20 => 0x1E21, +0x1E22 => 0x1E23, +0x1E24 => 0x1E25, +0x1E26 => 0x1E27, +0x1E28 => 0x1E29, +0x1E2A => 0x1E2B, +0x1E2C => 0x1E2D, +0x1E2E => 0x1E2F, +0x1E30 => 0x1E31, +0x1E32 => 0x1E33, +0x1E34 => 0x1E35, +0x1E36 => 0x1E37, +0x1E38 => 0x1E39, +0x1E3A => 0x1E3B, +0x1E3C => 0x1E3D, +0x1E3E => 0x1E3F, +0x1E40 => 0x1E41, +0x1E42 => 0x1E43, +0x1E44 => 0x1E45, +0x1E46 => 0x1E47, +0x1E48 => 0x1E49, +0x1E4A => 0x1E4B, +0x1E4C => 0x1E4D, +0x1E4E => 0x1E4F, +0x1E50 => 0x1E51, +0x1E52 => 0x1E53, +0x1E54 => 0x1E55, +0x1E56 => 0x1E57, +0x1E58 => 0x1E59, +0x1E5A => 0x1E5B, +0x1E5C => 0x1E5D, +0x1E5E => 0x1E5F, +0x1E60 => 0x1E61, +0x1E62 => 0x1E63, +0x1E64 => 0x1E65, +0x1E66 => 0x1E67, +0x1E68 => 0x1E69, +0x1E6A => 0x1E6B, +0x1E6C => 0x1E6D, +0x1E6E => 0x1E6F, +0x1E70 => 0x1E71, +0x1E72 => 0x1E73, +0x1E74 => 0x1E75, +0x1E76 => 0x1E77, +0x1E78 => 0x1E79, +0x1E7A => 0x1E7B, +0x1E7C => 0x1E7D, +0x1E7E => 0x1E7F, +0x1E80 => 0x1E81, +0x1E82 => 0x1E83, +0x1E84 => 0x1E85, +0x1E86 => 0x1E87, +0x1E88 => 0x1E89, +0x1E8A => 0x1E8B, +0x1E8C => 0x1E8D, +0x1E8E => 0x1E8F, +0x1E90 => 0x1E91, +0x1E92 => 0x1E93, +0x1E94 => 0x1E95, +0x1E9B => 0x1E61, +0x1E9E => 0xDF, +0x1EA0 => 0x1EA1, +0x1EA2 => 0x1EA3, +0x1EA4 => 0x1EA5, +0x1EA6 => 0x1EA7, +0x1EA8 => 0x1EA9, +0x1EAA => 0x1EAB, +0x1EAC => 0x1EAD, +0x1EAE => 0x1EAF, +0x1EB0 => 0x1EB1, +0x1EB2 => 0x1EB3, +0x1EB4 => 0x1EB5, +0x1EB6 => 0x1EB7, +0x1EB8 => 0x1EB9, +0x1EBA => 0x1EBB, +0x1EBC => 0x1EBD, +0x1EBE => 0x1EBF, +0x1EC0 => 0x1EC1, +0x1EC2 => 0x1EC3, +0x1EC4 => 0x1EC5, +0x1EC6 => 0x1EC7, +0x1EC8 => 0x1EC9, +0x1ECA => 0x1ECB, +0x1ECC => 0x1ECD, +0x1ECE => 0x1ECF, +0x1ED0 => 0x1ED1, +0x1ED2 => 0x1ED3, +0x1ED4 => 0x1ED5, +0x1ED6 => 0x1ED7, +0x1ED8 => 0x1ED9, +0x1EDA => 0x1EDB, +0x1EDC => 0x1EDD, +0x1EDE => 0x1EDF, +0x1EE0 => 0x1EE1, +0x1EE2 => 0x1EE3, +0x1EE4 => 0x1EE5, +0x1EE6 => 0x1EE7, +0x1EE8 => 0x1EE9, +0x1EEA => 0x1EEB, +0x1EEC => 0x1EED, +0x1EEE => 0x1EEF, +0x1EF0 => 0x1EF1, +0x1EF2 => 0x1EF3, +0x1EF4 => 0x1EF5, +0x1EF6 => 0x1EF7, +0x1EF8 => 0x1EF9, +0x1EFA => 0x1EFB, +0x1EFC => 0x1EFD, +0x1EFE => 0x1EFF, +0x1F08 => 0x1F00, +0x1F09 => 0x1F01, +0x1F0A => 0x1F02, +0x1F0B => 0x1F03, +0x1F0C => 0x1F04, +0x1F0D => 0x1F05, +0x1F0E => 0x1F06, +0x1F0F => 0x1F07, +0x1F18 => 0x1F10, +0x1F19 => 0x1F11, +0x1F1A => 0x1F12, +0x1F1B => 0x1F13, +0x1F1C => 0x1F14, +0x1F1D => 0x1F15, +0x1F28 => 0x1F20, +0x1F29 => 0x1F21, +0x1F2A => 0x1F22, +0x1F2B => 0x1F23, +0x1F2C => 0x1F24, +0x1F2D => 0x1F25, +0x1F2E => 0x1F26, +0x1F2F => 0x1F27, +0x1F38 => 0x1F30, +0x1F39 => 0x1F31, +0x1F3A => 0x1F32, +0x1F3B => 0x1F33, +0x1F3C => 0x1F34, +0x1F3D => 0x1F35, +0x1F3E => 0x1F36, +0x1F3F => 0x1F37, +0x1F48 => 0x1F40, +0x1F49 => 0x1F41, +0x1F4A => 0x1F42, +0x1F4B => 0x1F43, +0x1F4C => 0x1F44, +0x1F4D => 0x1F45, +0x1F59 => 0x1F51, +0x1F5B => 0x1F53, +0x1F5D => 0x1F55, +0x1F5F => 0x1F57, +0x1F68 => 0x1F60, +0x1F69 => 0x1F61, +0x1F6A => 0x1F62, +0x1F6B => 0x1F63, +0x1F6C => 0x1F64, +0x1F6D => 0x1F65, +0x1F6E => 0x1F66, +0x1F6F => 0x1F67, +0x1F88 => 0x1F80, +0x1F89 => 0x1F81, +0x1F8A => 0x1F82, +0x1F8B => 0x1F83, +0x1F8C => 0x1F84, +0x1F8D => 0x1F85, +0x1F8E => 0x1F86, +0x1F8F => 0x1F87, +0x1F98 => 0x1F90, +0x1F99 => 0x1F91, +0x1F9A => 0x1F92, +0x1F9B => 0x1F93, +0x1F9C => 0x1F94, +0x1F9D => 0x1F95, +0x1F9E => 0x1F96, +0x1F9F => 0x1F97, +0x1FA8 => 0x1FA0, +0x1FA9 => 0x1FA1, +0x1FAA => 0x1FA2, +0x1FAB => 0x1FA3, +0x1FAC => 0x1FA4, +0x1FAD => 0x1FA5, +0x1FAE => 0x1FA6, +0x1FAF => 0x1FA7, +0x1FB8 => 0x1FB0, +0x1FB9 => 0x1FB1, +0x1FBA => 0x1F70, +0x1FBB => 0x1F71, +0x1FBC => 0x1FB3, +0x1FBE => 0x3B9, +0x1FC8 => 0x1F72, +0x1FC9 => 0x1F73, +0x1FCA => 0x1F74, +0x1FCB => 0x1F75, +0x1FCC => 0x1FC3, +0x1FD8 => 0x1FD0, +0x1FD9 => 0x1FD1, +0x1FDA => 0x1F76, +0x1FDB => 0x1F77, +0x1FE8 => 0x1FE0, +0x1FE9 => 0x1FE1, +0x1FEA => 0x1F7A, +0x1FEB => 0x1F7B, +0x1FEC => 0x1FE5, +0x1FF8 => 0x1F78, +0x1FF9 => 0x1F79, +0x1FFA => 0x1F7C, +0x1FFB => 0x1F7D, +0x1FFC => 0x1FF3, +0x2126 => 0x3C9, +0x212A => 0x6B, +0x212B => 0xE5, +0x2132 => 0x214E, +0x2160 => 0x2170, +0x2161 => 0x2171, +0x2162 => 0x2172, +0x2163 => 0x2173, +0x2164 => 0x2174, +0x2165 => 0x2175, +0x2166 => 0x2176, +0x2167 => 0x2177, +0x2168 => 0x2178, +0x2169 => 0x2179, +0x216A => 0x217A, +0x216B => 0x217B, +0x216C => 0x217C, +0x216D => 0x217D, +0x216E => 0x217E, +0x216F => 0x217F, +0x2183 => 0x2184, +0x24B6 => 0x24D0, +0x24B7 => 0x24D1, +0x24B8 => 0x24D2, +0x24B9 => 0x24D3, +0x24BA => 0x24D4, +0x24BB => 0x24D5, +0x24BC => 0x24D6, +0x24BD => 0x24D7, +0x24BE => 0x24D8, +0x24BF => 0x24D9, +0x24C0 => 0x24DA, +0x24C1 => 0x24DB, +0x24C2 => 0x24DC, +0x24C3 => 0x24DD, +0x24C4 => 0x24DE, +0x24C5 => 0x24DF, +0x24C6 => 0x24E0, +0x24C7 => 0x24E1, +0x24C8 => 0x24E2, +0x24C9 => 0x24E3, +0x24CA => 0x24E4, +0x24CB => 0x24E5, +0x24CC => 0x24E6, +0x24CD => 0x24E7, +0x24CE => 0x24E8, +0x24CF => 0x24E9, +0x2C00 => 0x2C30, +0x2C01 => 0x2C31, +0x2C02 => 0x2C32, +0x2C03 => 0x2C33, +0x2C04 => 0x2C34, +0x2C05 => 0x2C35, +0x2C06 => 0x2C36, +0x2C07 => 0x2C37, +0x2C08 => 0x2C38, +0x2C09 => 0x2C39, +0x2C0A => 0x2C3A, +0x2C0B => 0x2C3B, +0x2C0C => 0x2C3C, +0x2C0D => 0x2C3D, +0x2C0E => 0x2C3E, +0x2C0F => 0x2C3F, +0x2C10 => 0x2C40, +0x2C11 => 0x2C41, +0x2C12 => 0x2C42, +0x2C13 => 0x2C43, +0x2C14 => 0x2C44, +0x2C15 => 0x2C45, +0x2C16 => 0x2C46, +0x2C17 => 0x2C47, +0x2C18 => 0x2C48, +0x2C19 => 0x2C49, +0x2C1A => 0x2C4A, +0x2C1B => 0x2C4B, +0x2C1C => 0x2C4C, +0x2C1D => 0x2C4D, +0x2C1E => 0x2C4E, +0x2C1F => 0x2C4F, +0x2C20 => 0x2C50, +0x2C21 => 0x2C51, +0x2C22 => 0x2C52, +0x2C23 => 0x2C53, +0x2C24 => 0x2C54, +0x2C25 => 0x2C55, +0x2C26 => 0x2C56, +0x2C27 => 0x2C57, +0x2C28 => 0x2C58, +0x2C29 => 0x2C59, +0x2C2A => 0x2C5A, +0x2C2B => 0x2C5B, +0x2C2C => 0x2C5C, +0x2C2D => 0x2C5D, +0x2C2E => 0x2C5E, +0x2C60 => 0x2C61, +0x2C62 => 0x26B, +0x2C63 => 0x1D7D, +0x2C64 => 0x27D, +0x2C67 => 0x2C68, +0x2C69 => 0x2C6A, +0x2C6B => 0x2C6C, +0x2C6D => 0x251, +0x2C6E => 0x271, +0x2C6F => 0x250, +0x2C70 => 0x252, +0x2C72 => 0x2C73, +0x2C75 => 0x2C76, +0x2C7E => 0x23F, +0x2C7F => 0x240, +0x2C80 => 0x2C81, +0x2C82 => 0x2C83, +0x2C84 => 0x2C85, +0x2C86 => 0x2C87, +0x2C88 => 0x2C89, +0x2C8A => 0x2C8B, +0x2C8C => 0x2C8D, +0x2C8E => 0x2C8F, +0x2C90 => 0x2C91, +0x2C92 => 0x2C93, +0x2C94 => 0x2C95, +0x2C96 => 0x2C97, +0x2C98 => 0x2C99, +0x2C9A => 0x2C9B, +0x2C9C => 0x2C9D, +0x2C9E => 0x2C9F, +0x2CA0 => 0x2CA1, +0x2CA2 => 0x2CA3, +0x2CA4 => 0x2CA5, +0x2CA6 => 0x2CA7, +0x2CA8 => 0x2CA9, +0x2CAA => 0x2CAB, +0x2CAC => 0x2CAD, +0x2CAE => 0x2CAF, +0x2CB0 => 0x2CB1, +0x2CB2 => 0x2CB3, +0x2CB4 => 0x2CB5, +0x2CB6 => 0x2CB7, +0x2CB8 => 0x2CB9, +0x2CBA => 0x2CBB, +0x2CBC => 0x2CBD, +0x2CBE => 0x2CBF, +0x2CC0 => 0x2CC1, +0x2CC2 => 0x2CC3, +0x2CC4 => 0x2CC5, +0x2CC6 => 0x2CC7, +0x2CC8 => 0x2CC9, +0x2CCA => 0x2CCB, +0x2CCC => 0x2CCD, +0x2CCE => 0x2CCF, +0x2CD0 => 0x2CD1, +0x2CD2 => 0x2CD3, +0x2CD4 => 0x2CD5, +0x2CD6 => 0x2CD7, +0x2CD8 => 0x2CD9, +0x2CDA => 0x2CDB, +0x2CDC => 0x2CDD, +0x2CDE => 0x2CDF, +0x2CE0 => 0x2CE1, +0x2CE2 => 0x2CE3, +0x2CEB => 0x2CEC, +0x2CED => 0x2CEE, +0x2CF2 => 0x2CF3, +0xA640 => 0xA641, +0xA642 => 0xA643, +0xA644 => 0xA645, +0xA646 => 0xA647, +0xA648 => 0xA649, +0xA64A => 0xA64B, +0xA64C => 0xA64D, +0xA64E => 0xA64F, +0xA650 => 0xA651, +0xA652 => 0xA653, +0xA654 => 0xA655, +0xA656 => 0xA657, +0xA658 => 0xA659, +0xA65A => 0xA65B, +0xA65C => 0xA65D, +0xA65E => 0xA65F, +0xA660 => 0xA661, +0xA662 => 0xA663, +0xA664 => 0xA665, +0xA666 => 0xA667, +0xA668 => 0xA669, +0xA66A => 0xA66B, +0xA66C => 0xA66D, +0xA680 => 0xA681, +0xA682 => 0xA683, +0xA684 => 0xA685, +0xA686 => 0xA687, +0xA688 => 0xA689, +0xA68A => 0xA68B, +0xA68C => 0xA68D, +0xA68E => 0xA68F, +0xA690 => 0xA691, +0xA692 => 0xA693, +0xA694 => 0xA695, +0xA696 => 0xA697, +0xA698 => 0xA699, +0xA69A => 0xA69B, +0xA722 => 0xA723, +0xA724 => 0xA725, +0xA726 => 0xA727, +0xA728 => 0xA729, +0xA72A => 0xA72B, +0xA72C => 0xA72D, +0xA72E => 0xA72F, +0xA732 => 0xA733, +0xA734 => 0xA735, +0xA736 => 0xA737, +0xA738 => 0xA739, +0xA73A => 0xA73B, +0xA73C => 0xA73D, +0xA73E => 0xA73F, +0xA740 => 0xA741, +0xA742 => 0xA743, +0xA744 => 0xA745, +0xA746 => 0xA747, +0xA748 => 0xA749, +0xA74A => 0xA74B, +0xA74C => 0xA74D, +0xA74E => 0xA74F, +0xA750 => 0xA751, +0xA752 => 0xA753, +0xA754 => 0xA755, +0xA756 => 0xA757, +0xA758 => 0xA759, +0xA75A => 0xA75B, +0xA75C => 0xA75D, +0xA75E => 0xA75F, +0xA760 => 0xA761, +0xA762 => 0xA763, +0xA764 => 0xA765, +0xA766 => 0xA767, +0xA768 => 0xA769, +0xA76A => 0xA76B, +0xA76C => 0xA76D, +0xA76E => 0xA76F, +0xA779 => 0xA77A, +0xA77B => 0xA77C, +0xA77D => 0x1D79, +0xA77E => 0xA77F, +0xA780 => 0xA781, +0xA782 => 0xA783, +0xA784 => 0xA785, +0xA786 => 0xA787, +0xA78B => 0xA78C, +0xA78D => 0x265, +0xA790 => 0xA791, +0xA792 => 0xA793, +0xA796 => 0xA797, +0xA798 => 0xA799, +0xA79A => 0xA79B, +0xA79C => 0xA79D, +0xA79E => 0xA79F, +0xA7A0 => 0xA7A1, +0xA7A2 => 0xA7A3, +0xA7A4 => 0xA7A5, +0xA7A6 => 0xA7A7, +0xA7A8 => 0xA7A9, +0xA7AA => 0x266, +0xA7AB => 0x25C, +0xA7AC => 0x261, +0xA7AD => 0x26C, +0xA7AE => 0x26A, +0xA7B0 => 0x29E, +0xA7B1 => 0x287, +0xA7B2 => 0x29D, +0xA7B3 => 0xAB53, +0xA7B4 => 0xA7B5, +0xA7B6 => 0xA7B7, +0xA7B8 => 0xA7B9, +0xA7BA => 0xA7BB, +0xA7BC => 0xA7BD, +0xA7BE => 0xA7BF, +0xA7C2 => 0xA7C3, +0xA7C4 => 0xA794, +0xA7C5 => 0x282, +0xA7C6 => 0x1D8E, +0xA7C7 => 0xA7C8, +0xA7C9 => 0xA7CA, +0xA7F5 => 0xA7F6, +0xAB70 => 0x13A0, +0xAB71 => 0x13A1, +0xAB72 => 0x13A2, +0xAB73 => 0x13A3, +0xAB74 => 0x13A4, +0xAB75 => 0x13A5, +0xAB76 => 0x13A6, +0xAB77 => 0x13A7, +0xAB78 => 0x13A8, +0xAB79 => 0x13A9, +0xAB7A => 0x13AA, +0xAB7B => 0x13AB, +0xAB7C => 0x13AC, +0xAB7D => 0x13AD, +0xAB7E => 0x13AE, +0xAB7F => 0x13AF, +0xAB80 => 0x13B0, +0xAB81 => 0x13B1, +0xAB82 => 0x13B2, +0xAB83 => 0x13B3, +0xAB84 => 0x13B4, +0xAB85 => 0x13B5, +0xAB86 => 0x13B6, +0xAB87 => 0x13B7, +0xAB88 => 0x13B8, +0xAB89 => 0x13B9, +0xAB8A => 0x13BA, +0xAB8B => 0x13BB, +0xAB8C => 0x13BC, +0xAB8D => 0x13BD, +0xAB8E => 0x13BE, +0xAB8F => 0x13BF, +0xAB90 => 0x13C0, +0xAB91 => 0x13C1, +0xAB92 => 0x13C2, +0xAB93 => 0x13C3, +0xAB94 => 0x13C4, +0xAB95 => 0x13C5, +0xAB96 => 0x13C6, +0xAB97 => 0x13C7, +0xAB98 => 0x13C8, +0xAB99 => 0x13C9, +0xAB9A => 0x13CA, +0xAB9B => 0x13CB, +0xAB9C => 0x13CC, +0xAB9D => 0x13CD, +0xAB9E => 0x13CE, +0xAB9F => 0x13CF, +0xABA0 => 0x13D0, +0xABA1 => 0x13D1, +0xABA2 => 0x13D2, +0xABA3 => 0x13D3, +0xABA4 => 0x13D4, +0xABA5 => 0x13D5, +0xABA6 => 0x13D6, +0xABA7 => 0x13D7, +0xABA8 => 0x13D8, +0xABA9 => 0x13D9, +0xABAA => 0x13DA, +0xABAB => 0x13DB, +0xABAC => 0x13DC, +0xABAD => 0x13DD, +0xABAE => 0x13DE, +0xABAF => 0x13DF, +0xABB0 => 0x13E0, +0xABB1 => 0x13E1, +0xABB2 => 0x13E2, +0xABB3 => 0x13E3, +0xABB4 => 0x13E4, +0xABB5 => 0x13E5, +0xABB6 => 0x13E6, +0xABB7 => 0x13E7, +0xABB8 => 0x13E8, +0xABB9 => 0x13E9, +0xABBA => 0x13EA, +0xABBB => 0x13EB, +0xABBC => 0x13EC, +0xABBD => 0x13ED, +0xABBE => 0x13EE, +0xABBF => 0x13EF, +0xFF21 => 0xFF41, +0xFF22 => 0xFF42, +0xFF23 => 0xFF43, +0xFF24 => 0xFF44, +0xFF25 => 0xFF45, +0xFF26 => 0xFF46, +0xFF27 => 0xFF47, +0xFF28 => 0xFF48, +0xFF29 => 0xFF49, +0xFF2A => 0xFF4A, +0xFF2B => 0xFF4B, +0xFF2C => 0xFF4C, +0xFF2D => 0xFF4D, +0xFF2E => 0xFF4E, +0xFF2F => 0xFF4F, +0xFF30 => 0xFF50, +0xFF31 => 0xFF51, +0xFF32 => 0xFF52, +0xFF33 => 0xFF53, +0xFF34 => 0xFF54, +0xFF35 => 0xFF55, +0xFF36 => 0xFF56, +0xFF37 => 0xFF57, +0xFF38 => 0xFF58, +0xFF39 => 0xFF59, +0xFF3A => 0xFF5A, +0x10400 => 0x10428, +0x10401 => 0x10429, +0x10402 => 0x1042A, +0x10403 => 0x1042B, +0x10404 => 0x1042C, +0x10405 => 0x1042D, +0x10406 => 0x1042E, +0x10407 => 0x1042F, +0x10408 => 0x10430, +0x10409 => 0x10431, +0x1040A => 0x10432, +0x1040B => 0x10433, +0x1040C => 0x10434, +0x1040D => 0x10435, +0x1040E => 0x10436, +0x1040F => 0x10437, +0x10410 => 0x10438, +0x10411 => 0x10439, +0x10412 => 0x1043A, +0x10413 => 0x1043B, +0x10414 => 0x1043C, +0x10415 => 0x1043D, +0x10416 => 0x1043E, +0x10417 => 0x1043F, +0x10418 => 0x10440, +0x10419 => 0x10441, +0x1041A => 0x10442, +0x1041B => 0x10443, +0x1041C => 0x10444, +0x1041D => 0x10445, +0x1041E => 0x10446, +0x1041F => 0x10447, +0x10420 => 0x10448, +0x10421 => 0x10449, +0x10422 => 0x1044A, +0x10423 => 0x1044B, +0x10424 => 0x1044C, +0x10425 => 0x1044D, +0x10426 => 0x1044E, +0x10427 => 0x1044F, +0x104B0 => 0x104D8, +0x104B1 => 0x104D9, +0x104B2 => 0x104DA, +0x104B3 => 0x104DB, +0x104B4 => 0x104DC, +0x104B5 => 0x104DD, +0x104B6 => 0x104DE, +0x104B7 => 0x104DF, +0x104B8 => 0x104E0, +0x104B9 => 0x104E1, +0x104BA => 0x104E2, +0x104BB => 0x104E3, +0x104BC => 0x104E4, +0x104BD => 0x104E5, +0x104BE => 0x104E6, +0x104BF => 0x104E7, +0x104C0 => 0x104E8, +0x104C1 => 0x104E9, +0x104C2 => 0x104EA, +0x104C3 => 0x104EB, +0x104C4 => 0x104EC, +0x104C5 => 0x104ED, +0x104C6 => 0x104EE, +0x104C7 => 0x104EF, +0x104C8 => 0x104F0, +0x104C9 => 0x104F1, +0x104CA => 0x104F2, +0x104CB => 0x104F3, +0x104CC => 0x104F4, +0x104CD => 0x104F5, +0x104CE => 0x104F6, +0x104CF => 0x104F7, +0x104D0 => 0x104F8, +0x104D1 => 0x104F9, +0x104D2 => 0x104FA, +0x104D3 => 0x104FB, +0x10C80 => 0x10CC0, +0x10C81 => 0x10CC1, +0x10C82 => 0x10CC2, +0x10C83 => 0x10CC3, +0x10C84 => 0x10CC4, +0x10C85 => 0x10CC5, +0x10C86 => 0x10CC6, +0x10C87 => 0x10CC7, +0x10C88 => 0x10CC8, +0x10C89 => 0x10CC9, +0x10C8A => 0x10CCA, +0x10C8B => 0x10CCB, +0x10C8C => 0x10CCC, +0x10C8D => 0x10CCD, +0x10C8E => 0x10CCE, +0x10C8F => 0x10CCF, +0x10C90 => 0x10CD0, +0x10C91 => 0x10CD1, +0x10C92 => 0x10CD2, +0x10C93 => 0x10CD3, +0x10C94 => 0x10CD4, +0x10C95 => 0x10CD5, +0x10C96 => 0x10CD6, +0x10C97 => 0x10CD7, +0x10C98 => 0x10CD8, +0x10C99 => 0x10CD9, +0x10C9A => 0x10CDA, +0x10C9B => 0x10CDB, +0x10C9C => 0x10CDC, +0x10C9D => 0x10CDD, +0x10C9E => 0x10CDE, +0x10C9F => 0x10CDF, +0x10CA0 => 0x10CE0, +0x10CA1 => 0x10CE1, +0x10CA2 => 0x10CE2, +0x10CA3 => 0x10CE3, +0x10CA4 => 0x10CE4, +0x10CA5 => 0x10CE5, +0x10CA6 => 0x10CE6, +0x10CA7 => 0x10CE7, +0x10CA8 => 0x10CE8, +0x10CA9 => 0x10CE9, +0x10CAA => 0x10CEA, +0x10CAB => 0x10CEB, +0x10CAC => 0x10CEC, +0x10CAD => 0x10CED, +0x10CAE => 0x10CEE, +0x10CAF => 0x10CEF, +0x10CB0 => 0x10CF0, +0x10CB1 => 0x10CF1, +0x10CB2 => 0x10CF2, +0x118A0 => 0x118C0, +0x118A1 => 0x118C1, +0x118A2 => 0x118C2, +0x118A3 => 0x118C3, +0x118A4 => 0x118C4, +0x118A5 => 0x118C5, +0x118A6 => 0x118C6, +0x118A7 => 0x118C7, +0x118A8 => 0x118C8, +0x118A9 => 0x118C9, +0x118AA => 0x118CA, +0x118AB => 0x118CB, +0x118AC => 0x118CC, +0x118AD => 0x118CD, +0x118AE => 0x118CE, +0x118AF => 0x118CF, +0x118B0 => 0x118D0, +0x118B1 => 0x118D1, +0x118B2 => 0x118D2, +0x118B3 => 0x118D3, +0x118B4 => 0x118D4, +0x118B5 => 0x118D5, +0x118B6 => 0x118D6, +0x118B7 => 0x118D7, +0x118B8 => 0x118D8, +0x118B9 => 0x118D9, +0x118BA => 0x118DA, +0x118BB => 0x118DB, +0x118BC => 0x118DC, +0x118BD => 0x118DD, +0x118BE => 0x118DE, +0x118BF => 0x118DF, +0x16E40 => 0x16E60, +0x16E41 => 0x16E61, +0x16E42 => 0x16E62, +0x16E43 => 0x16E63, +0x16E44 => 0x16E64, +0x16E45 => 0x16E65, +0x16E46 => 0x16E66, +0x16E47 => 0x16E67, +0x16E48 => 0x16E68, +0x16E49 => 0x16E69, +0x16E4A => 0x16E6A, +0x16E4B => 0x16E6B, +0x16E4C => 0x16E6C, +0x16E4D => 0x16E6D, +0x16E4E => 0x16E6E, +0x16E4F => 0x16E6F, +0x16E50 => 0x16E70, +0x16E51 => 0x16E71, +0x16E52 => 0x16E72, +0x16E53 => 0x16E73, +0x16E54 => 0x16E74, +0x16E55 => 0x16E75, +0x16E56 => 0x16E76, +0x16E57 => 0x16E77, +0x16E58 => 0x16E78, +0x16E59 => 0x16E79, +0x16E5A => 0x16E7A, +0x16E5B => 0x16E7B, +0x16E5C => 0x16E7C, +0x16E5D => 0x16E7D, +0x16E5E => 0x16E7E, +0x16E5F => 0x16E7F, +0x1E900 => 0x1E922, +0x1E901 => 0x1E923, +0x1E902 => 0x1E924, +0x1E903 => 0x1E925, +0x1E904 => 0x1E926, +0x1E905 => 0x1E927, +0x1E906 => 0x1E928, +0x1E907 => 0x1E929, +0x1E908 => 0x1E92A, +0x1E909 => 0x1E92B, +0x1E90A => 0x1E92C, +0x1E90B => 0x1E92D, +0x1E90C => 0x1E92E, +0x1E90D => 0x1E92F, +0x1E90E => 0x1E930, +0x1E90F => 0x1E931, +0x1E910 => 0x1E932, +0x1E911 => 0x1E933, +0x1E912 => 0x1E934, +0x1E913 => 0x1E935, +0x1E914 => 0x1E936, +0x1E915 => 0x1E937, +0x1E916 => 0x1E938, +0x1E917 => 0x1E939, +0x1E918 => 0x1E93A, +0x1E919 => 0x1E93B, +0x1E91A => 0x1E93C, +0x1E91B => 0x1E93D, +0x1E91C => 0x1E93E, +0x1E91D => 0x1E93F, +0x1E91E => 0x1E940, +0x1E91F => 0x1E941, +0x1E920 => 0x1E942, +0x1E921 => 0x1E943, +]; diff --git a/res/lower.php b/res/lower.php index 32efe87..b5697d1 100644 --- a/res/lower.php +++ b/res/lower.php @@ -1,6628 +1,1396 @@ - array ( - 0 => 97, - 1 => 'a', - ), - 66 => - array ( - 0 => 98, - 1 => 'b', - ), - 67 => - array ( - 0 => 99, - 1 => 'c', - ), - 68 => - array ( - 0 => 100, - 1 => 'd', - ), - 69 => - array ( - 0 => 101, - 1 => 'e', - ), - 70 => - array ( - 0 => 102, - 1 => 'f', - ), - 71 => - array ( - 0 => 103, - 1 => 'g', - ), - 72 => - array ( - 0 => 104, - 1 => 'h', - ), - 73 => - array ( - 0 => 105, - 1 => 'i', - ), - 74 => - array ( - 0 => 106, - 1 => 'j', - ), - 75 => - array ( - 0 => 107, - 1 => 'k', - ), - 76 => - array ( - 0 => 108, - 1 => 'l', - ), - 77 => - array ( - 0 => 109, - 1 => 'm', - ), - 78 => - array ( - 0 => 110, - 1 => 'n', - ), - 79 => - array ( - 0 => 111, - 1 => 'o', - ), - 80 => - array ( - 0 => 112, - 1 => 'p', - ), - 81 => - array ( - 0 => 113, - 1 => 'q', - ), - 82 => - array ( - 0 => 114, - 1 => 'r', - ), - 83 => - array ( - 0 => 115, - 1 => 's', - ), - 84 => - array ( - 0 => 116, - 1 => 't', - ), - 85 => - array ( - 0 => 117, - 1 => 'u', - ), - 86 => - array ( - 0 => 118, - 1 => 'v', - ), - 87 => - array ( - 0 => 119, - 1 => 'w', - ), - 88 => - array ( - 0 => 120, - 1 => 'x', - ), - 89 => - array ( - 0 => 121, - 1 => 'y', - ), - 90 => - array ( - 0 => 122, - 1 => 'z', - ), - 181 => - array ( - 0 => 956, - 1 => 'μ', - ), - 192 => - array ( - 0 => 224, - 1 => 'à', - ), - 193 => - array ( - 0 => 225, - 1 => 'á', - ), - 194 => - array ( - 0 => 226, - 1 => 'â', - ), - 195 => - array ( - 0 => 227, - 1 => 'ã', - ), - 196 => - array ( - 0 => 228, - 1 => 'ä', - ), - 197 => - array ( - 0 => 229, - 1 => 'å', - ), - 198 => - array ( - 0 => 230, - 1 => 'æ', - ), - 199 => - array ( - 0 => 231, - 1 => 'ç', - ), - 200 => - array ( - 0 => 232, - 1 => 'è', - ), - 201 => - array ( - 0 => 233, - 1 => 'é', - ), - 202 => - array ( - 0 => 234, - 1 => 'ê', - ), - 203 => - array ( - 0 => 235, - 1 => 'ë', - ), - 204 => - array ( - 0 => 236, - 1 => 'ì', - ), - 205 => - array ( - 0 => 237, - 1 => 'í', - ), - 206 => - array ( - 0 => 238, - 1 => 'î', - ), - 207 => - array ( - 0 => 239, - 1 => 'ï', - ), - 208 => - array ( - 0 => 240, - 1 => 'ð', - ), - 209 => - array ( - 0 => 241, - 1 => 'ñ', - ), - 210 => - array ( - 0 => 242, - 1 => 'ò', - ), - 211 => - array ( - 0 => 243, - 1 => 'ó', - ), - 212 => - array ( - 0 => 244, - 1 => 'ô', - ), - 213 => - array ( - 0 => 245, - 1 => 'õ', - ), - 214 => - array ( - 0 => 246, - 1 => 'ö', - ), - 216 => - array ( - 0 => 248, - 1 => 'ø', - ), - 217 => - array ( - 0 => 249, - 1 => 'ù', - ), - 218 => - array ( - 0 => 250, - 1 => 'ú', - ), - 219 => - array ( - 0 => 251, - 1 => 'û', - ), - 220 => - array ( - 0 => 252, - 1 => 'ü', - ), - 221 => - array ( - 0 => 253, - 1 => 'ý', - ), - 222 => - array ( - 0 => 254, - 1 => 'þ', - ), - 256 => - array ( - 0 => 257, - 1 => 'ā', - ), - 258 => - array ( - 0 => 259, - 1 => 'ă', - ), - 260 => - array ( - 0 => 261, - 1 => 'ą', - ), - 262 => - array ( - 0 => 263, - 1 => 'ć', - ), - 264 => - array ( - 0 => 265, - 1 => 'ĉ', - ), - 266 => - array ( - 0 => 267, - 1 => 'ċ', - ), - 268 => - array ( - 0 => 269, - 1 => 'č', - ), - 270 => - array ( - 0 => 271, - 1 => 'ď', - ), - 272 => - array ( - 0 => 273, - 1 => 'đ', - ), - 274 => - array ( - 0 => 275, - 1 => 'ē', - ), - 276 => - array ( - 0 => 277, - 1 => 'ĕ', - ), - 278 => - array ( - 0 => 279, - 1 => 'ė', - ), - 280 => - array ( - 0 => 281, - 1 => 'ę', - ), - 282 => - array ( - 0 => 283, - 1 => 'ě', - ), - 284 => - array ( - 0 => 285, - 1 => 'ĝ', - ), - 286 => - array ( - 0 => 287, - 1 => 'ğ', - ), - 288 => - array ( - 0 => 289, - 1 => 'ġ', - ), - 290 => - array ( - 0 => 291, - 1 => 'ģ', - ), - 292 => - array ( - 0 => 293, - 1 => 'ĥ', - ), - 294 => - array ( - 0 => 295, - 1 => 'ħ', - ), - 296 => - array ( - 0 => 297, - 1 => 'ĩ', - ), - 298 => - array ( - 0 => 299, - 1 => 'ī', - ), - 300 => - array ( - 0 => 301, - 1 => 'ĭ', - ), - 302 => - array ( - 0 => 303, - 1 => 'į', - ), - 306 => - array ( - 0 => 307, - 1 => 'ij', - ), - 308 => - array ( - 0 => 309, - 1 => 'ĵ', - ), - 310 => - array ( - 0 => 311, - 1 => 'ķ', - ), - 313 => - array ( - 0 => 314, - 1 => 'ĺ', - ), - 315 => - array ( - 0 => 316, - 1 => 'ļ', - ), - 317 => - array ( - 0 => 318, - 1 => 'ľ', - ), - 319 => - array ( - 0 => 320, - 1 => 'ŀ', - ), - 321 => - array ( - 0 => 322, - 1 => 'ł', - ), - 323 => - array ( - 0 => 324, - 1 => 'ń', - ), - 325 => - array ( - 0 => 326, - 1 => 'ņ', - ), - 327 => - array ( - 0 => 328, - 1 => 'ň', - ), - 330 => - array ( - 0 => 331, - 1 => 'ŋ', - ), - 332 => - array ( - 0 => 333, - 1 => 'ō', - ), - 334 => - array ( - 0 => 335, - 1 => 'ŏ', - ), - 336 => - array ( - 0 => 337, - 1 => 'ő', - ), - 338 => - array ( - 0 => 339, - 1 => 'œ', - ), - 340 => - array ( - 0 => 341, - 1 => 'ŕ', - ), - 342 => - array ( - 0 => 343, - 1 => 'ŗ', - ), - 344 => - array ( - 0 => 345, - 1 => 'ř', - ), - 346 => - array ( - 0 => 347, - 1 => 'ś', - ), - 348 => - array ( - 0 => 349, - 1 => 'ŝ', - ), - 350 => - array ( - 0 => 351, - 1 => 'ş', - ), - 352 => - array ( - 0 => 353, - 1 => 'š', - ), - 354 => - array ( - 0 => 355, - 1 => 'ţ', - ), - 356 => - array ( - 0 => 357, - 1 => 'ť', - ), - 358 => - array ( - 0 => 359, - 1 => 'ŧ', - ), - 360 => - array ( - 0 => 361, - 1 => 'ũ', - ), - 362 => - array ( - 0 => 363, - 1 => 'ū', - ), - 364 => - array ( - 0 => 365, - 1 => 'ŭ', - ), - 366 => - array ( - 0 => 367, - 1 => 'ů', - ), - 368 => - array ( - 0 => 369, - 1 => 'ű', - ), - 370 => - array ( - 0 => 371, - 1 => 'ų', - ), - 372 => - array ( - 0 => 373, - 1 => 'ŵ', - ), - 374 => - array ( - 0 => 375, - 1 => 'ŷ', - ), - 376 => - array ( - 0 => 255, - 1 => 'ÿ', - ), - 377 => - array ( - 0 => 378, - 1 => 'ź', - ), - 379 => - array ( - 0 => 380, - 1 => 'ż', - ), - 381 => - array ( - 0 => 382, - 1 => 'ž', - ), - 383 => - array ( - 0 => 115, - 1 => 's', - ), - 385 => - array ( - 0 => 595, - 1 => 'ɓ', - ), - 386 => - array ( - 0 => 387, - 1 => 'ƃ', - ), - 388 => - array ( - 0 => 389, - 1 => 'ƅ', - ), - 390 => - array ( - 0 => 596, - 1 => 'ɔ', - ), - 391 => - array ( - 0 => 392, - 1 => 'ƈ', - ), - 393 => - array ( - 0 => 598, - 1 => 'ɖ', - ), - 394 => - array ( - 0 => 599, - 1 => 'ɗ', - ), - 395 => - array ( - 0 => 396, - 1 => 'ƌ', - ), - 398 => - array ( - 0 => 477, - 1 => 'ǝ', - ), - 399 => - array ( - 0 => 601, - 1 => 'ə', - ), - 400 => - array ( - 0 => 603, - 1 => 'ɛ', - ), - 401 => - array ( - 0 => 402, - 1 => 'ƒ', - ), - 403 => - array ( - 0 => 608, - 1 => 'ɠ', - ), - 404 => - array ( - 0 => 611, - 1 => 'ɣ', - ), - 406 => - array ( - 0 => 617, - 1 => 'ɩ', - ), - 407 => - array ( - 0 => 616, - 1 => 'ɨ', - ), - 408 => - array ( - 0 => 409, - 1 => 'ƙ', - ), - 412 => - array ( - 0 => 623, - 1 => 'ɯ', - ), - 413 => - array ( - 0 => 626, - 1 => 'ɲ', - ), - 415 => - array ( - 0 => 629, - 1 => 'ɵ', - ), - 416 => - array ( - 0 => 417, - 1 => 'ơ', - ), - 418 => - array ( - 0 => 419, - 1 => 'ƣ', - ), - 420 => - array ( - 0 => 421, - 1 => 'ƥ', - ), - 422 => - array ( - 0 => 640, - 1 => 'ʀ', - ), - 423 => - array ( - 0 => 424, - 1 => 'ƨ', - ), - 425 => - array ( - 0 => 643, - 1 => 'ʃ', - ), - 428 => - array ( - 0 => 429, - 1 => 'ƭ', - ), - 430 => - array ( - 0 => 648, - 1 => 'ʈ', - ), - 431 => - array ( - 0 => 432, - 1 => 'ư', - ), - 433 => - array ( - 0 => 650, - 1 => 'ʊ', - ), - 434 => - array ( - 0 => 651, - 1 => 'ʋ', - ), - 435 => - array ( - 0 => 436, - 1 => 'ƴ', - ), - 437 => - array ( - 0 => 438, - 1 => 'ƶ', - ), - 439 => - array ( - 0 => 658, - 1 => 'ʒ', - ), - 440 => - array ( - 0 => 441, - 1 => 'ƹ', - ), - 444 => - array ( - 0 => 445, - 1 => 'ƽ', - ), - 452 => - array ( - 0 => 454, - 1 => 'dž', - ), - 453 => - array ( - 0 => 454, - 1 => 'dž', - ), - 455 => - array ( - 0 => 457, - 1 => 'lj', - ), - 456 => - array ( - 0 => 457, - 1 => 'lj', - ), - 458 => - array ( - 0 => 460, - 1 => 'nj', - ), - 459 => - array ( - 0 => 460, - 1 => 'nj', - ), - 461 => - array ( - 0 => 462, - 1 => 'ǎ', - ), - 463 => - array ( - 0 => 464, - 1 => 'ǐ', - ), - 465 => - array ( - 0 => 466, - 1 => 'ǒ', - ), - 467 => - array ( - 0 => 468, - 1 => 'ǔ', - ), - 469 => - array ( - 0 => 470, - 1 => 'ǖ', - ), - 471 => - array ( - 0 => 472, - 1 => 'ǘ', - ), - 473 => - array ( - 0 => 474, - 1 => 'ǚ', - ), - 475 => - array ( - 0 => 476, - 1 => 'ǜ', - ), - 478 => - array ( - 0 => 479, - 1 => 'ǟ', - ), - 480 => - array ( - 0 => 481, - 1 => 'ǡ', - ), - 482 => - array ( - 0 => 483, - 1 => 'ǣ', - ), - 484 => - array ( - 0 => 485, - 1 => 'ǥ', - ), - 486 => - array ( - 0 => 487, - 1 => 'ǧ', - ), - 488 => - array ( - 0 => 489, - 1 => 'ǩ', - ), - 490 => - array ( - 0 => 491, - 1 => 'ǫ', - ), - 492 => - array ( - 0 => 493, - 1 => 'ǭ', - ), - 494 => - array ( - 0 => 495, - 1 => 'ǯ', - ), - 497 => - array ( - 0 => 499, - 1 => 'dz', - ), - 498 => - array ( - 0 => 499, - 1 => 'dz', - ), - 500 => - array ( - 0 => 501, - 1 => 'ǵ', - ), - 502 => - array ( - 0 => 405, - 1 => 'ƕ', - ), - 503 => - array ( - 0 => 447, - 1 => 'ƿ', - ), - 504 => - array ( - 0 => 505, - 1 => 'ǹ', - ), - 506 => - array ( - 0 => 507, - 1 => 'ǻ', - ), - 508 => - array ( - 0 => 509, - 1 => 'ǽ', - ), - 510 => - array ( - 0 => 511, - 1 => 'ǿ', - ), - 512 => - array ( - 0 => 513, - 1 => 'ȁ', - ), - 514 => - array ( - 0 => 515, - 1 => 'ȃ', - ), - 516 => - array ( - 0 => 517, - 1 => 'ȅ', - ), - 518 => - array ( - 0 => 519, - 1 => 'ȇ', - ), - 520 => - array ( - 0 => 521, - 1 => 'ȉ', - ), - 522 => - array ( - 0 => 523, - 1 => 'ȋ', - ), - 524 => - array ( - 0 => 525, - 1 => 'ȍ', - ), - 526 => - array ( - 0 => 527, - 1 => 'ȏ', - ), - 528 => - array ( - 0 => 529, - 1 => 'ȑ', - ), - 530 => - array ( - 0 => 531, - 1 => 'ȓ', - ), - 532 => - array ( - 0 => 533, - 1 => 'ȕ', - ), - 534 => - array ( - 0 => 535, - 1 => 'ȗ', - ), - 536 => - array ( - 0 => 537, - 1 => 'ș', - ), - 538 => - array ( - 0 => 539, - 1 => 'ț', - ), - 540 => - array ( - 0 => 541, - 1 => 'ȝ', - ), - 542 => - array ( - 0 => 543, - 1 => 'ȟ', - ), - 544 => - array ( - 0 => 414, - 1 => 'ƞ', - ), - 546 => - array ( - 0 => 547, - 1 => 'ȣ', - ), - 548 => - array ( - 0 => 549, - 1 => 'ȥ', - ), - 550 => - array ( - 0 => 551, - 1 => 'ȧ', - ), - 552 => - array ( - 0 => 553, - 1 => 'ȩ', - ), - 554 => - array ( - 0 => 555, - 1 => 'ȫ', - ), - 556 => - array ( - 0 => 557, - 1 => 'ȭ', - ), - 558 => - array ( - 0 => 559, - 1 => 'ȯ', - ), - 560 => - array ( - 0 => 561, - 1 => 'ȱ', - ), - 562 => - array ( - 0 => 563, - 1 => 'ȳ', - ), - 570 => - array ( - 0 => 11365, - 1 => 'ⱥ', - ), - 571 => - array ( - 0 => 572, - 1 => 'ȼ', - ), - 573 => - array ( - 0 => 410, - 1 => 'ƚ', - ), - 574 => - array ( - 0 => 11366, - 1 => 'ⱦ', - ), - 577 => - array ( - 0 => 578, - 1 => 'ɂ', - ), - 579 => - array ( - 0 => 384, - 1 => 'ƀ', - ), - 580 => - array ( - 0 => 649, - 1 => 'ʉ', - ), - 581 => - array ( - 0 => 652, - 1 => 'ʌ', - ), - 582 => - array ( - 0 => 583, - 1 => 'ɇ', - ), - 584 => - array ( - 0 => 585, - 1 => 'ɉ', - ), - 586 => - array ( - 0 => 587, - 1 => 'ɋ', - ), - 588 => - array ( - 0 => 589, - 1 => 'ɍ', - ), - 590 => - array ( - 0 => 591, - 1 => 'ɏ', - ), - 837 => - array ( - 0 => 953, - 1 => 'ι', - ), - 880 => - array ( - 0 => 881, - 1 => 'ͱ', - ), - 882 => - array ( - 0 => 883, - 1 => 'ͳ', - ), - 886 => - array ( - 0 => 887, - 1 => 'ͷ', - ), - 895 => - array ( - 0 => 1011, - 1 => 'ϳ', - ), - 902 => - array ( - 0 => 940, - 1 => 'ά', - ), - 904 => - array ( - 0 => 941, - 1 => 'έ', - ), - 905 => - array ( - 0 => 942, - 1 => 'ή', - ), - 906 => - array ( - 0 => 943, - 1 => 'ί', - ), - 908 => - array ( - 0 => 972, - 1 => 'ό', - ), - 910 => - array ( - 0 => 973, - 1 => 'ύ', - ), - 911 => - array ( - 0 => 974, - 1 => 'ώ', - ), - 913 => - array ( - 0 => 945, - 1 => 'α', - ), - 914 => - array ( - 0 => 946, - 1 => 'β', - ), - 915 => - array ( - 0 => 947, - 1 => 'γ', - ), - 916 => - array ( - 0 => 948, - 1 => 'δ', - ), - 917 => - array ( - 0 => 949, - 1 => 'ε', - ), - 918 => - array ( - 0 => 950, - 1 => 'ζ', - ), - 919 => - array ( - 0 => 951, - 1 => 'η', - ), - 920 => - array ( - 0 => 952, - 1 => 'θ', - ), - 921 => - array ( - 0 => 953, - 1 => 'ι', - ), - 922 => - array ( - 0 => 954, - 1 => 'κ', - ), - 923 => - array ( - 0 => 955, - 1 => 'λ', - ), - 924 => - array ( - 0 => 956, - 1 => 'μ', - ), - 925 => - array ( - 0 => 957, - 1 => 'ν', - ), - 926 => - array ( - 0 => 958, - 1 => 'ξ', - ), - 927 => - array ( - 0 => 959, - 1 => 'ο', - ), - 928 => - array ( - 0 => 960, - 1 => 'π', - ), - 929 => - array ( - 0 => 961, - 1 => 'ρ', - ), - 931 => - array ( - 0 => 963, - 1 => 'σ', - ), - 932 => - array ( - 0 => 964, - 1 => 'τ', - ), - 933 => - array ( - 0 => 965, - 1 => 'υ', - ), - 934 => - array ( - 0 => 966, - 1 => 'φ', - ), - 935 => - array ( - 0 => 967, - 1 => 'χ', - ), - 936 => - array ( - 0 => 968, - 1 => 'ψ', - ), - 937 => - array ( - 0 => 969, - 1 => 'ω', - ), - 938 => - array ( - 0 => 970, - 1 => 'ϊ', - ), - 939 => - array ( - 0 => 971, - 1 => 'ϋ', - ), - 962 => - array ( - 0 => 963, - 1 => 'σ', - ), - 975 => - array ( - 0 => 983, - 1 => 'ϗ', - ), - 976 => - array ( - 0 => 946, - 1 => 'β', - ), - 977 => - array ( - 0 => 952, - 1 => 'θ', - ), - 981 => - array ( - 0 => 966, - 1 => 'φ', - ), - 982 => - array ( - 0 => 960, - 1 => 'π', - ), - 984 => - array ( - 0 => 985, - 1 => 'ϙ', - ), - 986 => - array ( - 0 => 987, - 1 => 'ϛ', - ), - 988 => - array ( - 0 => 989, - 1 => 'ϝ', - ), - 990 => - array ( - 0 => 991, - 1 => 'ϟ', - ), - 992 => - array ( - 0 => 993, - 1 => 'ϡ', - ), - 994 => - array ( - 0 => 995, - 1 => 'ϣ', - ), - 996 => - array ( - 0 => 997, - 1 => 'ϥ', - ), - 998 => - array ( - 0 => 999, - 1 => 'ϧ', - ), - 1000 => - array ( - 0 => 1001, - 1 => 'ϩ', - ), - 1002 => - array ( - 0 => 1003, - 1 => 'ϫ', - ), - 1004 => - array ( - 0 => 1005, - 1 => 'ϭ', - ), - 1006 => - array ( - 0 => 1007, - 1 => 'ϯ', - ), - 1008 => - array ( - 0 => 954, - 1 => 'κ', - ), - 1009 => - array ( - 0 => 961, - 1 => 'ρ', - ), - 1012 => - array ( - 0 => 952, - 1 => 'θ', - ), - 1013 => - array ( - 0 => 949, - 1 => 'ε', - ), - 1015 => - array ( - 0 => 1016, - 1 => 'ϸ', - ), - 1017 => - array ( - 0 => 1010, - 1 => 'ϲ', - ), - 1018 => - array ( - 0 => 1019, - 1 => 'ϻ', - ), - 1021 => - array ( - 0 => 891, - 1 => 'ͻ', - ), - 1022 => - array ( - 0 => 892, - 1 => 'ͼ', - ), - 1023 => - array ( - 0 => 893, - 1 => 'ͽ', - ), - 1024 => - array ( - 0 => 1104, - 1 => 'ѐ', - ), - 1025 => - array ( - 0 => 1105, - 1 => 'ё', - ), - 1026 => - array ( - 0 => 1106, - 1 => 'ђ', - ), - 1027 => - array ( - 0 => 1107, - 1 => 'ѓ', - ), - 1028 => - array ( - 0 => 1108, - 1 => 'є', - ), - 1029 => - array ( - 0 => 1109, - 1 => 'ѕ', - ), - 1030 => - array ( - 0 => 1110, - 1 => 'і', - ), - 1031 => - array ( - 0 => 1111, - 1 => 'ї', - ), - 1032 => - array ( - 0 => 1112, - 1 => 'ј', - ), - 1033 => - array ( - 0 => 1113, - 1 => 'љ', - ), - 1034 => - array ( - 0 => 1114, - 1 => 'њ', - ), - 1035 => - array ( - 0 => 1115, - 1 => 'ћ', - ), - 1036 => - array ( - 0 => 1116, - 1 => 'ќ', - ), - 1037 => - array ( - 0 => 1117, - 1 => 'ѝ', - ), - 1038 => - array ( - 0 => 1118, - 1 => 'ў', - ), - 1039 => - array ( - 0 => 1119, - 1 => 'џ', - ), - 1040 => - array ( - 0 => 1072, - 1 => 'а', - ), - 1041 => - array ( - 0 => 1073, - 1 => 'б', - ), - 1042 => - array ( - 0 => 1074, - 1 => 'в', - ), - 1043 => - array ( - 0 => 1075, - 1 => 'г', - ), - 1044 => - array ( - 0 => 1076, - 1 => 'д', - ), - 1045 => - array ( - 0 => 1077, - 1 => 'е', - ), - 1046 => - array ( - 0 => 1078, - 1 => 'ж', - ), - 1047 => - array ( - 0 => 1079, - 1 => 'з', - ), - 1048 => - array ( - 0 => 1080, - 1 => 'и', - ), - 1049 => - array ( - 0 => 1081, - 1 => 'й', - ), - 1050 => - array ( - 0 => 1082, - 1 => 'к', - ), - 1051 => - array ( - 0 => 1083, - 1 => 'л', - ), - 1052 => - array ( - 0 => 1084, - 1 => 'м', - ), - 1053 => - array ( - 0 => 1085, - 1 => 'н', - ), - 1054 => - array ( - 0 => 1086, - 1 => 'о', - ), - 1055 => - array ( - 0 => 1087, - 1 => 'п', - ), - 1056 => - array ( - 0 => 1088, - 1 => 'р', - ), - 1057 => - array ( - 0 => 1089, - 1 => 'с', - ), - 1058 => - array ( - 0 => 1090, - 1 => 'т', - ), - 1059 => - array ( - 0 => 1091, - 1 => 'у', - ), - 1060 => - array ( - 0 => 1092, - 1 => 'ф', - ), - 1061 => - array ( - 0 => 1093, - 1 => 'х', - ), - 1062 => - array ( - 0 => 1094, - 1 => 'ц', - ), - 1063 => - array ( - 0 => 1095, - 1 => 'ч', - ), - 1064 => - array ( - 0 => 1096, - 1 => 'ш', - ), - 1065 => - array ( - 0 => 1097, - 1 => 'щ', - ), - 1066 => - array ( - 0 => 1098, - 1 => 'ъ', - ), - 1067 => - array ( - 0 => 1099, - 1 => 'ы', - ), - 1068 => - array ( - 0 => 1100, - 1 => 'ь', - ), - 1069 => - array ( - 0 => 1101, - 1 => 'э', - ), - 1070 => - array ( - 0 => 1102, - 1 => 'ю', - ), - 1071 => - array ( - 0 => 1103, - 1 => 'я', - ), - 1120 => - array ( - 0 => 1121, - 1 => 'ѡ', - ), - 1122 => - array ( - 0 => 1123, - 1 => 'ѣ', - ), - 1124 => - array ( - 0 => 1125, - 1 => 'ѥ', - ), - 1126 => - array ( - 0 => 1127, - 1 => 'ѧ', - ), - 1128 => - array ( - 0 => 1129, - 1 => 'ѩ', - ), - 1130 => - array ( - 0 => 1131, - 1 => 'ѫ', - ), - 1132 => - array ( - 0 => 1133, - 1 => 'ѭ', - ), - 1134 => - array ( - 0 => 1135, - 1 => 'ѯ', - ), - 1136 => - array ( - 0 => 1137, - 1 => 'ѱ', - ), - 1138 => - array ( - 0 => 1139, - 1 => 'ѳ', - ), - 1140 => - array ( - 0 => 1141, - 1 => 'ѵ', - ), - 1142 => - array ( - 0 => 1143, - 1 => 'ѷ', - ), - 1144 => - array ( - 0 => 1145, - 1 => 'ѹ', - ), - 1146 => - array ( - 0 => 1147, - 1 => 'ѻ', - ), - 1148 => - array ( - 0 => 1149, - 1 => 'ѽ', - ), - 1150 => - array ( - 0 => 1151, - 1 => 'ѿ', - ), - 1152 => - array ( - 0 => 1153, - 1 => 'ҁ', - ), - 1162 => - array ( - 0 => 1163, - 1 => 'ҋ', - ), - 1164 => - array ( - 0 => 1165, - 1 => 'ҍ', - ), - 1166 => - array ( - 0 => 1167, - 1 => 'ҏ', - ), - 1168 => - array ( - 0 => 1169, - 1 => 'ґ', - ), - 1170 => - array ( - 0 => 1171, - 1 => 'ғ', - ), - 1172 => - array ( - 0 => 1173, - 1 => 'ҕ', - ), - 1174 => - array ( - 0 => 1175, - 1 => 'җ', - ), - 1176 => - array ( - 0 => 1177, - 1 => 'ҙ', - ), - 1178 => - array ( - 0 => 1179, - 1 => 'қ', - ), - 1180 => - array ( - 0 => 1181, - 1 => 'ҝ', - ), - 1182 => - array ( - 0 => 1183, - 1 => 'ҟ', - ), - 1184 => - array ( - 0 => 1185, - 1 => 'ҡ', - ), - 1186 => - array ( - 0 => 1187, - 1 => 'ң', - ), - 1188 => - array ( - 0 => 1189, - 1 => 'ҥ', - ), - 1190 => - array ( - 0 => 1191, - 1 => 'ҧ', - ), - 1192 => - array ( - 0 => 1193, - 1 => 'ҩ', - ), - 1194 => - array ( - 0 => 1195, - 1 => 'ҫ', - ), - 1196 => - array ( - 0 => 1197, - 1 => 'ҭ', - ), - 1198 => - array ( - 0 => 1199, - 1 => 'ү', - ), - 1200 => - array ( - 0 => 1201, - 1 => 'ұ', - ), - 1202 => - array ( - 0 => 1203, - 1 => 'ҳ', - ), - 1204 => - array ( - 0 => 1205, - 1 => 'ҵ', - ), - 1206 => - array ( - 0 => 1207, - 1 => 'ҷ', - ), - 1208 => - array ( - 0 => 1209, - 1 => 'ҹ', - ), - 1210 => - array ( - 0 => 1211, - 1 => 'һ', - ), - 1212 => - array ( - 0 => 1213, - 1 => 'ҽ', - ), - 1214 => - array ( - 0 => 1215, - 1 => 'ҿ', - ), - 1216 => - array ( - 0 => 1231, - 1 => 'ӏ', - ), - 1217 => - array ( - 0 => 1218, - 1 => 'ӂ', - ), - 1219 => - array ( - 0 => 1220, - 1 => 'ӄ', - ), - 1221 => - array ( - 0 => 1222, - 1 => 'ӆ', - ), - 1223 => - array ( - 0 => 1224, - 1 => 'ӈ', - ), - 1225 => - array ( - 0 => 1226, - 1 => 'ӊ', - ), - 1227 => - array ( - 0 => 1228, - 1 => 'ӌ', - ), - 1229 => - array ( - 0 => 1230, - 1 => 'ӎ', - ), - 1232 => - array ( - 0 => 1233, - 1 => 'ӑ', - ), - 1234 => - array ( - 0 => 1235, - 1 => 'ӓ', - ), - 1236 => - array ( - 0 => 1237, - 1 => 'ӕ', - ), - 1238 => - array ( - 0 => 1239, - 1 => 'ӗ', - ), - 1240 => - array ( - 0 => 1241, - 1 => 'ә', - ), - 1242 => - array ( - 0 => 1243, - 1 => 'ӛ', - ), - 1244 => - array ( - 0 => 1245, - 1 => 'ӝ', - ), - 1246 => - array ( - 0 => 1247, - 1 => 'ӟ', - ), - 1248 => - array ( - 0 => 1249, - 1 => 'ӡ', - ), - 1250 => - array ( - 0 => 1251, - 1 => 'ӣ', - ), - 1252 => - array ( - 0 => 1253, - 1 => 'ӥ', - ), - 1254 => - array ( - 0 => 1255, - 1 => 'ӧ', - ), - 1256 => - array ( - 0 => 1257, - 1 => 'ө', - ), - 1258 => - array ( - 0 => 1259, - 1 => 'ӫ', - ), - 1260 => - array ( - 0 => 1261, - 1 => 'ӭ', - ), - 1262 => - array ( - 0 => 1263, - 1 => 'ӯ', - ), - 1264 => - array ( - 0 => 1265, - 1 => 'ӱ', - ), - 1266 => - array ( - 0 => 1267, - 1 => 'ӳ', - ), - 1268 => - array ( - 0 => 1269, - 1 => 'ӵ', - ), - 1270 => - array ( - 0 => 1271, - 1 => 'ӷ', - ), - 1272 => - array ( - 0 => 1273, - 1 => 'ӹ', - ), - 1274 => - array ( - 0 => 1275, - 1 => 'ӻ', - ), - 1276 => - array ( - 0 => 1277, - 1 => 'ӽ', - ), - 1278 => - array ( - 0 => 1279, - 1 => 'ӿ', - ), - 1280 => - array ( - 0 => 1281, - 1 => 'ԁ', - ), - 1282 => - array ( - 0 => 1283, - 1 => 'ԃ', - ), - 1284 => - array ( - 0 => 1285, - 1 => 'ԅ', - ), - 1286 => - array ( - 0 => 1287, - 1 => 'ԇ', - ), - 1288 => - array ( - 0 => 1289, - 1 => 'ԉ', - ), - 1290 => - array ( - 0 => 1291, - 1 => 'ԋ', - ), - 1292 => - array ( - 0 => 1293, - 1 => 'ԍ', - ), - 1294 => - array ( - 0 => 1295, - 1 => 'ԏ', - ), - 1296 => - array ( - 0 => 1297, - 1 => 'ԑ', - ), - 1298 => - array ( - 0 => 1299, - 1 => 'ԓ', - ), - 1300 => - array ( - 0 => 1301, - 1 => 'ԕ', - ), - 1302 => - array ( - 0 => 1303, - 1 => 'ԗ', - ), - 1304 => - array ( - 0 => 1305, - 1 => 'ԙ', - ), - 1306 => - array ( - 0 => 1307, - 1 => 'ԛ', - ), - 1308 => - array ( - 0 => 1309, - 1 => 'ԝ', - ), - 1310 => - array ( - 0 => 1311, - 1 => 'ԟ', - ), - 1312 => - array ( - 0 => 1313, - 1 => 'ԡ', - ), - 1314 => - array ( - 0 => 1315, - 1 => 'ԣ', - ), - 1316 => - array ( - 0 => 1317, - 1 => 'ԥ', - ), - 1318 => - array ( - 0 => 1319, - 1 => 'ԧ', - ), - 1320 => - array ( - 0 => 1321, - 1 => 'ԩ', - ), - 1322 => - array ( - 0 => 1323, - 1 => 'ԫ', - ), - 1324 => - array ( - 0 => 1325, - 1 => 'ԭ', - ), - 1326 => - array ( - 0 => 1327, - 1 => 'ԯ', - ), - 1329 => - array ( - 0 => 1377, - 1 => 'ա', - ), - 1330 => - array ( - 0 => 1378, - 1 => 'բ', - ), - 1331 => - array ( - 0 => 1379, - 1 => 'գ', - ), - 1332 => - array ( - 0 => 1380, - 1 => 'դ', - ), - 1333 => - array ( - 0 => 1381, - 1 => 'ե', - ), - 1334 => - array ( - 0 => 1382, - 1 => 'զ', - ), - 1335 => - array ( - 0 => 1383, - 1 => 'է', - ), - 1336 => - array ( - 0 => 1384, - 1 => 'ը', - ), - 1337 => - array ( - 0 => 1385, - 1 => 'թ', - ), - 1338 => - array ( - 0 => 1386, - 1 => 'ժ', - ), - 1339 => - array ( - 0 => 1387, - 1 => 'ի', - ), - 1340 => - array ( - 0 => 1388, - 1 => 'լ', - ), - 1341 => - array ( - 0 => 1389, - 1 => 'խ', - ), - 1342 => - array ( - 0 => 1390, - 1 => 'ծ', - ), - 1343 => - array ( - 0 => 1391, - 1 => 'կ', - ), - 1344 => - array ( - 0 => 1392, - 1 => 'հ', - ), - 1345 => - array ( - 0 => 1393, - 1 => 'ձ', - ), - 1346 => - array ( - 0 => 1394, - 1 => 'ղ', - ), - 1347 => - array ( - 0 => 1395, - 1 => 'ճ', - ), - 1348 => - array ( - 0 => 1396, - 1 => 'մ', - ), - 1349 => - array ( - 0 => 1397, - 1 => 'յ', - ), - 1350 => - array ( - 0 => 1398, - 1 => 'ն', - ), - 1351 => - array ( - 0 => 1399, - 1 => 'շ', - ), - 1352 => - array ( - 0 => 1400, - 1 => 'ո', - ), - 1353 => - array ( - 0 => 1401, - 1 => 'չ', - ), - 1354 => - array ( - 0 => 1402, - 1 => 'պ', - ), - 1355 => - array ( - 0 => 1403, - 1 => 'ջ', - ), - 1356 => - array ( - 0 => 1404, - 1 => 'ռ', - ), - 1357 => - array ( - 0 => 1405, - 1 => 'ս', - ), - 1358 => - array ( - 0 => 1406, - 1 => 'վ', - ), - 1359 => - array ( - 0 => 1407, - 1 => 'տ', - ), - 1360 => - array ( - 0 => 1408, - 1 => 'ր', - ), - 1361 => - array ( - 0 => 1409, - 1 => 'ց', - ), - 1362 => - array ( - 0 => 1410, - 1 => 'ւ', - ), - 1363 => - array ( - 0 => 1411, - 1 => 'փ', - ), - 1364 => - array ( - 0 => 1412, - 1 => 'ք', - ), - 1365 => - array ( - 0 => 1413, - 1 => 'օ', - ), - 1366 => - array ( - 0 => 1414, - 1 => 'ֆ', - ), - 4256 => - array ( - 0 => 11520, - 1 => 'ⴀ', - ), - 4257 => - array ( - 0 => 11521, - 1 => 'ⴁ', - ), - 4258 => - array ( - 0 => 11522, - 1 => 'ⴂ', - ), - 4259 => - array ( - 0 => 11523, - 1 => 'ⴃ', - ), - 4260 => - array ( - 0 => 11524, - 1 => 'ⴄ', - ), - 4261 => - array ( - 0 => 11525, - 1 => 'ⴅ', - ), - 4262 => - array ( - 0 => 11526, - 1 => 'ⴆ', - ), - 4263 => - array ( - 0 => 11527, - 1 => 'ⴇ', - ), - 4264 => - array ( - 0 => 11528, - 1 => 'ⴈ', - ), - 4265 => - array ( - 0 => 11529, - 1 => 'ⴉ', - ), - 4266 => - array ( - 0 => 11530, - 1 => 'ⴊ', - ), - 4267 => - array ( - 0 => 11531, - 1 => 'ⴋ', - ), - 4268 => - array ( - 0 => 11532, - 1 => 'ⴌ', - ), - 4269 => - array ( - 0 => 11533, - 1 => 'ⴍ', - ), - 4270 => - array ( - 0 => 11534, - 1 => 'ⴎ', - ), - 4271 => - array ( - 0 => 11535, - 1 => 'ⴏ', - ), - 4272 => - array ( - 0 => 11536, - 1 => 'ⴐ', - ), - 4273 => - array ( - 0 => 11537, - 1 => 'ⴑ', - ), - 4274 => - array ( - 0 => 11538, - 1 => 'ⴒ', - ), - 4275 => - array ( - 0 => 11539, - 1 => 'ⴓ', - ), - 4276 => - array ( - 0 => 11540, - 1 => 'ⴔ', - ), - 4277 => - array ( - 0 => 11541, - 1 => 'ⴕ', - ), - 4278 => - array ( - 0 => 11542, - 1 => 'ⴖ', - ), - 4279 => - array ( - 0 => 11543, - 1 => 'ⴗ', - ), - 4280 => - array ( - 0 => 11544, - 1 => 'ⴘ', - ), - 4281 => - array ( - 0 => 11545, - 1 => 'ⴙ', - ), - 4282 => - array ( - 0 => 11546, - 1 => 'ⴚ', - ), - 4283 => - array ( - 0 => 11547, - 1 => 'ⴛ', - ), - 4284 => - array ( - 0 => 11548, - 1 => 'ⴜ', - ), - 4285 => - array ( - 0 => 11549, - 1 => 'ⴝ', - ), - 4286 => - array ( - 0 => 11550, - 1 => 'ⴞ', - ), - 4287 => - array ( - 0 => 11551, - 1 => 'ⴟ', - ), - 4288 => - array ( - 0 => 11552, - 1 => 'ⴠ', - ), - 4289 => - array ( - 0 => 11553, - 1 => 'ⴡ', - ), - 4290 => - array ( - 0 => 11554, - 1 => 'ⴢ', - ), - 4291 => - array ( - 0 => 11555, - 1 => 'ⴣ', - ), - 4292 => - array ( - 0 => 11556, - 1 => 'ⴤ', - ), - 4293 => - array ( - 0 => 11557, - 1 => 'ⴥ', - ), - 4295 => - array ( - 0 => 11559, - 1 => 'ⴧ', - ), - 4301 => - array ( - 0 => 11565, - 1 => 'ⴭ', - ), - 5112 => - array ( - 0 => 5104, - 1 => 'Ᏸ', - ), - 5113 => - array ( - 0 => 5105, - 1 => 'Ᏹ', - ), - 5114 => - array ( - 0 => 5106, - 1 => 'Ᏺ', - ), - 5115 => - array ( - 0 => 5107, - 1 => 'Ᏻ', - ), - 5116 => - array ( - 0 => 5108, - 1 => 'Ᏼ', - ), - 5117 => - array ( - 0 => 5109, - 1 => 'Ᏽ', - ), - 7296 => - array ( - 0 => 1074, - 1 => 'в', - ), - 7297 => - array ( - 0 => 1076, - 1 => 'д', - ), - 7298 => - array ( - 0 => 1086, - 1 => 'о', - ), - 7299 => - array ( - 0 => 1089, - 1 => 'с', - ), - 7300 => - array ( - 0 => 1090, - 1 => 'т', - ), - 7301 => - array ( - 0 => 1090, - 1 => 'т', - ), - 7302 => - array ( - 0 => 1098, - 1 => 'ъ', - ), - 7303 => - array ( - 0 => 1123, - 1 => 'ѣ', - ), - 7304 => - array ( - 0 => 42571, - 1 => 'ꙋ', - ), - 7680 => - array ( - 0 => 7681, - 1 => 'ḁ', - ), - 7682 => - array ( - 0 => 7683, - 1 => 'ḃ', - ), - 7684 => - array ( - 0 => 7685, - 1 => 'ḅ', - ), - 7686 => - array ( - 0 => 7687, - 1 => 'ḇ', - ), - 7688 => - array ( - 0 => 7689, - 1 => 'ḉ', - ), - 7690 => - array ( - 0 => 7691, - 1 => 'ḋ', - ), - 7692 => - array ( - 0 => 7693, - 1 => 'ḍ', - ), - 7694 => - array ( - 0 => 7695, - 1 => 'ḏ', - ), - 7696 => - array ( - 0 => 7697, - 1 => 'ḑ', - ), - 7698 => - array ( - 0 => 7699, - 1 => 'ḓ', - ), - 7700 => - array ( - 0 => 7701, - 1 => 'ḕ', - ), - 7702 => - array ( - 0 => 7703, - 1 => 'ḗ', - ), - 7704 => - array ( - 0 => 7705, - 1 => 'ḙ', - ), - 7706 => - array ( - 0 => 7707, - 1 => 'ḛ', - ), - 7708 => - array ( - 0 => 7709, - 1 => 'ḝ', - ), - 7710 => - array ( - 0 => 7711, - 1 => 'ḟ', - ), - 7712 => - array ( - 0 => 7713, - 1 => 'ḡ', - ), - 7714 => - array ( - 0 => 7715, - 1 => 'ḣ', - ), - 7716 => - array ( - 0 => 7717, - 1 => 'ḥ', - ), - 7718 => - array ( - 0 => 7719, - 1 => 'ḧ', - ), - 7720 => - array ( - 0 => 7721, - 1 => 'ḩ', - ), - 7722 => - array ( - 0 => 7723, - 1 => 'ḫ', - ), - 7724 => - array ( - 0 => 7725, - 1 => 'ḭ', - ), - 7726 => - array ( - 0 => 7727, - 1 => 'ḯ', - ), - 7728 => - array ( - 0 => 7729, - 1 => 'ḱ', - ), - 7730 => - array ( - 0 => 7731, - 1 => 'ḳ', - ), - 7732 => - array ( - 0 => 7733, - 1 => 'ḵ', - ), - 7734 => - array ( - 0 => 7735, - 1 => 'ḷ', - ), - 7736 => - array ( - 0 => 7737, - 1 => 'ḹ', - ), - 7738 => - array ( - 0 => 7739, - 1 => 'ḻ', - ), - 7740 => - array ( - 0 => 7741, - 1 => 'ḽ', - ), - 7742 => - array ( - 0 => 7743, - 1 => 'ḿ', - ), - 7744 => - array ( - 0 => 7745, - 1 => 'ṁ', - ), - 7746 => - array ( - 0 => 7747, - 1 => 'ṃ', - ), - 7748 => - array ( - 0 => 7749, - 1 => 'ṅ', - ), - 7750 => - array ( - 0 => 7751, - 1 => 'ṇ', - ), - 7752 => - array ( - 0 => 7753, - 1 => 'ṉ', - ), - 7754 => - array ( - 0 => 7755, - 1 => 'ṋ', - ), - 7756 => - array ( - 0 => 7757, - 1 => 'ṍ', - ), - 7758 => - array ( - 0 => 7759, - 1 => 'ṏ', - ), - 7760 => - array ( - 0 => 7761, - 1 => 'ṑ', - ), - 7762 => - array ( - 0 => 7763, - 1 => 'ṓ', - ), - 7764 => - array ( - 0 => 7765, - 1 => 'ṕ', - ), - 7766 => - array ( - 0 => 7767, - 1 => 'ṗ', - ), - 7768 => - array ( - 0 => 7769, - 1 => 'ṙ', - ), - 7770 => - array ( - 0 => 7771, - 1 => 'ṛ', - ), - 7772 => - array ( - 0 => 7773, - 1 => 'ṝ', - ), - 7774 => - array ( - 0 => 7775, - 1 => 'ṟ', - ), - 7776 => - array ( - 0 => 7777, - 1 => 'ṡ', - ), - 7778 => - array ( - 0 => 7779, - 1 => 'ṣ', - ), - 7780 => - array ( - 0 => 7781, - 1 => 'ṥ', - ), - 7782 => - array ( - 0 => 7783, - 1 => 'ṧ', - ), - 7784 => - array ( - 0 => 7785, - 1 => 'ṩ', - ), - 7786 => - array ( - 0 => 7787, - 1 => 'ṫ', - ), - 7788 => - array ( - 0 => 7789, - 1 => 'ṭ', - ), - 7790 => - array ( - 0 => 7791, - 1 => 'ṯ', - ), - 7792 => - array ( - 0 => 7793, - 1 => 'ṱ', - ), - 7794 => - array ( - 0 => 7795, - 1 => 'ṳ', - ), - 7796 => - array ( - 0 => 7797, - 1 => 'ṵ', - ), - 7798 => - array ( - 0 => 7799, - 1 => 'ṷ', - ), - 7800 => - array ( - 0 => 7801, - 1 => 'ṹ', - ), - 7802 => - array ( - 0 => 7803, - 1 => 'ṻ', - ), - 7804 => - array ( - 0 => 7805, - 1 => 'ṽ', - ), - 7806 => - array ( - 0 => 7807, - 1 => 'ṿ', - ), - 7808 => - array ( - 0 => 7809, - 1 => 'ẁ', - ), - 7810 => - array ( - 0 => 7811, - 1 => 'ẃ', - ), - 7812 => - array ( - 0 => 7813, - 1 => 'ẅ', - ), - 7814 => - array ( - 0 => 7815, - 1 => 'ẇ', - ), - 7816 => - array ( - 0 => 7817, - 1 => 'ẉ', - ), - 7818 => - array ( - 0 => 7819, - 1 => 'ẋ', - ), - 7820 => - array ( - 0 => 7821, - 1 => 'ẍ', - ), - 7822 => - array ( - 0 => 7823, - 1 => 'ẏ', - ), - 7824 => - array ( - 0 => 7825, - 1 => 'ẑ', - ), - 7826 => - array ( - 0 => 7827, - 1 => 'ẓ', - ), - 7828 => - array ( - 0 => 7829, - 1 => 'ẕ', - ), - 7835 => - array ( - 0 => 7777, - 1 => 'ṡ', - ), - 7838 => - array ( - 0 => 223, - 1 => 'ß', - ), - 7840 => - array ( - 0 => 7841, - 1 => 'ạ', - ), - 7842 => - array ( - 0 => 7843, - 1 => 'ả', - ), - 7844 => - array ( - 0 => 7845, - 1 => 'ấ', - ), - 7846 => - array ( - 0 => 7847, - 1 => 'ầ', - ), - 7848 => - array ( - 0 => 7849, - 1 => 'ẩ', - ), - 7850 => - array ( - 0 => 7851, - 1 => 'ẫ', - ), - 7852 => - array ( - 0 => 7853, - 1 => 'ậ', - ), - 7854 => - array ( - 0 => 7855, - 1 => 'ắ', - ), - 7856 => - array ( - 0 => 7857, - 1 => 'ằ', - ), - 7858 => - array ( - 0 => 7859, - 1 => 'ẳ', - ), - 7860 => - array ( - 0 => 7861, - 1 => 'ẵ', - ), - 7862 => - array ( - 0 => 7863, - 1 => 'ặ', - ), - 7864 => - array ( - 0 => 7865, - 1 => 'ẹ', - ), - 7866 => - array ( - 0 => 7867, - 1 => 'ẻ', - ), - 7868 => - array ( - 0 => 7869, - 1 => 'ẽ', - ), - 7870 => - array ( - 0 => 7871, - 1 => 'ế', - ), - 7872 => - array ( - 0 => 7873, - 1 => 'ề', - ), - 7874 => - array ( - 0 => 7875, - 1 => 'ể', - ), - 7876 => - array ( - 0 => 7877, - 1 => 'ễ', - ), - 7878 => - array ( - 0 => 7879, - 1 => 'ệ', - ), - 7880 => - array ( - 0 => 7881, - 1 => 'ỉ', - ), - 7882 => - array ( - 0 => 7883, - 1 => 'ị', - ), - 7884 => - array ( - 0 => 7885, - 1 => 'ọ', - ), - 7886 => - array ( - 0 => 7887, - 1 => 'ỏ', - ), - 7888 => - array ( - 0 => 7889, - 1 => 'ố', - ), - 7890 => - array ( - 0 => 7891, - 1 => 'ồ', - ), - 7892 => - array ( - 0 => 7893, - 1 => 'ổ', - ), - 7894 => - array ( - 0 => 7895, - 1 => 'ỗ', - ), - 7896 => - array ( - 0 => 7897, - 1 => 'ộ', - ), - 7898 => - array ( - 0 => 7899, - 1 => 'ớ', - ), - 7900 => - array ( - 0 => 7901, - 1 => 'ờ', - ), - 7902 => - array ( - 0 => 7903, - 1 => 'ở', - ), - 7904 => - array ( - 0 => 7905, - 1 => 'ỡ', - ), - 7906 => - array ( - 0 => 7907, - 1 => 'ợ', - ), - 7908 => - array ( - 0 => 7909, - 1 => 'ụ', - ), - 7910 => - array ( - 0 => 7911, - 1 => 'ủ', - ), - 7912 => - array ( - 0 => 7913, - 1 => 'ứ', - ), - 7914 => - array ( - 0 => 7915, - 1 => 'ừ', - ), - 7916 => - array ( - 0 => 7917, - 1 => 'ử', - ), - 7918 => - array ( - 0 => 7919, - 1 => 'ữ', - ), - 7920 => - array ( - 0 => 7921, - 1 => 'ự', - ), - 7922 => - array ( - 0 => 7923, - 1 => 'ỳ', - ), - 7924 => - array ( - 0 => 7925, - 1 => 'ỵ', - ), - 7926 => - array ( - 0 => 7927, - 1 => 'ỷ', - ), - 7928 => - array ( - 0 => 7929, - 1 => 'ỹ', - ), - 7930 => - array ( - 0 => 7931, - 1 => 'ỻ', - ), - 7932 => - array ( - 0 => 7933, - 1 => 'ỽ', - ), - 7934 => - array ( - 0 => 7935, - 1 => 'ỿ', - ), - 7944 => - array ( - 0 => 7936, - 1 => 'ἀ', - ), - 7945 => - array ( - 0 => 7937, - 1 => 'ἁ', - ), - 7946 => - array ( - 0 => 7938, - 1 => 'ἂ', - ), - 7947 => - array ( - 0 => 7939, - 1 => 'ἃ', - ), - 7948 => - array ( - 0 => 7940, - 1 => 'ἄ', - ), - 7949 => - array ( - 0 => 7941, - 1 => 'ἅ', - ), - 7950 => - array ( - 0 => 7942, - 1 => 'ἆ', - ), - 7951 => - array ( - 0 => 7943, - 1 => 'ἇ', - ), - 7960 => - array ( - 0 => 7952, - 1 => 'ἐ', - ), - 7961 => - array ( - 0 => 7953, - 1 => 'ἑ', - ), - 7962 => - array ( - 0 => 7954, - 1 => 'ἒ', - ), - 7963 => - array ( - 0 => 7955, - 1 => 'ἓ', - ), - 7964 => - array ( - 0 => 7956, - 1 => 'ἔ', - ), - 7965 => - array ( - 0 => 7957, - 1 => 'ἕ', - ), - 7976 => - array ( - 0 => 7968, - 1 => 'ἠ', - ), - 7977 => - array ( - 0 => 7969, - 1 => 'ἡ', - ), - 7978 => - array ( - 0 => 7970, - 1 => 'ἢ', - ), - 7979 => - array ( - 0 => 7971, - 1 => 'ἣ', - ), - 7980 => - array ( - 0 => 7972, - 1 => 'ἤ', - ), - 7981 => - array ( - 0 => 7973, - 1 => 'ἥ', - ), - 7982 => - array ( - 0 => 7974, - 1 => 'ἦ', - ), - 7983 => - array ( - 0 => 7975, - 1 => 'ἧ', - ), - 7992 => - array ( - 0 => 7984, - 1 => 'ἰ', - ), - 7993 => - array ( - 0 => 7985, - 1 => 'ἱ', - ), - 7994 => - array ( - 0 => 7986, - 1 => 'ἲ', - ), - 7995 => - array ( - 0 => 7987, - 1 => 'ἳ', - ), - 7996 => - array ( - 0 => 7988, - 1 => 'ἴ', - ), - 7997 => - array ( - 0 => 7989, - 1 => 'ἵ', - ), - 7998 => - array ( - 0 => 7990, - 1 => 'ἶ', - ), - 7999 => - array ( - 0 => 7991, - 1 => 'ἷ', - ), - 8008 => - array ( - 0 => 8000, - 1 => 'ὀ', - ), - 8009 => - array ( - 0 => 8001, - 1 => 'ὁ', - ), - 8010 => - array ( - 0 => 8002, - 1 => 'ὂ', - ), - 8011 => - array ( - 0 => 8003, - 1 => 'ὃ', - ), - 8012 => - array ( - 0 => 8004, - 1 => 'ὄ', - ), - 8013 => - array ( - 0 => 8005, - 1 => 'ὅ', - ), - 8025 => - array ( - 0 => 8017, - 1 => 'ὑ', - ), - 8027 => - array ( - 0 => 8019, - 1 => 'ὓ', - ), - 8029 => - array ( - 0 => 8021, - 1 => 'ὕ', - ), - 8031 => - array ( - 0 => 8023, - 1 => 'ὗ', - ), - 8040 => - array ( - 0 => 8032, - 1 => 'ὠ', - ), - 8041 => - array ( - 0 => 8033, - 1 => 'ὡ', - ), - 8042 => - array ( - 0 => 8034, - 1 => 'ὢ', - ), - 8043 => - array ( - 0 => 8035, - 1 => 'ὣ', - ), - 8044 => - array ( - 0 => 8036, - 1 => 'ὤ', - ), - 8045 => - array ( - 0 => 8037, - 1 => 'ὥ', - ), - 8046 => - array ( - 0 => 8038, - 1 => 'ὦ', - ), - 8047 => - array ( - 0 => 8039, - 1 => 'ὧ', - ), - 8072 => - array ( - 0 => 8064, - 1 => 'ᾀ', - ), - 8073 => - array ( - 0 => 8065, - 1 => 'ᾁ', - ), - 8074 => - array ( - 0 => 8066, - 1 => 'ᾂ', - ), - 8075 => - array ( - 0 => 8067, - 1 => 'ᾃ', - ), - 8076 => - array ( - 0 => 8068, - 1 => 'ᾄ', - ), - 8077 => - array ( - 0 => 8069, - 1 => 'ᾅ', - ), - 8078 => - array ( - 0 => 8070, - 1 => 'ᾆ', - ), - 8079 => - array ( - 0 => 8071, - 1 => 'ᾇ', - ), - 8088 => - array ( - 0 => 8080, - 1 => 'ᾐ', - ), - 8089 => - array ( - 0 => 8081, - 1 => 'ᾑ', - ), - 8090 => - array ( - 0 => 8082, - 1 => 'ᾒ', - ), - 8091 => - array ( - 0 => 8083, - 1 => 'ᾓ', - ), - 8092 => - array ( - 0 => 8084, - 1 => 'ᾔ', - ), - 8093 => - array ( - 0 => 8085, - 1 => 'ᾕ', - ), - 8094 => - array ( - 0 => 8086, - 1 => 'ᾖ', - ), - 8095 => - array ( - 0 => 8087, - 1 => 'ᾗ', - ), - 8104 => - array ( - 0 => 8096, - 1 => 'ᾠ', - ), - 8105 => - array ( - 0 => 8097, - 1 => 'ᾡ', - ), - 8106 => - array ( - 0 => 8098, - 1 => 'ᾢ', - ), - 8107 => - array ( - 0 => 8099, - 1 => 'ᾣ', - ), - 8108 => - array ( - 0 => 8100, - 1 => 'ᾤ', - ), - 8109 => - array ( - 0 => 8101, - 1 => 'ᾥ', - ), - 8110 => - array ( - 0 => 8102, - 1 => 'ᾦ', - ), - 8111 => - array ( - 0 => 8103, - 1 => 'ᾧ', - ), - 8120 => - array ( - 0 => 8112, - 1 => 'ᾰ', - ), - 8121 => - array ( - 0 => 8113, - 1 => 'ᾱ', - ), - 8122 => - array ( - 0 => 8048, - 1 => 'ὰ', - ), - 8123 => - array ( - 0 => 8049, - 1 => 'ά', - ), - 8124 => - array ( - 0 => 8115, - 1 => 'ᾳ', - ), - 8126 => - array ( - 0 => 953, - 1 => 'ι', - ), - 8136 => - array ( - 0 => 8050, - 1 => 'ὲ', - ), - 8137 => - array ( - 0 => 8051, - 1 => 'έ', - ), - 8138 => - array ( - 0 => 8052, - 1 => 'ὴ', - ), - 8139 => - array ( - 0 => 8053, - 1 => 'ή', - ), - 8140 => - array ( - 0 => 8131, - 1 => 'ῃ', - ), - 8152 => - array ( - 0 => 8144, - 1 => 'ῐ', - ), - 8153 => - array ( - 0 => 8145, - 1 => 'ῑ', - ), - 8154 => - array ( - 0 => 8054, - 1 => 'ὶ', - ), - 8155 => - array ( - 0 => 8055, - 1 => 'ί', - ), - 8168 => - array ( - 0 => 8160, - 1 => 'ῠ', - ), - 8169 => - array ( - 0 => 8161, - 1 => 'ῡ', - ), - 8170 => - array ( - 0 => 8058, - 1 => 'ὺ', - ), - 8171 => - array ( - 0 => 8059, - 1 => 'ύ', - ), - 8172 => - array ( - 0 => 8165, - 1 => 'ῥ', - ), - 8184 => - array ( - 0 => 8056, - 1 => 'ὸ', - ), - 8185 => - array ( - 0 => 8057, - 1 => 'ό', - ), - 8186 => - array ( - 0 => 8060, - 1 => 'ὼ', - ), - 8187 => - array ( - 0 => 8061, - 1 => 'ώ', - ), - 8188 => - array ( - 0 => 8179, - 1 => 'ῳ', - ), - 8486 => - array ( - 0 => 969, - 1 => 'ω', - ), - 8490 => - array ( - 0 => 107, - 1 => 'k', - ), - 8491 => - array ( - 0 => 229, - 1 => 'å', - ), - 8498 => - array ( - 0 => 8526, - 1 => 'ⅎ', - ), - 8544 => - array ( - 0 => 8560, - 1 => 'ⅰ', - ), - 8545 => - array ( - 0 => 8561, - 1 => 'ⅱ', - ), - 8546 => - array ( - 0 => 8562, - 1 => 'ⅲ', - ), - 8547 => - array ( - 0 => 8563, - 1 => 'ⅳ', - ), - 8548 => - array ( - 0 => 8564, - 1 => 'ⅴ', - ), - 8549 => - array ( - 0 => 8565, - 1 => 'ⅵ', - ), - 8550 => - array ( - 0 => 8566, - 1 => 'ⅶ', - ), - 8551 => - array ( - 0 => 8567, - 1 => 'ⅷ', - ), - 8552 => - array ( - 0 => 8568, - 1 => 'ⅸ', - ), - 8553 => - array ( - 0 => 8569, - 1 => 'ⅹ', - ), - 8554 => - array ( - 0 => 8570, - 1 => 'ⅺ', - ), - 8555 => - array ( - 0 => 8571, - 1 => 'ⅻ', - ), - 8556 => - array ( - 0 => 8572, - 1 => 'ⅼ', - ), - 8557 => - array ( - 0 => 8573, - 1 => 'ⅽ', - ), - 8558 => - array ( - 0 => 8574, - 1 => 'ⅾ', - ), - 8559 => - array ( - 0 => 8575, - 1 => 'ⅿ', - ), - 8579 => - array ( - 0 => 8580, - 1 => 'ↄ', - ), - 9398 => - array ( - 0 => 9424, - 1 => 'ⓐ', - ), - 9399 => - array ( - 0 => 9425, - 1 => 'ⓑ', - ), - 9400 => - array ( - 0 => 9426, - 1 => 'ⓒ', - ), - 9401 => - array ( - 0 => 9427, - 1 => 'ⓓ', - ), - 9402 => - array ( - 0 => 9428, - 1 => 'ⓔ', - ), - 9403 => - array ( - 0 => 9429, - 1 => 'ⓕ', - ), - 9404 => - array ( - 0 => 9430, - 1 => 'ⓖ', - ), - 9405 => - array ( - 0 => 9431, - 1 => 'ⓗ', - ), - 9406 => - array ( - 0 => 9432, - 1 => 'ⓘ', - ), - 9407 => - array ( - 0 => 9433, - 1 => 'ⓙ', - ), - 9408 => - array ( - 0 => 9434, - 1 => 'ⓚ', - ), - 9409 => - array ( - 0 => 9435, - 1 => 'ⓛ', - ), - 9410 => - array ( - 0 => 9436, - 1 => 'ⓜ', - ), - 9411 => - array ( - 0 => 9437, - 1 => 'ⓝ', - ), - 9412 => - array ( - 0 => 9438, - 1 => 'ⓞ', - ), - 9413 => - array ( - 0 => 9439, - 1 => 'ⓟ', - ), - 9414 => - array ( - 0 => 9440, - 1 => 'ⓠ', - ), - 9415 => - array ( - 0 => 9441, - 1 => 'ⓡ', - ), - 9416 => - array ( - 0 => 9442, - 1 => 'ⓢ', - ), - 9417 => - array ( - 0 => 9443, - 1 => 'ⓣ', - ), - 9418 => - array ( - 0 => 9444, - 1 => 'ⓤ', - ), - 9419 => - array ( - 0 => 9445, - 1 => 'ⓥ', - ), - 9420 => - array ( - 0 => 9446, - 1 => 'ⓦ', - ), - 9421 => - array ( - 0 => 9447, - 1 => 'ⓧ', - ), - 9422 => - array ( - 0 => 9448, - 1 => 'ⓨ', - ), - 9423 => - array ( - 0 => 9449, - 1 => 'ⓩ', - ), - 11264 => - array ( - 0 => 11312, - 1 => 'ⰰ', - ), - 11265 => - array ( - 0 => 11313, - 1 => 'ⰱ', - ), - 11266 => - array ( - 0 => 11314, - 1 => 'ⰲ', - ), - 11267 => - array ( - 0 => 11315, - 1 => 'ⰳ', - ), - 11268 => - array ( - 0 => 11316, - 1 => 'ⰴ', - ), - 11269 => - array ( - 0 => 11317, - 1 => 'ⰵ', - ), - 11270 => - array ( - 0 => 11318, - 1 => 'ⰶ', - ), - 11271 => - array ( - 0 => 11319, - 1 => 'ⰷ', - ), - 11272 => - array ( - 0 => 11320, - 1 => 'ⰸ', - ), - 11273 => - array ( - 0 => 11321, - 1 => 'ⰹ', - ), - 11274 => - array ( - 0 => 11322, - 1 => 'ⰺ', - ), - 11275 => - array ( - 0 => 11323, - 1 => 'ⰻ', - ), - 11276 => - array ( - 0 => 11324, - 1 => 'ⰼ', - ), - 11277 => - array ( - 0 => 11325, - 1 => 'ⰽ', - ), - 11278 => - array ( - 0 => 11326, - 1 => 'ⰾ', - ), - 11279 => - array ( - 0 => 11327, - 1 => 'ⰿ', - ), - 11280 => - array ( - 0 => 11328, - 1 => 'ⱀ', - ), - 11281 => - array ( - 0 => 11329, - 1 => 'ⱁ', - ), - 11282 => - array ( - 0 => 11330, - 1 => 'ⱂ', - ), - 11283 => - array ( - 0 => 11331, - 1 => 'ⱃ', - ), - 11284 => - array ( - 0 => 11332, - 1 => 'ⱄ', - ), - 11285 => - array ( - 0 => 11333, - 1 => 'ⱅ', - ), - 11286 => - array ( - 0 => 11334, - 1 => 'ⱆ', - ), - 11287 => - array ( - 0 => 11335, - 1 => 'ⱇ', - ), - 11288 => - array ( - 0 => 11336, - 1 => 'ⱈ', - ), - 11289 => - array ( - 0 => 11337, - 1 => 'ⱉ', - ), - 11290 => - array ( - 0 => 11338, - 1 => 'ⱊ', - ), - 11291 => - array ( - 0 => 11339, - 1 => 'ⱋ', - ), - 11292 => - array ( - 0 => 11340, - 1 => 'ⱌ', - ), - 11293 => - array ( - 0 => 11341, - 1 => 'ⱍ', - ), - 11294 => - array ( - 0 => 11342, - 1 => 'ⱎ', - ), - 11295 => - array ( - 0 => 11343, - 1 => 'ⱏ', - ), - 11296 => - array ( - 0 => 11344, - 1 => 'ⱐ', - ), - 11297 => - array ( - 0 => 11345, - 1 => 'ⱑ', - ), - 11298 => - array ( - 0 => 11346, - 1 => 'ⱒ', - ), - 11299 => - array ( - 0 => 11347, - 1 => 'ⱓ', - ), - 11300 => - array ( - 0 => 11348, - 1 => 'ⱔ', - ), - 11301 => - array ( - 0 => 11349, - 1 => 'ⱕ', - ), - 11302 => - array ( - 0 => 11350, - 1 => 'ⱖ', - ), - 11303 => - array ( - 0 => 11351, - 1 => 'ⱗ', - ), - 11304 => - array ( - 0 => 11352, - 1 => 'ⱘ', - ), - 11305 => - array ( - 0 => 11353, - 1 => 'ⱙ', - ), - 11306 => - array ( - 0 => 11354, - 1 => 'ⱚ', - ), - 11307 => - array ( - 0 => 11355, - 1 => 'ⱛ', - ), - 11308 => - array ( - 0 => 11356, - 1 => 'ⱜ', - ), - 11309 => - array ( - 0 => 11357, - 1 => 'ⱝ', - ), - 11310 => - array ( - 0 => 11358, - 1 => 'ⱞ', - ), - 11360 => - array ( - 0 => 11361, - 1 => 'ⱡ', - ), - 11362 => - array ( - 0 => 619, - 1 => 'ɫ', - ), - 11363 => - array ( - 0 => 7549, - 1 => 'ᵽ', - ), - 11364 => - array ( - 0 => 637, - 1 => 'ɽ', - ), - 11367 => - array ( - 0 => 11368, - 1 => 'ⱨ', - ), - 11369 => - array ( - 0 => 11370, - 1 => 'ⱪ', - ), - 11371 => - array ( - 0 => 11372, - 1 => 'ⱬ', - ), - 11373 => - array ( - 0 => 593, - 1 => 'ɑ', - ), - 11374 => - array ( - 0 => 625, - 1 => 'ɱ', - ), - 11375 => - array ( - 0 => 592, - 1 => 'ɐ', - ), - 11376 => - array ( - 0 => 594, - 1 => 'ɒ', - ), - 11378 => - array ( - 0 => 11379, - 1 => 'ⱳ', - ), - 11381 => - array ( - 0 => 11382, - 1 => 'ⱶ', - ), - 11390 => - array ( - 0 => 575, - 1 => 'ȿ', - ), - 11391 => - array ( - 0 => 576, - 1 => 'ɀ', - ), - 11392 => - array ( - 0 => 11393, - 1 => 'ⲁ', - ), - 11394 => - array ( - 0 => 11395, - 1 => 'ⲃ', - ), - 11396 => - array ( - 0 => 11397, - 1 => 'ⲅ', - ), - 11398 => - array ( - 0 => 11399, - 1 => 'ⲇ', - ), - 11400 => - array ( - 0 => 11401, - 1 => 'ⲉ', - ), - 11402 => - array ( - 0 => 11403, - 1 => 'ⲋ', - ), - 11404 => - array ( - 0 => 11405, - 1 => 'ⲍ', - ), - 11406 => - array ( - 0 => 11407, - 1 => 'ⲏ', - ), - 11408 => - array ( - 0 => 11409, - 1 => 'ⲑ', - ), - 11410 => - array ( - 0 => 11411, - 1 => 'ⲓ', - ), - 11412 => - array ( - 0 => 11413, - 1 => 'ⲕ', - ), - 11414 => - array ( - 0 => 11415, - 1 => 'ⲗ', - ), - 11416 => - array ( - 0 => 11417, - 1 => 'ⲙ', - ), - 11418 => - array ( - 0 => 11419, - 1 => 'ⲛ', - ), - 11420 => - array ( - 0 => 11421, - 1 => 'ⲝ', - ), - 11422 => - array ( - 0 => 11423, - 1 => 'ⲟ', - ), - 11424 => - array ( - 0 => 11425, - 1 => 'ⲡ', - ), - 11426 => - array ( - 0 => 11427, - 1 => 'ⲣ', - ), - 11428 => - array ( - 0 => 11429, - 1 => 'ⲥ', - ), - 11430 => - array ( - 0 => 11431, - 1 => 'ⲧ', - ), - 11432 => - array ( - 0 => 11433, - 1 => 'ⲩ', - ), - 11434 => - array ( - 0 => 11435, - 1 => 'ⲫ', - ), - 11436 => - array ( - 0 => 11437, - 1 => 'ⲭ', - ), - 11438 => - array ( - 0 => 11439, - 1 => 'ⲯ', - ), - 11440 => - array ( - 0 => 11441, - 1 => 'ⲱ', - ), - 11442 => - array ( - 0 => 11443, - 1 => 'ⲳ', - ), - 11444 => - array ( - 0 => 11445, - 1 => 'ⲵ', - ), - 11446 => - array ( - 0 => 11447, - 1 => 'ⲷ', - ), - 11448 => - array ( - 0 => 11449, - 1 => 'ⲹ', - ), - 11450 => - array ( - 0 => 11451, - 1 => 'ⲻ', - ), - 11452 => - array ( - 0 => 11453, - 1 => 'ⲽ', - ), - 11454 => - array ( - 0 => 11455, - 1 => 'ⲿ', - ), - 11456 => - array ( - 0 => 11457, - 1 => 'ⳁ', - ), - 11458 => - array ( - 0 => 11459, - 1 => 'ⳃ', - ), - 11460 => - array ( - 0 => 11461, - 1 => 'ⳅ', - ), - 11462 => - array ( - 0 => 11463, - 1 => 'ⳇ', - ), - 11464 => - array ( - 0 => 11465, - 1 => 'ⳉ', - ), - 11466 => - array ( - 0 => 11467, - 1 => 'ⳋ', - ), - 11468 => - array ( - 0 => 11469, - 1 => 'ⳍ', - ), - 11470 => - array ( - 0 => 11471, - 1 => 'ⳏ', - ), - 11472 => - array ( - 0 => 11473, - 1 => 'ⳑ', - ), - 11474 => - array ( - 0 => 11475, - 1 => 'ⳓ', - ), - 11476 => - array ( - 0 => 11477, - 1 => 'ⳕ', - ), - 11478 => - array ( - 0 => 11479, - 1 => 'ⳗ', - ), - 11480 => - array ( - 0 => 11481, - 1 => 'ⳙ', - ), - 11482 => - array ( - 0 => 11483, - 1 => 'ⳛ', - ), - 11484 => - array ( - 0 => 11485, - 1 => 'ⳝ', - ), - 11486 => - array ( - 0 => 11487, - 1 => 'ⳟ', - ), - 11488 => - array ( - 0 => 11489, - 1 => 'ⳡ', - ), - 11490 => - array ( - 0 => 11491, - 1 => 'ⳣ', - ), - 11499 => - array ( - 0 => 11500, - 1 => 'ⳬ', - ), - 11501 => - array ( - 0 => 11502, - 1 => 'ⳮ', - ), - 11506 => - array ( - 0 => 11507, - 1 => 'ⳳ', - ), - 42560 => - array ( - 0 => 42561, - 1 => 'ꙁ', - ), - 42562 => - array ( - 0 => 42563, - 1 => 'ꙃ', - ), - 42564 => - array ( - 0 => 42565, - 1 => 'ꙅ', - ), - 42566 => - array ( - 0 => 42567, - 1 => 'ꙇ', - ), - 42568 => - array ( - 0 => 42569, - 1 => 'ꙉ', - ), - 42570 => - array ( - 0 => 42571, - 1 => 'ꙋ', - ), - 42572 => - array ( - 0 => 42573, - 1 => 'ꙍ', - ), - 42574 => - array ( - 0 => 42575, - 1 => 'ꙏ', - ), - 42576 => - array ( - 0 => 42577, - 1 => 'ꙑ', - ), - 42578 => - array ( - 0 => 42579, - 1 => 'ꙓ', - ), - 42580 => - array ( - 0 => 42581, - 1 => 'ꙕ', - ), - 42582 => - array ( - 0 => 42583, - 1 => 'ꙗ', - ), - 42584 => - array ( - 0 => 42585, - 1 => 'ꙙ', - ), - 42586 => - array ( - 0 => 42587, - 1 => 'ꙛ', - ), - 42588 => - array ( - 0 => 42589, - 1 => 'ꙝ', - ), - 42590 => - array ( - 0 => 42591, - 1 => 'ꙟ', - ), - 42592 => - array ( - 0 => 42593, - 1 => 'ꙡ', - ), - 42594 => - array ( - 0 => 42595, - 1 => 'ꙣ', - ), - 42596 => - array ( - 0 => 42597, - 1 => 'ꙥ', - ), - 42598 => - array ( - 0 => 42599, - 1 => 'ꙧ', - ), - 42600 => - array ( - 0 => 42601, - 1 => 'ꙩ', - ), - 42602 => - array ( - 0 => 42603, - 1 => 'ꙫ', - ), - 42604 => - array ( - 0 => 42605, - 1 => 'ꙭ', - ), - 42624 => - array ( - 0 => 42625, - 1 => 'ꚁ', - ), - 42626 => - array ( - 0 => 42627, - 1 => 'ꚃ', - ), - 42628 => - array ( - 0 => 42629, - 1 => 'ꚅ', - ), - 42630 => - array ( - 0 => 42631, - 1 => 'ꚇ', - ), - 42632 => - array ( - 0 => 42633, - 1 => 'ꚉ', - ), - 42634 => - array ( - 0 => 42635, - 1 => 'ꚋ', - ), - 42636 => - array ( - 0 => 42637, - 1 => 'ꚍ', - ), - 42638 => - array ( - 0 => 42639, - 1 => 'ꚏ', - ), - 42640 => - array ( - 0 => 42641, - 1 => 'ꚑ', - ), - 42642 => - array ( - 0 => 42643, - 1 => 'ꚓ', - ), - 42644 => - array ( - 0 => 42645, - 1 => 'ꚕ', - ), - 42646 => - array ( - 0 => 42647, - 1 => 'ꚗ', - ), - 42648 => - array ( - 0 => 42649, - 1 => 'ꚙ', - ), - 42650 => - array ( - 0 => 42651, - 1 => 'ꚛ', - ), - 42786 => - array ( - 0 => 42787, - 1 => 'ꜣ', - ), - 42788 => - array ( - 0 => 42789, - 1 => 'ꜥ', - ), - 42790 => - array ( - 0 => 42791, - 1 => 'ꜧ', - ), - 42792 => - array ( - 0 => 42793, - 1 => 'ꜩ', - ), - 42794 => - array ( - 0 => 42795, - 1 => 'ꜫ', - ), - 42796 => - array ( - 0 => 42797, - 1 => 'ꜭ', - ), - 42798 => - array ( - 0 => 42799, - 1 => 'ꜯ', - ), - 42802 => - array ( - 0 => 42803, - 1 => 'ꜳ', - ), - 42804 => - array ( - 0 => 42805, - 1 => 'ꜵ', - ), - 42806 => - array ( - 0 => 42807, - 1 => 'ꜷ', - ), - 42808 => - array ( - 0 => 42809, - 1 => 'ꜹ', - ), - 42810 => - array ( - 0 => 42811, - 1 => 'ꜻ', - ), - 42812 => - array ( - 0 => 42813, - 1 => 'ꜽ', - ), - 42814 => - array ( - 0 => 42815, - 1 => 'ꜿ', - ), - 42816 => - array ( - 0 => 42817, - 1 => 'ꝁ', - ), - 42818 => - array ( - 0 => 42819, - 1 => 'ꝃ', - ), - 42820 => - array ( - 0 => 42821, - 1 => 'ꝅ', - ), - 42822 => - array ( - 0 => 42823, - 1 => 'ꝇ', - ), - 42824 => - array ( - 0 => 42825, - 1 => 'ꝉ', - ), - 42826 => - array ( - 0 => 42827, - 1 => 'ꝋ', - ), - 42828 => - array ( - 0 => 42829, - 1 => 'ꝍ', - ), - 42830 => - array ( - 0 => 42831, - 1 => 'ꝏ', - ), - 42832 => - array ( - 0 => 42833, - 1 => 'ꝑ', - ), - 42834 => - array ( - 0 => 42835, - 1 => 'ꝓ', - ), - 42836 => - array ( - 0 => 42837, - 1 => 'ꝕ', - ), - 42838 => - array ( - 0 => 42839, - 1 => 'ꝗ', - ), - 42840 => - array ( - 0 => 42841, - 1 => 'ꝙ', - ), - 42842 => - array ( - 0 => 42843, - 1 => 'ꝛ', - ), - 42844 => - array ( - 0 => 42845, - 1 => 'ꝝ', - ), - 42846 => - array ( - 0 => 42847, - 1 => 'ꝟ', - ), - 42848 => - array ( - 0 => 42849, - 1 => 'ꝡ', - ), - 42850 => - array ( - 0 => 42851, - 1 => 'ꝣ', - ), - 42852 => - array ( - 0 => 42853, - 1 => 'ꝥ', - ), - 42854 => - array ( - 0 => 42855, - 1 => 'ꝧ', - ), - 42856 => - array ( - 0 => 42857, - 1 => 'ꝩ', - ), - 42858 => - array ( - 0 => 42859, - 1 => 'ꝫ', - ), - 42860 => - array ( - 0 => 42861, - 1 => 'ꝭ', - ), - 42862 => - array ( - 0 => 42863, - 1 => 'ꝯ', - ), - 42873 => - array ( - 0 => 42874, - 1 => 'ꝺ', - ), - 42875 => - array ( - 0 => 42876, - 1 => 'ꝼ', - ), - 42877 => - array ( - 0 => 7545, - 1 => 'ᵹ', - ), - 42878 => - array ( - 0 => 42879, - 1 => 'ꝿ', - ), - 42880 => - array ( - 0 => 42881, - 1 => 'ꞁ', - ), - 42882 => - array ( - 0 => 42883, - 1 => 'ꞃ', - ), - 42884 => - array ( - 0 => 42885, - 1 => 'ꞅ', - ), - 42886 => - array ( - 0 => 42887, - 1 => 'ꞇ', - ), - 42891 => - array ( - 0 => 42892, - 1 => 'ꞌ', - ), - 42893 => - array ( - 0 => 613, - 1 => 'ɥ', - ), - 42896 => - array ( - 0 => 42897, - 1 => 'ꞑ', - ), - 42898 => - array ( - 0 => 42899, - 1 => 'ꞓ', - ), - 42902 => - array ( - 0 => 42903, - 1 => 'ꞗ', - ), - 42904 => - array ( - 0 => 42905, - 1 => 'ꞙ', - ), - 42906 => - array ( - 0 => 42907, - 1 => 'ꞛ', - ), - 42908 => - array ( - 0 => 42909, - 1 => 'ꞝ', - ), - 42910 => - array ( - 0 => 42911, - 1 => 'ꞟ', - ), - 42912 => - array ( - 0 => 42913, - 1 => 'ꞡ', - ), - 42914 => - array ( - 0 => 42915, - 1 => 'ꞣ', - ), - 42916 => - array ( - 0 => 42917, - 1 => 'ꞥ', - ), - 42918 => - array ( - 0 => 42919, - 1 => 'ꞧ', - ), - 42920 => - array ( - 0 => 42921, - 1 => 'ꞩ', - ), - 42922 => - array ( - 0 => 614, - 1 => 'ɦ', - ), - 42923 => - array ( - 0 => 604, - 1 => 'ɜ', - ), - 42924 => - array ( - 0 => 609, - 1 => 'ɡ', - ), - 42925 => - array ( - 0 => 620, - 1 => 'ɬ', - ), - 42926 => - array ( - 0 => 618, - 1 => 'ɪ', - ), - 42928 => - array ( - 0 => 670, - 1 => 'ʞ', - ), - 42929 => - array ( - 0 => 647, - 1 => 'ʇ', - ), - 42930 => - array ( - 0 => 669, - 1 => 'ʝ', - ), - 42931 => - array ( - 0 => 43859, - 1 => 'ꭓ', - ), - 42932 => - array ( - 0 => 42933, - 1 => 'ꞵ', - ), - 42934 => - array ( - 0 => 42935, - 1 => 'ꞷ', - ), - 43888 => - array ( - 0 => 5024, - 1 => 'Ꭰ', - ), - 43889 => - array ( - 0 => 5025, - 1 => 'Ꭱ', - ), - 43890 => - array ( - 0 => 5026, - 1 => 'Ꭲ', - ), - 43891 => - array ( - 0 => 5027, - 1 => 'Ꭳ', - ), - 43892 => - array ( - 0 => 5028, - 1 => 'Ꭴ', - ), - 43893 => - array ( - 0 => 5029, - 1 => 'Ꭵ', - ), - 43894 => - array ( - 0 => 5030, - 1 => 'Ꭶ', - ), - 43895 => - array ( - 0 => 5031, - 1 => 'Ꭷ', - ), - 43896 => - array ( - 0 => 5032, - 1 => 'Ꭸ', - ), - 43897 => - array ( - 0 => 5033, - 1 => 'Ꭹ', - ), - 43898 => - array ( - 0 => 5034, - 1 => 'Ꭺ', - ), - 43899 => - array ( - 0 => 5035, - 1 => 'Ꭻ', - ), - 43900 => - array ( - 0 => 5036, - 1 => 'Ꭼ', - ), - 43901 => - array ( - 0 => 5037, - 1 => 'Ꭽ', - ), - 43902 => - array ( - 0 => 5038, - 1 => 'Ꭾ', - ), - 43903 => - array ( - 0 => 5039, - 1 => 'Ꭿ', - ), - 43904 => - array ( - 0 => 5040, - 1 => 'Ꮀ', - ), - 43905 => - array ( - 0 => 5041, - 1 => 'Ꮁ', - ), - 43906 => - array ( - 0 => 5042, - 1 => 'Ꮂ', - ), - 43907 => - array ( - 0 => 5043, - 1 => 'Ꮃ', - ), - 43908 => - array ( - 0 => 5044, - 1 => 'Ꮄ', - ), - 43909 => - array ( - 0 => 5045, - 1 => 'Ꮅ', - ), - 43910 => - array ( - 0 => 5046, - 1 => 'Ꮆ', - ), - 43911 => - array ( - 0 => 5047, - 1 => 'Ꮇ', - ), - 43912 => - array ( - 0 => 5048, - 1 => 'Ꮈ', - ), - 43913 => - array ( - 0 => 5049, - 1 => 'Ꮉ', - ), - 43914 => - array ( - 0 => 5050, - 1 => 'Ꮊ', - ), - 43915 => - array ( - 0 => 5051, - 1 => 'Ꮋ', - ), - 43916 => - array ( - 0 => 5052, - 1 => 'Ꮌ', - ), - 43917 => - array ( - 0 => 5053, - 1 => 'Ꮍ', - ), - 43918 => - array ( - 0 => 5054, - 1 => 'Ꮎ', - ), - 43919 => - array ( - 0 => 5055, - 1 => 'Ꮏ', - ), - 43920 => - array ( - 0 => 5056, - 1 => 'Ꮐ', - ), - 43921 => - array ( - 0 => 5057, - 1 => 'Ꮑ', - ), - 43922 => - array ( - 0 => 5058, - 1 => 'Ꮒ', - ), - 43923 => - array ( - 0 => 5059, - 1 => 'Ꮓ', - ), - 43924 => - array ( - 0 => 5060, - 1 => 'Ꮔ', - ), - 43925 => - array ( - 0 => 5061, - 1 => 'Ꮕ', - ), - 43926 => - array ( - 0 => 5062, - 1 => 'Ꮖ', - ), - 43927 => - array ( - 0 => 5063, - 1 => 'Ꮗ', - ), - 43928 => - array ( - 0 => 5064, - 1 => 'Ꮘ', - ), - 43929 => - array ( - 0 => 5065, - 1 => 'Ꮙ', - ), - 43930 => - array ( - 0 => 5066, - 1 => 'Ꮚ', - ), - 43931 => - array ( - 0 => 5067, - 1 => 'Ꮛ', - ), - 43932 => - array ( - 0 => 5068, - 1 => 'Ꮜ', - ), - 43933 => - array ( - 0 => 5069, - 1 => 'Ꮝ', - ), - 43934 => - array ( - 0 => 5070, - 1 => 'Ꮞ', - ), - 43935 => - array ( - 0 => 5071, - 1 => 'Ꮟ', - ), - 43936 => - array ( - 0 => 5072, - 1 => 'Ꮠ', - ), - 43937 => - array ( - 0 => 5073, - 1 => 'Ꮡ', - ), - 43938 => - array ( - 0 => 5074, - 1 => 'Ꮢ', - ), - 43939 => - array ( - 0 => 5075, - 1 => 'Ꮣ', - ), - 43940 => - array ( - 0 => 5076, - 1 => 'Ꮤ', - ), - 43941 => - array ( - 0 => 5077, - 1 => 'Ꮥ', - ), - 43942 => - array ( - 0 => 5078, - 1 => 'Ꮦ', - ), - 43943 => - array ( - 0 => 5079, - 1 => 'Ꮧ', - ), - 43944 => - array ( - 0 => 5080, - 1 => 'Ꮨ', - ), - 43945 => - array ( - 0 => 5081, - 1 => 'Ꮩ', - ), - 43946 => - array ( - 0 => 5082, - 1 => 'Ꮪ', - ), - 43947 => - array ( - 0 => 5083, - 1 => 'Ꮫ', - ), - 43948 => - array ( - 0 => 5084, - 1 => 'Ꮬ', - ), - 43949 => - array ( - 0 => 5085, - 1 => 'Ꮭ', - ), - 43950 => - array ( - 0 => 5086, - 1 => 'Ꮮ', - ), - 43951 => - array ( - 0 => 5087, - 1 => 'Ꮯ', - ), - 43952 => - array ( - 0 => 5088, - 1 => 'Ꮰ', - ), - 43953 => - array ( - 0 => 5089, - 1 => 'Ꮱ', - ), - 43954 => - array ( - 0 => 5090, - 1 => 'Ꮲ', - ), - 43955 => - array ( - 0 => 5091, - 1 => 'Ꮳ', - ), - 43956 => - array ( - 0 => 5092, - 1 => 'Ꮴ', - ), - 43957 => - array ( - 0 => 5093, - 1 => 'Ꮵ', - ), - 43958 => - array ( - 0 => 5094, - 1 => 'Ꮶ', - ), - 43959 => - array ( - 0 => 5095, - 1 => 'Ꮷ', - ), - 43960 => - array ( - 0 => 5096, - 1 => 'Ꮸ', - ), - 43961 => - array ( - 0 => 5097, - 1 => 'Ꮹ', - ), - 43962 => - array ( - 0 => 5098, - 1 => 'Ꮺ', - ), - 43963 => - array ( - 0 => 5099, - 1 => 'Ꮻ', - ), - 43964 => - array ( - 0 => 5100, - 1 => 'Ꮼ', - ), - 43965 => - array ( - 0 => 5101, - 1 => 'Ꮽ', - ), - 43966 => - array ( - 0 => 5102, - 1 => 'Ꮾ', - ), - 43967 => - array ( - 0 => 5103, - 1 => 'Ꮿ', - ), - 65313 => - array ( - 0 => 65345, - 1 => 'a', - ), - 65314 => - array ( - 0 => 65346, - 1 => 'b', - ), - 65315 => - array ( - 0 => 65347, - 1 => 'c', - ), - 65316 => - array ( - 0 => 65348, - 1 => 'd', - ), - 65317 => - array ( - 0 => 65349, - 1 => 'e', - ), - 65318 => - array ( - 0 => 65350, - 1 => 'f', - ), - 65319 => - array ( - 0 => 65351, - 1 => 'g', - ), - 65320 => - array ( - 0 => 65352, - 1 => 'h', - ), - 65321 => - array ( - 0 => 65353, - 1 => 'i', - ), - 65322 => - array ( - 0 => 65354, - 1 => 'j', - ), - 65323 => - array ( - 0 => 65355, - 1 => 'k', - ), - 65324 => - array ( - 0 => 65356, - 1 => 'l', - ), - 65325 => - array ( - 0 => 65357, - 1 => 'm', - ), - 65326 => - array ( - 0 => 65358, - 1 => 'n', - ), - 65327 => - array ( - 0 => 65359, - 1 => 'o', - ), - 65328 => - array ( - 0 => 65360, - 1 => 'p', - ), - 65329 => - array ( - 0 => 65361, - 1 => 'q', - ), - 65330 => - array ( - 0 => 65362, - 1 => 'r', - ), - 65331 => - array ( - 0 => 65363, - 1 => 's', - ), - 65332 => - array ( - 0 => 65364, - 1 => 't', - ), - 65333 => - array ( - 0 => 65365, - 1 => 'u', - ), - 65334 => - array ( - 0 => 65366, - 1 => 'v', - ), - 65335 => - array ( - 0 => 65367, - 1 => 'w', - ), - 65336 => - array ( - 0 => 65368, - 1 => 'x', - ), - 65337 => - array ( - 0 => 65369, - 1 => 'y', - ), - 65338 => - array ( - 0 => 65370, - 1 => 'z', - ), - 66560 => - array ( - 0 => 66600, - 1 => '𐐨', - ), - 66561 => - array ( - 0 => 66601, - 1 => '𐐩', - ), - 66562 => - array ( - 0 => 66602, - 1 => '𐐪', - ), - 66563 => - array ( - 0 => 66603, - 1 => '𐐫', - ), - 66564 => - array ( - 0 => 66604, - 1 => '𐐬', - ), - 66565 => - array ( - 0 => 66605, - 1 => '𐐭', - ), - 66566 => - array ( - 0 => 66606, - 1 => '𐐮', - ), - 66567 => - array ( - 0 => 66607, - 1 => '𐐯', - ), - 66568 => - array ( - 0 => 66608, - 1 => '𐐰', - ), - 66569 => - array ( - 0 => 66609, - 1 => '𐐱', - ), - 66570 => - array ( - 0 => 66610, - 1 => '𐐲', - ), - 66571 => - array ( - 0 => 66611, - 1 => '𐐳', - ), - 66572 => - array ( - 0 => 66612, - 1 => '𐐴', - ), - 66573 => - array ( - 0 => 66613, - 1 => '𐐵', - ), - 66574 => - array ( - 0 => 66614, - 1 => '𐐶', - ), - 66575 => - array ( - 0 => 66615, - 1 => '𐐷', - ), - 66576 => - array ( - 0 => 66616, - 1 => '𐐸', - ), - 66577 => - array ( - 0 => 66617, - 1 => '𐐹', - ), - 66578 => - array ( - 0 => 66618, - 1 => '𐐺', - ), - 66579 => - array ( - 0 => 66619, - 1 => '𐐻', - ), - 66580 => - array ( - 0 => 66620, - 1 => '𐐼', - ), - 66581 => - array ( - 0 => 66621, - 1 => '𐐽', - ), - 66582 => - array ( - 0 => 66622, - 1 => '𐐾', - ), - 66583 => - array ( - 0 => 66623, - 1 => '𐐿', - ), - 66584 => - array ( - 0 => 66624, - 1 => '𐑀', - ), - 66585 => - array ( - 0 => 66625, - 1 => '𐑁', - ), - 66586 => - array ( - 0 => 66626, - 1 => '𐑂', - ), - 66587 => - array ( - 0 => 66627, - 1 => '𐑃', - ), - 66588 => - array ( - 0 => 66628, - 1 => '𐑄', - ), - 66589 => - array ( - 0 => 66629, - 1 => '𐑅', - ), - 66590 => - array ( - 0 => 66630, - 1 => '𐑆', - ), - 66591 => - array ( - 0 => 66631, - 1 => '𐑇', - ), - 66592 => - array ( - 0 => 66632, - 1 => '𐑈', - ), - 66593 => - array ( - 0 => 66633, - 1 => '𐑉', - ), - 66594 => - array ( - 0 => 66634, - 1 => '𐑊', - ), - 66595 => - array ( - 0 => 66635, - 1 => '𐑋', - ), - 66596 => - array ( - 0 => 66636, - 1 => '𐑌', - ), - 66597 => - array ( - 0 => 66637, - 1 => '𐑍', - ), - 66598 => - array ( - 0 => 66638, - 1 => '𐑎', - ), - 66599 => - array ( - 0 => 66639, - 1 => '𐑏', - ), - 66736 => - array ( - 0 => 66776, - 1 => '𐓘', - ), - 66737 => - array ( - 0 => 66777, - 1 => '𐓙', - ), - 66738 => - array ( - 0 => 66778, - 1 => '𐓚', - ), - 66739 => - array ( - 0 => 66779, - 1 => '𐓛', - ), - 66740 => - array ( - 0 => 66780, - 1 => '𐓜', - ), - 66741 => - array ( - 0 => 66781, - 1 => '𐓝', - ), - 66742 => - array ( - 0 => 66782, - 1 => '𐓞', - ), - 66743 => - array ( - 0 => 66783, - 1 => '𐓟', - ), - 66744 => - array ( - 0 => 66784, - 1 => '𐓠', - ), - 66745 => - array ( - 0 => 66785, - 1 => '𐓡', - ), - 66746 => - array ( - 0 => 66786, - 1 => '𐓢', - ), - 66747 => - array ( - 0 => 66787, - 1 => '𐓣', - ), - 66748 => - array ( - 0 => 66788, - 1 => '𐓤', - ), - 66749 => - array ( - 0 => 66789, - 1 => '𐓥', - ), - 66750 => - array ( - 0 => 66790, - 1 => '𐓦', - ), - 66751 => - array ( - 0 => 66791, - 1 => '𐓧', - ), - 66752 => - array ( - 0 => 66792, - 1 => '𐓨', - ), - 66753 => - array ( - 0 => 66793, - 1 => '𐓩', - ), - 66754 => - array ( - 0 => 66794, - 1 => '𐓪', - ), - 66755 => - array ( - 0 => 66795, - 1 => '𐓫', - ), - 66756 => - array ( - 0 => 66796, - 1 => '𐓬', - ), - 66757 => - array ( - 0 => 66797, - 1 => '𐓭', - ), - 66758 => - array ( - 0 => 66798, - 1 => '𐓮', - ), - 66759 => - array ( - 0 => 66799, - 1 => '𐓯', - ), - 66760 => - array ( - 0 => 66800, - 1 => '𐓰', - ), - 66761 => - array ( - 0 => 66801, - 1 => '𐓱', - ), - 66762 => - array ( - 0 => 66802, - 1 => '𐓲', - ), - 66763 => - array ( - 0 => 66803, - 1 => '𐓳', - ), - 66764 => - array ( - 0 => 66804, - 1 => '𐓴', - ), - 66765 => - array ( - 0 => 66805, - 1 => '𐓵', - ), - 66766 => - array ( - 0 => 66806, - 1 => '𐓶', - ), - 66767 => - array ( - 0 => 66807, - 1 => '𐓷', - ), - 66768 => - array ( - 0 => 66808, - 1 => '𐓸', - ), - 66769 => - array ( - 0 => 66809, - 1 => '𐓹', - ), - 66770 => - array ( - 0 => 66810, - 1 => '𐓺', - ), - 66771 => - array ( - 0 => 66811, - 1 => '𐓻', - ), - 68736 => - array ( - 0 => 68800, - 1 => '𐳀', - ), - 68737 => - array ( - 0 => 68801, - 1 => '𐳁', - ), - 68738 => - array ( - 0 => 68802, - 1 => '𐳂', - ), - 68739 => - array ( - 0 => 68803, - 1 => '𐳃', - ), - 68740 => - array ( - 0 => 68804, - 1 => '𐳄', - ), - 68741 => - array ( - 0 => 68805, - 1 => '𐳅', - ), - 68742 => - array ( - 0 => 68806, - 1 => '𐳆', - ), - 68743 => - array ( - 0 => 68807, - 1 => '𐳇', - ), - 68744 => - array ( - 0 => 68808, - 1 => '𐳈', - ), - 68745 => - array ( - 0 => 68809, - 1 => '𐳉', - ), - 68746 => - array ( - 0 => 68810, - 1 => '𐳊', - ), - 68747 => - array ( - 0 => 68811, - 1 => '𐳋', - ), - 68748 => - array ( - 0 => 68812, - 1 => '𐳌', - ), - 68749 => - array ( - 0 => 68813, - 1 => '𐳍', - ), - 68750 => - array ( - 0 => 68814, - 1 => '𐳎', - ), - 68751 => - array ( - 0 => 68815, - 1 => '𐳏', - ), - 68752 => - array ( - 0 => 68816, - 1 => '𐳐', - ), - 68753 => - array ( - 0 => 68817, - 1 => '𐳑', - ), - 68754 => - array ( - 0 => 68818, - 1 => '𐳒', - ), - 68755 => - array ( - 0 => 68819, - 1 => '𐳓', - ), - 68756 => - array ( - 0 => 68820, - 1 => '𐳔', - ), - 68757 => - array ( - 0 => 68821, - 1 => '𐳕', - ), - 68758 => - array ( - 0 => 68822, - 1 => '𐳖', - ), - 68759 => - array ( - 0 => 68823, - 1 => '𐳗', - ), - 68760 => - array ( - 0 => 68824, - 1 => '𐳘', - ), - 68761 => - array ( - 0 => 68825, - 1 => '𐳙', - ), - 68762 => - array ( - 0 => 68826, - 1 => '𐳚', - ), - 68763 => - array ( - 0 => 68827, - 1 => '𐳛', - ), - 68764 => - array ( - 0 => 68828, - 1 => '𐳜', - ), - 68765 => - array ( - 0 => 68829, - 1 => '𐳝', - ), - 68766 => - array ( - 0 => 68830, - 1 => '𐳞', - ), - 68767 => - array ( - 0 => 68831, - 1 => '𐳟', - ), - 68768 => - array ( - 0 => 68832, - 1 => '𐳠', - ), - 68769 => - array ( - 0 => 68833, - 1 => '𐳡', - ), - 68770 => - array ( - 0 => 68834, - 1 => '𐳢', - ), - 68771 => - array ( - 0 => 68835, - 1 => '𐳣', - ), - 68772 => - array ( - 0 => 68836, - 1 => '𐳤', - ), - 68773 => - array ( - 0 => 68837, - 1 => '𐳥', - ), - 68774 => - array ( - 0 => 68838, - 1 => '𐳦', - ), - 68775 => - array ( - 0 => 68839, - 1 => '𐳧', - ), - 68776 => - array ( - 0 => 68840, - 1 => '𐳨', - ), - 68777 => - array ( - 0 => 68841, - 1 => '𐳩', - ), - 68778 => - array ( - 0 => 68842, - 1 => '𐳪', - ), - 68779 => - array ( - 0 => 68843, - 1 => '𐳫', - ), - 68780 => - array ( - 0 => 68844, - 1 => '𐳬', - ), - 68781 => - array ( - 0 => 68845, - 1 => '𐳭', - ), - 68782 => - array ( - 0 => 68846, - 1 => '𐳮', - ), - 68783 => - array ( - 0 => 68847, - 1 => '𐳯', - ), - 68784 => - array ( - 0 => 68848, - 1 => '𐳰', - ), - 68785 => - array ( - 0 => 68849, - 1 => '𐳱', - ), - 68786 => - array ( - 0 => 68850, - 1 => '𐳲', - ), - 71840 => - array ( - 0 => 71872, - 1 => '𑣀', - ), - 71841 => - array ( - 0 => 71873, - 1 => '𑣁', - ), - 71842 => - array ( - 0 => 71874, - 1 => '𑣂', - ), - 71843 => - array ( - 0 => 71875, - 1 => '𑣃', - ), - 71844 => - array ( - 0 => 71876, - 1 => '𑣄', - ), - 71845 => - array ( - 0 => 71877, - 1 => '𑣅', - ), - 71846 => - array ( - 0 => 71878, - 1 => '𑣆', - ), - 71847 => - array ( - 0 => 71879, - 1 => '𑣇', - ), - 71848 => - array ( - 0 => 71880, - 1 => '𑣈', - ), - 71849 => - array ( - 0 => 71881, - 1 => '𑣉', - ), - 71850 => - array ( - 0 => 71882, - 1 => '𑣊', - ), - 71851 => - array ( - 0 => 71883, - 1 => '𑣋', - ), - 71852 => - array ( - 0 => 71884, - 1 => '𑣌', - ), - 71853 => - array ( - 0 => 71885, - 1 => '𑣍', - ), - 71854 => - array ( - 0 => 71886, - 1 => '𑣎', - ), - 71855 => - array ( - 0 => 71887, - 1 => '𑣏', - ), - 71856 => - array ( - 0 => 71888, - 1 => '𑣐', - ), - 71857 => - array ( - 0 => 71889, - 1 => '𑣑', - ), - 71858 => - array ( - 0 => 71890, - 1 => '𑣒', - ), - 71859 => - array ( - 0 => 71891, - 1 => '𑣓', - ), - 71860 => - array ( - 0 => 71892, - 1 => '𑣔', - ), - 71861 => - array ( - 0 => 71893, - 1 => '𑣕', - ), - 71862 => - array ( - 0 => 71894, - 1 => '𑣖', - ), - 71863 => - array ( - 0 => 71895, - 1 => '𑣗', - ), - 71864 => - array ( - 0 => 71896, - 1 => '𑣘', - ), - 71865 => - array ( - 0 => 71897, - 1 => '𑣙', - ), - 71866 => - array ( - 0 => 71898, - 1 => '𑣚', - ), - 71867 => - array ( - 0 => 71899, - 1 => '𑣛', - ), - 71868 => - array ( - 0 => 71900, - 1 => '𑣜', - ), - 71869 => - array ( - 0 => 71901, - 1 => '𑣝', - ), - 71870 => - array ( - 0 => 71902, - 1 => '𑣞', - ), - 71871 => - array ( - 0 => 71903, - 1 => '𑣟', - ), - 125184 => - array ( - 0 => 125218, - 1 => '𞤢', - ), - 125185 => - array ( - 0 => 125219, - 1 => '𞤣', - ), - 125186 => - array ( - 0 => 125220, - 1 => '𞤤', - ), - 125187 => - array ( - 0 => 125221, - 1 => '𞤥', - ), - 125188 => - array ( - 0 => 125222, - 1 => '𞤦', - ), - 125189 => - array ( - 0 => 125223, - 1 => '𞤧', - ), - 125190 => - array ( - 0 => 125224, - 1 => '𞤨', - ), - 125191 => - array ( - 0 => 125225, - 1 => '𞤩', - ), - 125192 => - array ( - 0 => 125226, - 1 => '𞤪', - ), - 125193 => - array ( - 0 => 125227, - 1 => '𞤫', - ), - 125194 => - array ( - 0 => 125228, - 1 => '𞤬', - ), - 125195 => - array ( - 0 => 125229, - 1 => '𞤭', - ), - 125196 => - array ( - 0 => 125230, - 1 => '𞤮', - ), - 125197 => - array ( - 0 => 125231, - 1 => '𞤯', - ), - 125198 => - array ( - 0 => 125232, - 1 => '𞤰', - ), - 125199 => - array ( - 0 => 125233, - 1 => '𞤱', - ), - 125200 => - array ( - 0 => 125234, - 1 => '𞤲', - ), - 125201 => - array ( - 0 => 125235, - 1 => '𞤳', - ), - 125202 => - array ( - 0 => 125236, - 1 => '𞤴', - ), - 125203 => - array ( - 0 => 125237, - 1 => '𞤵', - ), - 125204 => - array ( - 0 => 125238, - 1 => '𞤶', - ), - 125205 => - array ( - 0 => 125239, - 1 => '𞤷', - ), - 125206 => - array ( - 0 => 125240, - 1 => '𞤸', - ), - 125207 => - array ( - 0 => 125241, - 1 => '𞤹', - ), - 125208 => - array ( - 0 => 125242, - 1 => '𞤺', - ), - 125209 => - array ( - 0 => 125243, - 1 => '𞤻', - ), - 125210 => - array ( - 0 => 125244, - 1 => '𞤼', - ), - 125211 => - array ( - 0 => 125245, - 1 => '𞤽', - ), - 125212 => - array ( - 0 => 125246, - 1 => '𞤾', - ), - 125213 => - array ( - 0 => 125247, - 1 => '𞤿', - ), - 125214 => - array ( - 0 => 125248, - 1 => '𞥀', - ), - 125215 => - array ( - 0 => 125249, - 1 => '𞥁', - ), - 125216 => - array ( - 0 => 125250, - 1 => '𞥂', - ), - 125217 => - array ( - 0 => 125251, - 1 => '𞥃', - ), -); +return [ +0x41 => 0x61, +0x42 => 0x62, +0x43 => 0x63, +0x44 => 0x64, +0x45 => 0x65, +0x46 => 0x66, +0x47 => 0x67, +0x48 => 0x68, +0x49 => 0x69, +0x4A => 0x6A, +0x4B => 0x6B, +0x4C => 0x6C, +0x4D => 0x6D, +0x4E => 0x6E, +0x4F => 0x6F, +0x50 => 0x70, +0x51 => 0x71, +0x52 => 0x72, +0x53 => 0x73, +0x54 => 0x74, +0x55 => 0x75, +0x56 => 0x76, +0x57 => 0x77, +0x58 => 0x78, +0x59 => 0x79, +0x5A => 0x7A, +0xC0 => 0xE0, +0xC1 => 0xE1, +0xC2 => 0xE2, +0xC3 => 0xE3, +0xC4 => 0xE4, +0xC5 => 0xE5, +0xC6 => 0xE6, +0xC7 => 0xE7, +0xC8 => 0xE8, +0xC9 => 0xE9, +0xCA => 0xEA, +0xCB => 0xEB, +0xCC => 0xEC, +0xCD => 0xED, +0xCE => 0xEE, +0xCF => 0xEF, +0xD0 => 0xF0, +0xD1 => 0xF1, +0xD2 => 0xF2, +0xD3 => 0xF3, +0xD4 => 0xF4, +0xD5 => 0xF5, +0xD6 => 0xF6, +0xD8 => 0xF8, +0xD9 => 0xF9, +0xDA => 0xFA, +0xDB => 0xFB, +0xDC => 0xFC, +0xDD => 0xFD, +0xDE => 0xFE, +0x100 => 0x101, +0x102 => 0x103, +0x104 => 0x105, +0x106 => 0x107, +0x108 => 0x109, +0x10A => 0x10B, +0x10C => 0x10D, +0x10E => 0x10F, +0x110 => 0x111, +0x112 => 0x113, +0x114 => 0x115, +0x116 => 0x117, +0x118 => 0x119, +0x11A => 0x11B, +0x11C => 0x11D, +0x11E => 0x11F, +0x120 => 0x121, +0x122 => 0x123, +0x124 => 0x125, +0x126 => 0x127, +0x128 => 0x129, +0x12A => 0x12B, +0x12C => 0x12D, +0x12E => 0x12F, +0x130 => 0x69, +0x132 => 0x133, +0x134 => 0x135, +0x136 => 0x137, +0x139 => 0x13A, +0x13B => 0x13C, +0x13D => 0x13E, +0x13F => 0x140, +0x141 => 0x142, +0x143 => 0x144, +0x145 => 0x146, +0x147 => 0x148, +0x14A => 0x14B, +0x14C => 0x14D, +0x14E => 0x14F, +0x150 => 0x151, +0x152 => 0x153, +0x154 => 0x155, +0x156 => 0x157, +0x158 => 0x159, +0x15A => 0x15B, +0x15C => 0x15D, +0x15E => 0x15F, +0x160 => 0x161, +0x162 => 0x163, +0x164 => 0x165, +0x166 => 0x167, +0x168 => 0x169, +0x16A => 0x16B, +0x16C => 0x16D, +0x16E => 0x16F, +0x170 => 0x171, +0x172 => 0x173, +0x174 => 0x175, +0x176 => 0x177, +0x178 => 0xFF, +0x179 => 0x17A, +0x17B => 0x17C, +0x17D => 0x17E, +0x181 => 0x253, +0x182 => 0x183, +0x184 => 0x185, +0x186 => 0x254, +0x187 => 0x188, +0x189 => 0x256, +0x18A => 0x257, +0x18B => 0x18C, +0x18E => 0x1DD, +0x18F => 0x259, +0x190 => 0x25B, +0x191 => 0x192, +0x193 => 0x260, +0x194 => 0x263, +0x196 => 0x269, +0x197 => 0x268, +0x198 => 0x199, +0x19C => 0x26F, +0x19D => 0x272, +0x19F => 0x275, +0x1A0 => 0x1A1, +0x1A2 => 0x1A3, +0x1A4 => 0x1A5, +0x1A6 => 0x280, +0x1A7 => 0x1A8, +0x1A9 => 0x283, +0x1AC => 0x1AD, +0x1AE => 0x288, +0x1AF => 0x1B0, +0x1B1 => 0x28A, +0x1B2 => 0x28B, +0x1B3 => 0x1B4, +0x1B5 => 0x1B6, +0x1B7 => 0x292, +0x1B8 => 0x1B9, +0x1BC => 0x1BD, +0x1C4 => 0x1C6, +0x1C5 => 0x1C6, +0x1C7 => 0x1C9, +0x1C8 => 0x1C9, +0x1CA => 0x1CC, +0x1CB => 0x1CC, +0x1CD => 0x1CE, +0x1CF => 0x1D0, +0x1D1 => 0x1D2, +0x1D3 => 0x1D4, +0x1D5 => 0x1D6, +0x1D7 => 0x1D8, +0x1D9 => 0x1DA, +0x1DB => 0x1DC, +0x1DE => 0x1DF, +0x1E0 => 0x1E1, +0x1E2 => 0x1E3, +0x1E4 => 0x1E5, +0x1E6 => 0x1E7, +0x1E8 => 0x1E9, +0x1EA => 0x1EB, +0x1EC => 0x1ED, +0x1EE => 0x1EF, +0x1F1 => 0x1F3, +0x1F2 => 0x1F3, +0x1F4 => 0x1F5, +0x1F6 => 0x195, +0x1F7 => 0x1BF, +0x1F8 => 0x1F9, +0x1FA => 0x1FB, +0x1FC => 0x1FD, +0x1FE => 0x1FF, +0x200 => 0x201, +0x202 => 0x203, +0x204 => 0x205, +0x206 => 0x207, +0x208 => 0x209, +0x20A => 0x20B, +0x20C => 0x20D, +0x20E => 0x20F, +0x210 => 0x211, +0x212 => 0x213, +0x214 => 0x215, +0x216 => 0x217, +0x218 => 0x219, +0x21A => 0x21B, +0x21C => 0x21D, +0x21E => 0x21F, +0x220 => 0x19E, +0x222 => 0x223, +0x224 => 0x225, +0x226 => 0x227, +0x228 => 0x229, +0x22A => 0x22B, +0x22C => 0x22D, +0x22E => 0x22F, +0x230 => 0x231, +0x232 => 0x233, +0x23A => 0x2C65, +0x23B => 0x23C, +0x23D => 0x19A, +0x23E => 0x2C66, +0x241 => 0x242, +0x243 => 0x180, +0x244 => 0x289, +0x245 => 0x28C, +0x246 => 0x247, +0x248 => 0x249, +0x24A => 0x24B, +0x24C => 0x24D, +0x24E => 0x24F, +0x370 => 0x371, +0x372 => 0x373, +0x376 => 0x377, +0x37F => 0x3F3, +0x386 => 0x3AC, +0x388 => 0x3AD, +0x389 => 0x3AE, +0x38A => 0x3AF, +0x38C => 0x3CC, +0x38E => 0x3CD, +0x38F => 0x3CE, +0x391 => 0x3B1, +0x392 => 0x3B2, +0x393 => 0x3B3, +0x394 => 0x3B4, +0x395 => 0x3B5, +0x396 => 0x3B6, +0x397 => 0x3B7, +0x398 => 0x3B8, +0x399 => 0x3B9, +0x39A => 0x3BA, +0x39B => 0x3BB, +0x39C => 0x3BC, +0x39D => 0x3BD, +0x39E => 0x3BE, +0x39F => 0x3BF, +0x3A0 => 0x3C0, +0x3A1 => 0x3C1, +0x3A3 => 0x3C3, +0x3A4 => 0x3C4, +0x3A5 => 0x3C5, +0x3A6 => 0x3C6, +0x3A7 => 0x3C7, +0x3A8 => 0x3C8, +0x3A9 => 0x3C9, +0x3AA => 0x3CA, +0x3AB => 0x3CB, +0x3CF => 0x3D7, +0x3D8 => 0x3D9, +0x3DA => 0x3DB, +0x3DC => 0x3DD, +0x3DE => 0x3DF, +0x3E0 => 0x3E1, +0x3E2 => 0x3E3, +0x3E4 => 0x3E5, +0x3E6 => 0x3E7, +0x3E8 => 0x3E9, +0x3EA => 0x3EB, +0x3EC => 0x3ED, +0x3EE => 0x3EF, +0x3F4 => 0x3B8, +0x3F7 => 0x3F8, +0x3F9 => 0x3F2, +0x3FA => 0x3FB, +0x3FD => 0x37B, +0x3FE => 0x37C, +0x3FF => 0x37D, +0x400 => 0x450, +0x401 => 0x451, +0x402 => 0x452, +0x403 => 0x453, +0x404 => 0x454, +0x405 => 0x455, +0x406 => 0x456, +0x407 => 0x457, +0x408 => 0x458, +0x409 => 0x459, +0x40A => 0x45A, +0x40B => 0x45B, +0x40C => 0x45C, +0x40D => 0x45D, +0x40E => 0x45E, +0x40F => 0x45F, +0x410 => 0x430, +0x411 => 0x431, +0x412 => 0x432, +0x413 => 0x433, +0x414 => 0x434, +0x415 => 0x435, +0x416 => 0x436, +0x417 => 0x437, +0x418 => 0x438, +0x419 => 0x439, +0x41A => 0x43A, +0x41B => 0x43B, +0x41C => 0x43C, +0x41D => 0x43D, +0x41E => 0x43E, +0x41F => 0x43F, +0x420 => 0x440, +0x421 => 0x441, +0x422 => 0x442, +0x423 => 0x443, +0x424 => 0x444, +0x425 => 0x445, +0x426 => 0x446, +0x427 => 0x447, +0x428 => 0x448, +0x429 => 0x449, +0x42A => 0x44A, +0x42B => 0x44B, +0x42C => 0x44C, +0x42D => 0x44D, +0x42E => 0x44E, +0x42F => 0x44F, +0x460 => 0x461, +0x462 => 0x463, +0x464 => 0x465, +0x466 => 0x467, +0x468 => 0x469, +0x46A => 0x46B, +0x46C => 0x46D, +0x46E => 0x46F, +0x470 => 0x471, +0x472 => 0x473, +0x474 => 0x475, +0x476 => 0x477, +0x478 => 0x479, +0x47A => 0x47B, +0x47C => 0x47D, +0x47E => 0x47F, +0x480 => 0x481, +0x48A => 0x48B, +0x48C => 0x48D, +0x48E => 0x48F, +0x490 => 0x491, +0x492 => 0x493, +0x494 => 0x495, +0x496 => 0x497, +0x498 => 0x499, +0x49A => 0x49B, +0x49C => 0x49D, +0x49E => 0x49F, +0x4A0 => 0x4A1, +0x4A2 => 0x4A3, +0x4A4 => 0x4A5, +0x4A6 => 0x4A7, +0x4A8 => 0x4A9, +0x4AA => 0x4AB, +0x4AC => 0x4AD, +0x4AE => 0x4AF, +0x4B0 => 0x4B1, +0x4B2 => 0x4B3, +0x4B4 => 0x4B5, +0x4B6 => 0x4B7, +0x4B8 => 0x4B9, +0x4BA => 0x4BB, +0x4BC => 0x4BD, +0x4BE => 0x4BF, +0x4C0 => 0x4CF, +0x4C1 => 0x4C2, +0x4C3 => 0x4C4, +0x4C5 => 0x4C6, +0x4C7 => 0x4C8, +0x4C9 => 0x4CA, +0x4CB => 0x4CC, +0x4CD => 0x4CE, +0x4D0 => 0x4D1, +0x4D2 => 0x4D3, +0x4D4 => 0x4D5, +0x4D6 => 0x4D7, +0x4D8 => 0x4D9, +0x4DA => 0x4DB, +0x4DC => 0x4DD, +0x4DE => 0x4DF, +0x4E0 => 0x4E1, +0x4E2 => 0x4E3, +0x4E4 => 0x4E5, +0x4E6 => 0x4E7, +0x4E8 => 0x4E9, +0x4EA => 0x4EB, +0x4EC => 0x4ED, +0x4EE => 0x4EF, +0x4F0 => 0x4F1, +0x4F2 => 0x4F3, +0x4F4 => 0x4F5, +0x4F6 => 0x4F7, +0x4F8 => 0x4F9, +0x4FA => 0x4FB, +0x4FC => 0x4FD, +0x4FE => 0x4FF, +0x500 => 0x501, +0x502 => 0x503, +0x504 => 0x505, +0x506 => 0x507, +0x508 => 0x509, +0x50A => 0x50B, +0x50C => 0x50D, +0x50E => 0x50F, +0x510 => 0x511, +0x512 => 0x513, +0x514 => 0x515, +0x516 => 0x517, +0x518 => 0x519, +0x51A => 0x51B, +0x51C => 0x51D, +0x51E => 0x51F, +0x520 => 0x521, +0x522 => 0x523, +0x524 => 0x525, +0x526 => 0x527, +0x528 => 0x529, +0x52A => 0x52B, +0x52C => 0x52D, +0x52E => 0x52F, +0x531 => 0x561, +0x532 => 0x562, +0x533 => 0x563, +0x534 => 0x564, +0x535 => 0x565, +0x536 => 0x566, +0x537 => 0x567, +0x538 => 0x568, +0x539 => 0x569, +0x53A => 0x56A, +0x53B => 0x56B, +0x53C => 0x56C, +0x53D => 0x56D, +0x53E => 0x56E, +0x53F => 0x56F, +0x540 => 0x570, +0x541 => 0x571, +0x542 => 0x572, +0x543 => 0x573, +0x544 => 0x574, +0x545 => 0x575, +0x546 => 0x576, +0x547 => 0x577, +0x548 => 0x578, +0x549 => 0x579, +0x54A => 0x57A, +0x54B => 0x57B, +0x54C => 0x57C, +0x54D => 0x57D, +0x54E => 0x57E, +0x54F => 0x57F, +0x550 => 0x580, +0x551 => 0x581, +0x552 => 0x582, +0x553 => 0x583, +0x554 => 0x584, +0x555 => 0x585, +0x556 => 0x586, +0x10A0 => 0x2D00, +0x10A1 => 0x2D01, +0x10A2 => 0x2D02, +0x10A3 => 0x2D03, +0x10A4 => 0x2D04, +0x10A5 => 0x2D05, +0x10A6 => 0x2D06, +0x10A7 => 0x2D07, +0x10A8 => 0x2D08, +0x10A9 => 0x2D09, +0x10AA => 0x2D0A, +0x10AB => 0x2D0B, +0x10AC => 0x2D0C, +0x10AD => 0x2D0D, +0x10AE => 0x2D0E, +0x10AF => 0x2D0F, +0x10B0 => 0x2D10, +0x10B1 => 0x2D11, +0x10B2 => 0x2D12, +0x10B3 => 0x2D13, +0x10B4 => 0x2D14, +0x10B5 => 0x2D15, +0x10B6 => 0x2D16, +0x10B7 => 0x2D17, +0x10B8 => 0x2D18, +0x10B9 => 0x2D19, +0x10BA => 0x2D1A, +0x10BB => 0x2D1B, +0x10BC => 0x2D1C, +0x10BD => 0x2D1D, +0x10BE => 0x2D1E, +0x10BF => 0x2D1F, +0x10C0 => 0x2D20, +0x10C1 => 0x2D21, +0x10C2 => 0x2D22, +0x10C3 => 0x2D23, +0x10C4 => 0x2D24, +0x10C5 => 0x2D25, +0x10C7 => 0x2D27, +0x10CD => 0x2D2D, +0x13A0 => 0xAB70, +0x13A1 => 0xAB71, +0x13A2 => 0xAB72, +0x13A3 => 0xAB73, +0x13A4 => 0xAB74, +0x13A5 => 0xAB75, +0x13A6 => 0xAB76, +0x13A7 => 0xAB77, +0x13A8 => 0xAB78, +0x13A9 => 0xAB79, +0x13AA => 0xAB7A, +0x13AB => 0xAB7B, +0x13AC => 0xAB7C, +0x13AD => 0xAB7D, +0x13AE => 0xAB7E, +0x13AF => 0xAB7F, +0x13B0 => 0xAB80, +0x13B1 => 0xAB81, +0x13B2 => 0xAB82, +0x13B3 => 0xAB83, +0x13B4 => 0xAB84, +0x13B5 => 0xAB85, +0x13B6 => 0xAB86, +0x13B7 => 0xAB87, +0x13B8 => 0xAB88, +0x13B9 => 0xAB89, +0x13BA => 0xAB8A, +0x13BB => 0xAB8B, +0x13BC => 0xAB8C, +0x13BD => 0xAB8D, +0x13BE => 0xAB8E, +0x13BF => 0xAB8F, +0x13C0 => 0xAB90, +0x13C1 => 0xAB91, +0x13C2 => 0xAB92, +0x13C3 => 0xAB93, +0x13C4 => 0xAB94, +0x13C5 => 0xAB95, +0x13C6 => 0xAB96, +0x13C7 => 0xAB97, +0x13C8 => 0xAB98, +0x13C9 => 0xAB99, +0x13CA => 0xAB9A, +0x13CB => 0xAB9B, +0x13CC => 0xAB9C, +0x13CD => 0xAB9D, +0x13CE => 0xAB9E, +0x13CF => 0xAB9F, +0x13D0 => 0xABA0, +0x13D1 => 0xABA1, +0x13D2 => 0xABA2, +0x13D3 => 0xABA3, +0x13D4 => 0xABA4, +0x13D5 => 0xABA5, +0x13D6 => 0xABA6, +0x13D7 => 0xABA7, +0x13D8 => 0xABA8, +0x13D9 => 0xABA9, +0x13DA => 0xABAA, +0x13DB => 0xABAB, +0x13DC => 0xABAC, +0x13DD => 0xABAD, +0x13DE => 0xABAE, +0x13DF => 0xABAF, +0x13E0 => 0xABB0, +0x13E1 => 0xABB1, +0x13E2 => 0xABB2, +0x13E3 => 0xABB3, +0x13E4 => 0xABB4, +0x13E5 => 0xABB5, +0x13E6 => 0xABB6, +0x13E7 => 0xABB7, +0x13E8 => 0xABB8, +0x13E9 => 0xABB9, +0x13EA => 0xABBA, +0x13EB => 0xABBB, +0x13EC => 0xABBC, +0x13ED => 0xABBD, +0x13EE => 0xABBE, +0x13EF => 0xABBF, +0x13F0 => 0x13F8, +0x13F1 => 0x13F9, +0x13F2 => 0x13FA, +0x13F3 => 0x13FB, +0x13F4 => 0x13FC, +0x13F5 => 0x13FD, +0x1C90 => 0x10D0, +0x1C91 => 0x10D1, +0x1C92 => 0x10D2, +0x1C93 => 0x10D3, +0x1C94 => 0x10D4, +0x1C95 => 0x10D5, +0x1C96 => 0x10D6, +0x1C97 => 0x10D7, +0x1C98 => 0x10D8, +0x1C99 => 0x10D9, +0x1C9A => 0x10DA, +0x1C9B => 0x10DB, +0x1C9C => 0x10DC, +0x1C9D => 0x10DD, +0x1C9E => 0x10DE, +0x1C9F => 0x10DF, +0x1CA0 => 0x10E0, +0x1CA1 => 0x10E1, +0x1CA2 => 0x10E2, +0x1CA3 => 0x10E3, +0x1CA4 => 0x10E4, +0x1CA5 => 0x10E5, +0x1CA6 => 0x10E6, +0x1CA7 => 0x10E7, +0x1CA8 => 0x10E8, +0x1CA9 => 0x10E9, +0x1CAA => 0x10EA, +0x1CAB => 0x10EB, +0x1CAC => 0x10EC, +0x1CAD => 0x10ED, +0x1CAE => 0x10EE, +0x1CAF => 0x10EF, +0x1CB0 => 0x10F0, +0x1CB1 => 0x10F1, +0x1CB2 => 0x10F2, +0x1CB3 => 0x10F3, +0x1CB4 => 0x10F4, +0x1CB5 => 0x10F5, +0x1CB6 => 0x10F6, +0x1CB7 => 0x10F7, +0x1CB8 => 0x10F8, +0x1CB9 => 0x10F9, +0x1CBA => 0x10FA, +0x1CBD => 0x10FD, +0x1CBE => 0x10FE, +0x1CBF => 0x10FF, +0x1E00 => 0x1E01, +0x1E02 => 0x1E03, +0x1E04 => 0x1E05, +0x1E06 => 0x1E07, +0x1E08 => 0x1E09, +0x1E0A => 0x1E0B, +0x1E0C => 0x1E0D, +0x1E0E => 0x1E0F, +0x1E10 => 0x1E11, +0x1E12 => 0x1E13, +0x1E14 => 0x1E15, +0x1E16 => 0x1E17, +0x1E18 => 0x1E19, +0x1E1A => 0x1E1B, +0x1E1C => 0x1E1D, +0x1E1E => 0x1E1F, +0x1E20 => 0x1E21, +0x1E22 => 0x1E23, +0x1E24 => 0x1E25, +0x1E26 => 0x1E27, +0x1E28 => 0x1E29, +0x1E2A => 0x1E2B, +0x1E2C => 0x1E2D, +0x1E2E => 0x1E2F, +0x1E30 => 0x1E31, +0x1E32 => 0x1E33, +0x1E34 => 0x1E35, +0x1E36 => 0x1E37, +0x1E38 => 0x1E39, +0x1E3A => 0x1E3B, +0x1E3C => 0x1E3D, +0x1E3E => 0x1E3F, +0x1E40 => 0x1E41, +0x1E42 => 0x1E43, +0x1E44 => 0x1E45, +0x1E46 => 0x1E47, +0x1E48 => 0x1E49, +0x1E4A => 0x1E4B, +0x1E4C => 0x1E4D, +0x1E4E => 0x1E4F, +0x1E50 => 0x1E51, +0x1E52 => 0x1E53, +0x1E54 => 0x1E55, +0x1E56 => 0x1E57, +0x1E58 => 0x1E59, +0x1E5A => 0x1E5B, +0x1E5C => 0x1E5D, +0x1E5E => 0x1E5F, +0x1E60 => 0x1E61, +0x1E62 => 0x1E63, +0x1E64 => 0x1E65, +0x1E66 => 0x1E67, +0x1E68 => 0x1E69, +0x1E6A => 0x1E6B, +0x1E6C => 0x1E6D, +0x1E6E => 0x1E6F, +0x1E70 => 0x1E71, +0x1E72 => 0x1E73, +0x1E74 => 0x1E75, +0x1E76 => 0x1E77, +0x1E78 => 0x1E79, +0x1E7A => 0x1E7B, +0x1E7C => 0x1E7D, +0x1E7E => 0x1E7F, +0x1E80 => 0x1E81, +0x1E82 => 0x1E83, +0x1E84 => 0x1E85, +0x1E86 => 0x1E87, +0x1E88 => 0x1E89, +0x1E8A => 0x1E8B, +0x1E8C => 0x1E8D, +0x1E8E => 0x1E8F, +0x1E90 => 0x1E91, +0x1E92 => 0x1E93, +0x1E94 => 0x1E95, +0x1E9E => 0xDF, +0x1EA0 => 0x1EA1, +0x1EA2 => 0x1EA3, +0x1EA4 => 0x1EA5, +0x1EA6 => 0x1EA7, +0x1EA8 => 0x1EA9, +0x1EAA => 0x1EAB, +0x1EAC => 0x1EAD, +0x1EAE => 0x1EAF, +0x1EB0 => 0x1EB1, +0x1EB2 => 0x1EB3, +0x1EB4 => 0x1EB5, +0x1EB6 => 0x1EB7, +0x1EB8 => 0x1EB9, +0x1EBA => 0x1EBB, +0x1EBC => 0x1EBD, +0x1EBE => 0x1EBF, +0x1EC0 => 0x1EC1, +0x1EC2 => 0x1EC3, +0x1EC4 => 0x1EC5, +0x1EC6 => 0x1EC7, +0x1EC8 => 0x1EC9, +0x1ECA => 0x1ECB, +0x1ECC => 0x1ECD, +0x1ECE => 0x1ECF, +0x1ED0 => 0x1ED1, +0x1ED2 => 0x1ED3, +0x1ED4 => 0x1ED5, +0x1ED6 => 0x1ED7, +0x1ED8 => 0x1ED9, +0x1EDA => 0x1EDB, +0x1EDC => 0x1EDD, +0x1EDE => 0x1EDF, +0x1EE0 => 0x1EE1, +0x1EE2 => 0x1EE3, +0x1EE4 => 0x1EE5, +0x1EE6 => 0x1EE7, +0x1EE8 => 0x1EE9, +0x1EEA => 0x1EEB, +0x1EEC => 0x1EED, +0x1EEE => 0x1EEF, +0x1EF0 => 0x1EF1, +0x1EF2 => 0x1EF3, +0x1EF4 => 0x1EF5, +0x1EF6 => 0x1EF7, +0x1EF8 => 0x1EF9, +0x1EFA => 0x1EFB, +0x1EFC => 0x1EFD, +0x1EFE => 0x1EFF, +0x1F08 => 0x1F00, +0x1F09 => 0x1F01, +0x1F0A => 0x1F02, +0x1F0B => 0x1F03, +0x1F0C => 0x1F04, +0x1F0D => 0x1F05, +0x1F0E => 0x1F06, +0x1F0F => 0x1F07, +0x1F18 => 0x1F10, +0x1F19 => 0x1F11, +0x1F1A => 0x1F12, +0x1F1B => 0x1F13, +0x1F1C => 0x1F14, +0x1F1D => 0x1F15, +0x1F28 => 0x1F20, +0x1F29 => 0x1F21, +0x1F2A => 0x1F22, +0x1F2B => 0x1F23, +0x1F2C => 0x1F24, +0x1F2D => 0x1F25, +0x1F2E => 0x1F26, +0x1F2F => 0x1F27, +0x1F38 => 0x1F30, +0x1F39 => 0x1F31, +0x1F3A => 0x1F32, +0x1F3B => 0x1F33, +0x1F3C => 0x1F34, +0x1F3D => 0x1F35, +0x1F3E => 0x1F36, +0x1F3F => 0x1F37, +0x1F48 => 0x1F40, +0x1F49 => 0x1F41, +0x1F4A => 0x1F42, +0x1F4B => 0x1F43, +0x1F4C => 0x1F44, +0x1F4D => 0x1F45, +0x1F59 => 0x1F51, +0x1F5B => 0x1F53, +0x1F5D => 0x1F55, +0x1F5F => 0x1F57, +0x1F68 => 0x1F60, +0x1F69 => 0x1F61, +0x1F6A => 0x1F62, +0x1F6B => 0x1F63, +0x1F6C => 0x1F64, +0x1F6D => 0x1F65, +0x1F6E => 0x1F66, +0x1F6F => 0x1F67, +0x1F88 => 0x1F80, +0x1F89 => 0x1F81, +0x1F8A => 0x1F82, +0x1F8B => 0x1F83, +0x1F8C => 0x1F84, +0x1F8D => 0x1F85, +0x1F8E => 0x1F86, +0x1F8F => 0x1F87, +0x1F98 => 0x1F90, +0x1F99 => 0x1F91, +0x1F9A => 0x1F92, +0x1F9B => 0x1F93, +0x1F9C => 0x1F94, +0x1F9D => 0x1F95, +0x1F9E => 0x1F96, +0x1F9F => 0x1F97, +0x1FA8 => 0x1FA0, +0x1FA9 => 0x1FA1, +0x1FAA => 0x1FA2, +0x1FAB => 0x1FA3, +0x1FAC => 0x1FA4, +0x1FAD => 0x1FA5, +0x1FAE => 0x1FA6, +0x1FAF => 0x1FA7, +0x1FB8 => 0x1FB0, +0x1FB9 => 0x1FB1, +0x1FBA => 0x1F70, +0x1FBB => 0x1F71, +0x1FBC => 0x1FB3, +0x1FC8 => 0x1F72, +0x1FC9 => 0x1F73, +0x1FCA => 0x1F74, +0x1FCB => 0x1F75, +0x1FCC => 0x1FC3, +0x1FD8 => 0x1FD0, +0x1FD9 => 0x1FD1, +0x1FDA => 0x1F76, +0x1FDB => 0x1F77, +0x1FE8 => 0x1FE0, +0x1FE9 => 0x1FE1, +0x1FEA => 0x1F7A, +0x1FEB => 0x1F7B, +0x1FEC => 0x1FE5, +0x1FF8 => 0x1F78, +0x1FF9 => 0x1F79, +0x1FFA => 0x1F7C, +0x1FFB => 0x1F7D, +0x1FFC => 0x1FF3, +0x2126 => 0x3C9, +0x212A => 0x6B, +0x212B => 0xE5, +0x2132 => 0x214E, +0x2160 => 0x2170, +0x2161 => 0x2171, +0x2162 => 0x2172, +0x2163 => 0x2173, +0x2164 => 0x2174, +0x2165 => 0x2175, +0x2166 => 0x2176, +0x2167 => 0x2177, +0x2168 => 0x2178, +0x2169 => 0x2179, +0x216A => 0x217A, +0x216B => 0x217B, +0x216C => 0x217C, +0x216D => 0x217D, +0x216E => 0x217E, +0x216F => 0x217F, +0x2183 => 0x2184, +0x24B6 => 0x24D0, +0x24B7 => 0x24D1, +0x24B8 => 0x24D2, +0x24B9 => 0x24D3, +0x24BA => 0x24D4, +0x24BB => 0x24D5, +0x24BC => 0x24D6, +0x24BD => 0x24D7, +0x24BE => 0x24D8, +0x24BF => 0x24D9, +0x24C0 => 0x24DA, +0x24C1 => 0x24DB, +0x24C2 => 0x24DC, +0x24C3 => 0x24DD, +0x24C4 => 0x24DE, +0x24C5 => 0x24DF, +0x24C6 => 0x24E0, +0x24C7 => 0x24E1, +0x24C8 => 0x24E2, +0x24C9 => 0x24E3, +0x24CA => 0x24E4, +0x24CB => 0x24E5, +0x24CC => 0x24E6, +0x24CD => 0x24E7, +0x24CE => 0x24E8, +0x24CF => 0x24E9, +0x2C00 => 0x2C30, +0x2C01 => 0x2C31, +0x2C02 => 0x2C32, +0x2C03 => 0x2C33, +0x2C04 => 0x2C34, +0x2C05 => 0x2C35, +0x2C06 => 0x2C36, +0x2C07 => 0x2C37, +0x2C08 => 0x2C38, +0x2C09 => 0x2C39, +0x2C0A => 0x2C3A, +0x2C0B => 0x2C3B, +0x2C0C => 0x2C3C, +0x2C0D => 0x2C3D, +0x2C0E => 0x2C3E, +0x2C0F => 0x2C3F, +0x2C10 => 0x2C40, +0x2C11 => 0x2C41, +0x2C12 => 0x2C42, +0x2C13 => 0x2C43, +0x2C14 => 0x2C44, +0x2C15 => 0x2C45, +0x2C16 => 0x2C46, +0x2C17 => 0x2C47, +0x2C18 => 0x2C48, +0x2C19 => 0x2C49, +0x2C1A => 0x2C4A, +0x2C1B => 0x2C4B, +0x2C1C => 0x2C4C, +0x2C1D => 0x2C4D, +0x2C1E => 0x2C4E, +0x2C1F => 0x2C4F, +0x2C20 => 0x2C50, +0x2C21 => 0x2C51, +0x2C22 => 0x2C52, +0x2C23 => 0x2C53, +0x2C24 => 0x2C54, +0x2C25 => 0x2C55, +0x2C26 => 0x2C56, +0x2C27 => 0x2C57, +0x2C28 => 0x2C58, +0x2C29 => 0x2C59, +0x2C2A => 0x2C5A, +0x2C2B => 0x2C5B, +0x2C2C => 0x2C5C, +0x2C2D => 0x2C5D, +0x2C2E => 0x2C5E, +0x2C60 => 0x2C61, +0x2C62 => 0x26B, +0x2C63 => 0x1D7D, +0x2C64 => 0x27D, +0x2C67 => 0x2C68, +0x2C69 => 0x2C6A, +0x2C6B => 0x2C6C, +0x2C6D => 0x251, +0x2C6E => 0x271, +0x2C6F => 0x250, +0x2C70 => 0x252, +0x2C72 => 0x2C73, +0x2C75 => 0x2C76, +0x2C7E => 0x23F, +0x2C7F => 0x240, +0x2C80 => 0x2C81, +0x2C82 => 0x2C83, +0x2C84 => 0x2C85, +0x2C86 => 0x2C87, +0x2C88 => 0x2C89, +0x2C8A => 0x2C8B, +0x2C8C => 0x2C8D, +0x2C8E => 0x2C8F, +0x2C90 => 0x2C91, +0x2C92 => 0x2C93, +0x2C94 => 0x2C95, +0x2C96 => 0x2C97, +0x2C98 => 0x2C99, +0x2C9A => 0x2C9B, +0x2C9C => 0x2C9D, +0x2C9E => 0x2C9F, +0x2CA0 => 0x2CA1, +0x2CA2 => 0x2CA3, +0x2CA4 => 0x2CA5, +0x2CA6 => 0x2CA7, +0x2CA8 => 0x2CA9, +0x2CAA => 0x2CAB, +0x2CAC => 0x2CAD, +0x2CAE => 0x2CAF, +0x2CB0 => 0x2CB1, +0x2CB2 => 0x2CB3, +0x2CB4 => 0x2CB5, +0x2CB6 => 0x2CB7, +0x2CB8 => 0x2CB9, +0x2CBA => 0x2CBB, +0x2CBC => 0x2CBD, +0x2CBE => 0x2CBF, +0x2CC0 => 0x2CC1, +0x2CC2 => 0x2CC3, +0x2CC4 => 0x2CC5, +0x2CC6 => 0x2CC7, +0x2CC8 => 0x2CC9, +0x2CCA => 0x2CCB, +0x2CCC => 0x2CCD, +0x2CCE => 0x2CCF, +0x2CD0 => 0x2CD1, +0x2CD2 => 0x2CD3, +0x2CD4 => 0x2CD5, +0x2CD6 => 0x2CD7, +0x2CD8 => 0x2CD9, +0x2CDA => 0x2CDB, +0x2CDC => 0x2CDD, +0x2CDE => 0x2CDF, +0x2CE0 => 0x2CE1, +0x2CE2 => 0x2CE3, +0x2CEB => 0x2CEC, +0x2CED => 0x2CEE, +0x2CF2 => 0x2CF3, +0xA640 => 0xA641, +0xA642 => 0xA643, +0xA644 => 0xA645, +0xA646 => 0xA647, +0xA648 => 0xA649, +0xA64A => 0xA64B, +0xA64C => 0xA64D, +0xA64E => 0xA64F, +0xA650 => 0xA651, +0xA652 => 0xA653, +0xA654 => 0xA655, +0xA656 => 0xA657, +0xA658 => 0xA659, +0xA65A => 0xA65B, +0xA65C => 0xA65D, +0xA65E => 0xA65F, +0xA660 => 0xA661, +0xA662 => 0xA663, +0xA664 => 0xA665, +0xA666 => 0xA667, +0xA668 => 0xA669, +0xA66A => 0xA66B, +0xA66C => 0xA66D, +0xA680 => 0xA681, +0xA682 => 0xA683, +0xA684 => 0xA685, +0xA686 => 0xA687, +0xA688 => 0xA689, +0xA68A => 0xA68B, +0xA68C => 0xA68D, +0xA68E => 0xA68F, +0xA690 => 0xA691, +0xA692 => 0xA693, +0xA694 => 0xA695, +0xA696 => 0xA697, +0xA698 => 0xA699, +0xA69A => 0xA69B, +0xA722 => 0xA723, +0xA724 => 0xA725, +0xA726 => 0xA727, +0xA728 => 0xA729, +0xA72A => 0xA72B, +0xA72C => 0xA72D, +0xA72E => 0xA72F, +0xA732 => 0xA733, +0xA734 => 0xA735, +0xA736 => 0xA737, +0xA738 => 0xA739, +0xA73A => 0xA73B, +0xA73C => 0xA73D, +0xA73E => 0xA73F, +0xA740 => 0xA741, +0xA742 => 0xA743, +0xA744 => 0xA745, +0xA746 => 0xA747, +0xA748 => 0xA749, +0xA74A => 0xA74B, +0xA74C => 0xA74D, +0xA74E => 0xA74F, +0xA750 => 0xA751, +0xA752 => 0xA753, +0xA754 => 0xA755, +0xA756 => 0xA757, +0xA758 => 0xA759, +0xA75A => 0xA75B, +0xA75C => 0xA75D, +0xA75E => 0xA75F, +0xA760 => 0xA761, +0xA762 => 0xA763, +0xA764 => 0xA765, +0xA766 => 0xA767, +0xA768 => 0xA769, +0xA76A => 0xA76B, +0xA76C => 0xA76D, +0xA76E => 0xA76F, +0xA779 => 0xA77A, +0xA77B => 0xA77C, +0xA77D => 0x1D79, +0xA77E => 0xA77F, +0xA780 => 0xA781, +0xA782 => 0xA783, +0xA784 => 0xA785, +0xA786 => 0xA787, +0xA78B => 0xA78C, +0xA78D => 0x265, +0xA790 => 0xA791, +0xA792 => 0xA793, +0xA796 => 0xA797, +0xA798 => 0xA799, +0xA79A => 0xA79B, +0xA79C => 0xA79D, +0xA79E => 0xA79F, +0xA7A0 => 0xA7A1, +0xA7A2 => 0xA7A3, +0xA7A4 => 0xA7A5, +0xA7A6 => 0xA7A7, +0xA7A8 => 0xA7A9, +0xA7AA => 0x266, +0xA7AB => 0x25C, +0xA7AC => 0x261, +0xA7AD => 0x26C, +0xA7AE => 0x26A, +0xA7B0 => 0x29E, +0xA7B1 => 0x287, +0xA7B2 => 0x29D, +0xA7B3 => 0xAB53, +0xA7B4 => 0xA7B5, +0xA7B6 => 0xA7B7, +0xA7B8 => 0xA7B9, +0xA7BA => 0xA7BB, +0xA7BC => 0xA7BD, +0xA7BE => 0xA7BF, +0xA7C2 => 0xA7C3, +0xA7C4 => 0xA794, +0xA7C5 => 0x282, +0xA7C6 => 0x1D8E, +0xA7C7 => 0xA7C8, +0xA7C9 => 0xA7CA, +0xA7F5 => 0xA7F6, +0xFF21 => 0xFF41, +0xFF22 => 0xFF42, +0xFF23 => 0xFF43, +0xFF24 => 0xFF44, +0xFF25 => 0xFF45, +0xFF26 => 0xFF46, +0xFF27 => 0xFF47, +0xFF28 => 0xFF48, +0xFF29 => 0xFF49, +0xFF2A => 0xFF4A, +0xFF2B => 0xFF4B, +0xFF2C => 0xFF4C, +0xFF2D => 0xFF4D, +0xFF2E => 0xFF4E, +0xFF2F => 0xFF4F, +0xFF30 => 0xFF50, +0xFF31 => 0xFF51, +0xFF32 => 0xFF52, +0xFF33 => 0xFF53, +0xFF34 => 0xFF54, +0xFF35 => 0xFF55, +0xFF36 => 0xFF56, +0xFF37 => 0xFF57, +0xFF38 => 0xFF58, +0xFF39 => 0xFF59, +0xFF3A => 0xFF5A, +0x10400 => 0x10428, +0x10401 => 0x10429, +0x10402 => 0x1042A, +0x10403 => 0x1042B, +0x10404 => 0x1042C, +0x10405 => 0x1042D, +0x10406 => 0x1042E, +0x10407 => 0x1042F, +0x10408 => 0x10430, +0x10409 => 0x10431, +0x1040A => 0x10432, +0x1040B => 0x10433, +0x1040C => 0x10434, +0x1040D => 0x10435, +0x1040E => 0x10436, +0x1040F => 0x10437, +0x10410 => 0x10438, +0x10411 => 0x10439, +0x10412 => 0x1043A, +0x10413 => 0x1043B, +0x10414 => 0x1043C, +0x10415 => 0x1043D, +0x10416 => 0x1043E, +0x10417 => 0x1043F, +0x10418 => 0x10440, +0x10419 => 0x10441, +0x1041A => 0x10442, +0x1041B => 0x10443, +0x1041C => 0x10444, +0x1041D => 0x10445, +0x1041E => 0x10446, +0x1041F => 0x10447, +0x10420 => 0x10448, +0x10421 => 0x10449, +0x10422 => 0x1044A, +0x10423 => 0x1044B, +0x10424 => 0x1044C, +0x10425 => 0x1044D, +0x10426 => 0x1044E, +0x10427 => 0x1044F, +0x104B0 => 0x104D8, +0x104B1 => 0x104D9, +0x104B2 => 0x104DA, +0x104B3 => 0x104DB, +0x104B4 => 0x104DC, +0x104B5 => 0x104DD, +0x104B6 => 0x104DE, +0x104B7 => 0x104DF, +0x104B8 => 0x104E0, +0x104B9 => 0x104E1, +0x104BA => 0x104E2, +0x104BB => 0x104E3, +0x104BC => 0x104E4, +0x104BD => 0x104E5, +0x104BE => 0x104E6, +0x104BF => 0x104E7, +0x104C0 => 0x104E8, +0x104C1 => 0x104E9, +0x104C2 => 0x104EA, +0x104C3 => 0x104EB, +0x104C4 => 0x104EC, +0x104C5 => 0x104ED, +0x104C6 => 0x104EE, +0x104C7 => 0x104EF, +0x104C8 => 0x104F0, +0x104C9 => 0x104F1, +0x104CA => 0x104F2, +0x104CB => 0x104F3, +0x104CC => 0x104F4, +0x104CD => 0x104F5, +0x104CE => 0x104F6, +0x104CF => 0x104F7, +0x104D0 => 0x104F8, +0x104D1 => 0x104F9, +0x104D2 => 0x104FA, +0x104D3 => 0x104FB, +0x10C80 => 0x10CC0, +0x10C81 => 0x10CC1, +0x10C82 => 0x10CC2, +0x10C83 => 0x10CC3, +0x10C84 => 0x10CC4, +0x10C85 => 0x10CC5, +0x10C86 => 0x10CC6, +0x10C87 => 0x10CC7, +0x10C88 => 0x10CC8, +0x10C89 => 0x10CC9, +0x10C8A => 0x10CCA, +0x10C8B => 0x10CCB, +0x10C8C => 0x10CCC, +0x10C8D => 0x10CCD, +0x10C8E => 0x10CCE, +0x10C8F => 0x10CCF, +0x10C90 => 0x10CD0, +0x10C91 => 0x10CD1, +0x10C92 => 0x10CD2, +0x10C93 => 0x10CD3, +0x10C94 => 0x10CD4, +0x10C95 => 0x10CD5, +0x10C96 => 0x10CD6, +0x10C97 => 0x10CD7, +0x10C98 => 0x10CD8, +0x10C99 => 0x10CD9, +0x10C9A => 0x10CDA, +0x10C9B => 0x10CDB, +0x10C9C => 0x10CDC, +0x10C9D => 0x10CDD, +0x10C9E => 0x10CDE, +0x10C9F => 0x10CDF, +0x10CA0 => 0x10CE0, +0x10CA1 => 0x10CE1, +0x10CA2 => 0x10CE2, +0x10CA3 => 0x10CE3, +0x10CA4 => 0x10CE4, +0x10CA5 => 0x10CE5, +0x10CA6 => 0x10CE6, +0x10CA7 => 0x10CE7, +0x10CA8 => 0x10CE8, +0x10CA9 => 0x10CE9, +0x10CAA => 0x10CEA, +0x10CAB => 0x10CEB, +0x10CAC => 0x10CEC, +0x10CAD => 0x10CED, +0x10CAE => 0x10CEE, +0x10CAF => 0x10CEF, +0x10CB0 => 0x10CF0, +0x10CB1 => 0x10CF1, +0x10CB2 => 0x10CF2, +0x118A0 => 0x118C0, +0x118A1 => 0x118C1, +0x118A2 => 0x118C2, +0x118A3 => 0x118C3, +0x118A4 => 0x118C4, +0x118A5 => 0x118C5, +0x118A6 => 0x118C6, +0x118A7 => 0x118C7, +0x118A8 => 0x118C8, +0x118A9 => 0x118C9, +0x118AA => 0x118CA, +0x118AB => 0x118CB, +0x118AC => 0x118CC, +0x118AD => 0x118CD, +0x118AE => 0x118CE, +0x118AF => 0x118CF, +0x118B0 => 0x118D0, +0x118B1 => 0x118D1, +0x118B2 => 0x118D2, +0x118B3 => 0x118D3, +0x118B4 => 0x118D4, +0x118B5 => 0x118D5, +0x118B6 => 0x118D6, +0x118B7 => 0x118D7, +0x118B8 => 0x118D8, +0x118B9 => 0x118D9, +0x118BA => 0x118DA, +0x118BB => 0x118DB, +0x118BC => 0x118DC, +0x118BD => 0x118DD, +0x118BE => 0x118DE, +0x118BF => 0x118DF, +0x16E40 => 0x16E60, +0x16E41 => 0x16E61, +0x16E42 => 0x16E62, +0x16E43 => 0x16E63, +0x16E44 => 0x16E64, +0x16E45 => 0x16E65, +0x16E46 => 0x16E66, +0x16E47 => 0x16E67, +0x16E48 => 0x16E68, +0x16E49 => 0x16E69, +0x16E4A => 0x16E6A, +0x16E4B => 0x16E6B, +0x16E4C => 0x16E6C, +0x16E4D => 0x16E6D, +0x16E4E => 0x16E6E, +0x16E4F => 0x16E6F, +0x16E50 => 0x16E70, +0x16E51 => 0x16E71, +0x16E52 => 0x16E72, +0x16E53 => 0x16E73, +0x16E54 => 0x16E74, +0x16E55 => 0x16E75, +0x16E56 => 0x16E76, +0x16E57 => 0x16E77, +0x16E58 => 0x16E78, +0x16E59 => 0x16E79, +0x16E5A => 0x16E7A, +0x16E5B => 0x16E7B, +0x16E5C => 0x16E7C, +0x16E5D => 0x16E7D, +0x16E5E => 0x16E7E, +0x16E5F => 0x16E7F, +0x1E900 => 0x1E922, +0x1E901 => 0x1E923, +0x1E902 => 0x1E924, +0x1E903 => 0x1E925, +0x1E904 => 0x1E926, +0x1E905 => 0x1E927, +0x1E906 => 0x1E928, +0x1E907 => 0x1E929, +0x1E908 => 0x1E92A, +0x1E909 => 0x1E92B, +0x1E90A => 0x1E92C, +0x1E90B => 0x1E92D, +0x1E90C => 0x1E92E, +0x1E90D => 0x1E92F, +0x1E90E => 0x1E930, +0x1E90F => 0x1E931, +0x1E910 => 0x1E932, +0x1E911 => 0x1E933, +0x1E912 => 0x1E934, +0x1E913 => 0x1E935, +0x1E914 => 0x1E936, +0x1E915 => 0x1E937, +0x1E916 => 0x1E938, +0x1E917 => 0x1E939, +0x1E918 => 0x1E93A, +0x1E919 => 0x1E93B, +0x1E91A => 0x1E93C, +0x1E91B => 0x1E93D, +0x1E91C => 0x1E93E, +0x1E91D => 0x1E93F, +0x1E91E => 0x1E940, +0x1E91F => 0x1E941, +0x1E920 => 0x1E942, +0x1E921 => 0x1E943, +]; diff --git a/res/ord.php b/res/ord.php deleted file mode 100644 index a48ec1b..0000000 --- a/res/ord.php +++ /dev/null @@ -1,259 +0,0 @@ - 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, -); diff --git a/res/upper.php b/res/upper.php index 92a8142..376ce6e 100644 --- a/res/upper.php +++ b/res/upper.php @@ -1,6478 +1,1413 @@ - array ( - 0 => 65, - 1 => 'A', - ), - 98 => - array ( - 0 => 66, - 1 => 'B', - ), - 99 => - array ( - 0 => 67, - 1 => 'C', - ), - 100 => - array ( - 0 => 68, - 1 => 'D', - ), - 101 => - array ( - 0 => 69, - 1 => 'E', - ), - 102 => - array ( - 0 => 70, - 1 => 'F', - ), - 103 => - array ( - 0 => 71, - 1 => 'G', - ), - 104 => - array ( - 0 => 72, - 1 => 'H', - ), - 105 => - array ( - 0 => 73, - 1 => 'I', - ), - 106 => - array ( - 0 => 74, - 1 => 'J', - ), - 107 => - array ( - 0 => 8490, - 1 => 'K', - ), - 108 => - array ( - 0 => 76, - 1 => 'L', - ), - 109 => - array ( - 0 => 77, - 1 => 'M', - ), - 110 => - array ( - 0 => 78, - 1 => 'N', - ), - 111 => - array ( - 0 => 79, - 1 => 'O', - ), - 112 => - array ( - 0 => 80, - 1 => 'P', - ), - 113 => - array ( - 0 => 81, - 1 => 'Q', - ), - 114 => - array ( - 0 => 82, - 1 => 'R', - ), - 115 => - array ( - 0 => 383, - 1 => 'ſ', - ), - 116 => - array ( - 0 => 84, - 1 => 'T', - ), - 117 => - array ( - 0 => 85, - 1 => 'U', - ), - 118 => - array ( - 0 => 86, - 1 => 'V', - ), - 119 => - array ( - 0 => 87, - 1 => 'W', - ), - 120 => - array ( - 0 => 88, - 1 => 'X', - ), - 121 => - array ( - 0 => 89, - 1 => 'Y', - ), - 122 => - array ( - 0 => 90, - 1 => 'Z', - ), - 956 => - array ( - 0 => 924, - 1 => 'Μ', - ), - 224 => - array ( - 0 => 192, - 1 => 'À', - ), - 225 => - array ( - 0 => 193, - 1 => 'Á', - ), - 226 => - array ( - 0 => 194, - 1 => 'Â', - ), - 227 => - array ( - 0 => 195, - 1 => 'Ã', - ), - 228 => - array ( - 0 => 196, - 1 => 'Ä', - ), - 229 => - array ( - 0 => 8491, - 1 => 'Å', - ), - 230 => - array ( - 0 => 198, - 1 => 'Æ', - ), - 231 => - array ( - 0 => 199, - 1 => 'Ç', - ), - 232 => - array ( - 0 => 200, - 1 => 'È', - ), - 233 => - array ( - 0 => 201, - 1 => 'É', - ), - 234 => - array ( - 0 => 202, - 1 => 'Ê', - ), - 235 => - array ( - 0 => 203, - 1 => 'Ë', - ), - 236 => - array ( - 0 => 204, - 1 => 'Ì', - ), - 237 => - array ( - 0 => 205, - 1 => 'Í', - ), - 238 => - array ( - 0 => 206, - 1 => 'Î', - ), - 239 => - array ( - 0 => 207, - 1 => 'Ï', - ), - 240 => - array ( - 0 => 208, - 1 => 'Ð', - ), - 241 => - array ( - 0 => 209, - 1 => 'Ñ', - ), - 242 => - array ( - 0 => 210, - 1 => 'Ò', - ), - 243 => - array ( - 0 => 211, - 1 => 'Ó', - ), - 244 => - array ( - 0 => 212, - 1 => 'Ô', - ), - 245 => - array ( - 0 => 213, - 1 => 'Õ', - ), - 246 => - array ( - 0 => 214, - 1 => 'Ö', - ), - 248 => - array ( - 0 => 216, - 1 => 'Ø', - ), - 249 => - array ( - 0 => 217, - 1 => 'Ù', - ), - 250 => - array ( - 0 => 218, - 1 => 'Ú', - ), - 251 => - array ( - 0 => 219, - 1 => 'Û', - ), - 252 => - array ( - 0 => 220, - 1 => 'Ü', - ), - 253 => - array ( - 0 => 221, - 1 => 'Ý', - ), - 254 => - array ( - 0 => 222, - 1 => 'Þ', - ), - 257 => - array ( - 0 => 256, - 1 => 'Ā', - ), - 259 => - array ( - 0 => 258, - 1 => 'Ă', - ), - 261 => - array ( - 0 => 260, - 1 => 'Ą', - ), - 263 => - array ( - 0 => 262, - 1 => 'Ć', - ), - 265 => - array ( - 0 => 264, - 1 => 'Ĉ', - ), - 267 => - array ( - 0 => 266, - 1 => 'Ċ', - ), - 269 => - array ( - 0 => 268, - 1 => 'Č', - ), - 271 => - array ( - 0 => 270, - 1 => 'Ď', - ), - 273 => - array ( - 0 => 272, - 1 => 'Đ', - ), - 275 => - array ( - 0 => 274, - 1 => 'Ē', - ), - 277 => - array ( - 0 => 276, - 1 => 'Ĕ', - ), - 279 => - array ( - 0 => 278, - 1 => 'Ė', - ), - 281 => - array ( - 0 => 280, - 1 => 'Ę', - ), - 283 => - array ( - 0 => 282, - 1 => 'Ě', - ), - 285 => - array ( - 0 => 284, - 1 => 'Ĝ', - ), - 287 => - array ( - 0 => 286, - 1 => 'Ğ', - ), - 289 => - array ( - 0 => 288, - 1 => 'Ġ', - ), - 291 => - array ( - 0 => 290, - 1 => 'Ģ', - ), - 293 => - array ( - 0 => 292, - 1 => 'Ĥ', - ), - 295 => - array ( - 0 => 294, - 1 => 'Ħ', - ), - 297 => - array ( - 0 => 296, - 1 => 'Ĩ', - ), - 299 => - array ( - 0 => 298, - 1 => 'Ī', - ), - 301 => - array ( - 0 => 300, - 1 => 'Ĭ', - ), - 303 => - array ( - 0 => 302, - 1 => 'Į', - ), - 307 => - array ( - 0 => 306, - 1 => 'IJ', - ), - 309 => - array ( - 0 => 308, - 1 => 'Ĵ', - ), - 311 => - array ( - 0 => 310, - 1 => 'Ķ', - ), - 314 => - array ( - 0 => 313, - 1 => 'Ĺ', - ), - 316 => - array ( - 0 => 315, - 1 => 'Ļ', - ), - 318 => - array ( - 0 => 317, - 1 => 'Ľ', - ), - 320 => - array ( - 0 => 319, - 1 => 'Ŀ', - ), - 322 => - array ( - 0 => 321, - 1 => 'Ł', - ), - 324 => - array ( - 0 => 323, - 1 => 'Ń', - ), - 326 => - array ( - 0 => 325, - 1 => 'Ņ', - ), - 328 => - array ( - 0 => 327, - 1 => 'Ň', - ), - 331 => - array ( - 0 => 330, - 1 => 'Ŋ', - ), - 333 => - array ( - 0 => 332, - 1 => 'Ō', - ), - 335 => - array ( - 0 => 334, - 1 => 'Ŏ', - ), - 337 => - array ( - 0 => 336, - 1 => 'Ő', - ), - 339 => - array ( - 0 => 338, - 1 => 'Œ', - ), - 341 => - array ( - 0 => 340, - 1 => 'Ŕ', - ), - 343 => - array ( - 0 => 342, - 1 => 'Ŗ', - ), - 345 => - array ( - 0 => 344, - 1 => 'Ř', - ), - 347 => - array ( - 0 => 346, - 1 => 'Ś', - ), - 349 => - array ( - 0 => 348, - 1 => 'Ŝ', - ), - 351 => - array ( - 0 => 350, - 1 => 'Ş', - ), - 353 => - array ( - 0 => 352, - 1 => 'Š', - ), - 355 => - array ( - 0 => 354, - 1 => 'Ţ', - ), - 357 => - array ( - 0 => 356, - 1 => 'Ť', - ), - 359 => - array ( - 0 => 358, - 1 => 'Ŧ', - ), - 361 => - array ( - 0 => 360, - 1 => 'Ũ', - ), - 363 => - array ( - 0 => 362, - 1 => 'Ū', - ), - 365 => - array ( - 0 => 364, - 1 => 'Ŭ', - ), - 367 => - array ( - 0 => 366, - 1 => 'Ů', - ), - 369 => - array ( - 0 => 368, - 1 => 'Ű', - ), - 371 => - array ( - 0 => 370, - 1 => 'Ų', - ), - 373 => - array ( - 0 => 372, - 1 => 'Ŵ', - ), - 375 => - array ( - 0 => 374, - 1 => 'Ŷ', - ), - 255 => - array ( - 0 => 376, - 1 => 'Ÿ', - ), - 378 => - array ( - 0 => 377, - 1 => 'Ź', - ), - 380 => - array ( - 0 => 379, - 1 => 'Ż', - ), - 382 => - array ( - 0 => 381, - 1 => 'Ž', - ), - 595 => - array ( - 0 => 385, - 1 => 'Ɓ', - ), - 387 => - array ( - 0 => 386, - 1 => 'Ƃ', - ), - 389 => - array ( - 0 => 388, - 1 => 'Ƅ', - ), - 596 => - array ( - 0 => 390, - 1 => 'Ɔ', - ), - 392 => - array ( - 0 => 391, - 1 => 'Ƈ', - ), - 598 => - array ( - 0 => 393, - 1 => 'Ɖ', - ), - 599 => - array ( - 0 => 394, - 1 => 'Ɗ', - ), - 396 => - array ( - 0 => 395, - 1 => 'Ƌ', - ), - 477 => - array ( - 0 => 398, - 1 => 'Ǝ', - ), - 601 => - array ( - 0 => 399, - 1 => 'Ə', - ), - 603 => - array ( - 0 => 400, - 1 => 'Ɛ', - ), - 402 => - array ( - 0 => 401, - 1 => 'Ƒ', - ), - 608 => - array ( - 0 => 403, - 1 => 'Ɠ', - ), - 611 => - array ( - 0 => 404, - 1 => 'Ɣ', - ), - 617 => - array ( - 0 => 406, - 1 => 'Ɩ', - ), - 616 => - array ( - 0 => 407, - 1 => 'Ɨ', - ), - 409 => - array ( - 0 => 408, - 1 => 'Ƙ', - ), - 623 => - array ( - 0 => 412, - 1 => 'Ɯ', - ), - 626 => - array ( - 0 => 413, - 1 => 'Ɲ', - ), - 629 => - array ( - 0 => 415, - 1 => 'Ɵ', - ), - 417 => - array ( - 0 => 416, - 1 => 'Ơ', - ), - 419 => - array ( - 0 => 418, - 1 => 'Ƣ', - ), - 421 => - array ( - 0 => 420, - 1 => 'Ƥ', - ), - 640 => - array ( - 0 => 422, - 1 => 'Ʀ', - ), - 424 => - array ( - 0 => 423, - 1 => 'Ƨ', - ), - 643 => - array ( - 0 => 425, - 1 => 'Ʃ', - ), - 429 => - array ( - 0 => 428, - 1 => 'Ƭ', - ), - 648 => - array ( - 0 => 430, - 1 => 'Ʈ', - ), - 432 => - array ( - 0 => 431, - 1 => 'Ư', - ), - 650 => - array ( - 0 => 433, - 1 => 'Ʊ', - ), - 651 => - array ( - 0 => 434, - 1 => 'Ʋ', - ), - 436 => - array ( - 0 => 435, - 1 => 'Ƴ', - ), - 438 => - array ( - 0 => 437, - 1 => 'Ƶ', - ), - 658 => - array ( - 0 => 439, - 1 => 'Ʒ', - ), - 441 => - array ( - 0 => 440, - 1 => 'Ƹ', - ), - 445 => - array ( - 0 => 444, - 1 => 'Ƽ', - ), - 454 => - array ( - 0 => 453, - 1 => 'Dž', - ), - 457 => - array ( - 0 => 456, - 1 => 'Lj', - ), - 460 => - array ( - 0 => 459, - 1 => 'Nj', - ), - 462 => - array ( - 0 => 461, - 1 => 'Ǎ', - ), - 464 => - array ( - 0 => 463, - 1 => 'Ǐ', - ), - 466 => - array ( - 0 => 465, - 1 => 'Ǒ', - ), - 468 => - array ( - 0 => 467, - 1 => 'Ǔ', - ), - 470 => - array ( - 0 => 469, - 1 => 'Ǖ', - ), - 472 => - array ( - 0 => 471, - 1 => 'Ǘ', - ), - 474 => - array ( - 0 => 473, - 1 => 'Ǚ', - ), - 476 => - array ( - 0 => 475, - 1 => 'Ǜ', - ), - 479 => - array ( - 0 => 478, - 1 => 'Ǟ', - ), - 481 => - array ( - 0 => 480, - 1 => 'Ǡ', - ), - 483 => - array ( - 0 => 482, - 1 => 'Ǣ', - ), - 485 => - array ( - 0 => 484, - 1 => 'Ǥ', - ), - 487 => - array ( - 0 => 486, - 1 => 'Ǧ', - ), - 489 => - array ( - 0 => 488, - 1 => 'Ǩ', - ), - 491 => - array ( - 0 => 490, - 1 => 'Ǫ', - ), - 493 => - array ( - 0 => 492, - 1 => 'Ǭ', - ), - 495 => - array ( - 0 => 494, - 1 => 'Ǯ', - ), - 499 => - array ( - 0 => 498, - 1 => 'Dz', - ), - 501 => - array ( - 0 => 500, - 1 => 'Ǵ', - ), - 405 => - array ( - 0 => 502, - 1 => 'Ƕ', - ), - 447 => - array ( - 0 => 503, - 1 => 'Ƿ', - ), - 505 => - array ( - 0 => 504, - 1 => 'Ǹ', - ), - 507 => - array ( - 0 => 506, - 1 => 'Ǻ', - ), - 509 => - array ( - 0 => 508, - 1 => 'Ǽ', - ), - 511 => - array ( - 0 => 510, - 1 => 'Ǿ', - ), - 513 => - array ( - 0 => 512, - 1 => 'Ȁ', - ), - 515 => - array ( - 0 => 514, - 1 => 'Ȃ', - ), - 517 => - array ( - 0 => 516, - 1 => 'Ȅ', - ), - 519 => - array ( - 0 => 518, - 1 => 'Ȇ', - ), - 521 => - array ( - 0 => 520, - 1 => 'Ȉ', - ), - 523 => - array ( - 0 => 522, - 1 => 'Ȋ', - ), - 525 => - array ( - 0 => 524, - 1 => 'Ȍ', - ), - 527 => - array ( - 0 => 526, - 1 => 'Ȏ', - ), - 529 => - array ( - 0 => 528, - 1 => 'Ȑ', - ), - 531 => - array ( - 0 => 530, - 1 => 'Ȓ', - ), - 533 => - array ( - 0 => 532, - 1 => 'Ȕ', - ), - 535 => - array ( - 0 => 534, - 1 => 'Ȗ', - ), - 537 => - array ( - 0 => 536, - 1 => 'Ș', - ), - 539 => - array ( - 0 => 538, - 1 => 'Ț', - ), - 541 => - array ( - 0 => 540, - 1 => 'Ȝ', - ), - 543 => - array ( - 0 => 542, - 1 => 'Ȟ', - ), - 414 => - array ( - 0 => 544, - 1 => 'Ƞ', - ), - 547 => - array ( - 0 => 546, - 1 => 'Ȣ', - ), - 549 => - array ( - 0 => 548, - 1 => 'Ȥ', - ), - 551 => - array ( - 0 => 550, - 1 => 'Ȧ', - ), - 553 => - array ( - 0 => 552, - 1 => 'Ȩ', - ), - 555 => - array ( - 0 => 554, - 1 => 'Ȫ', - ), - 557 => - array ( - 0 => 556, - 1 => 'Ȭ', - ), - 559 => - array ( - 0 => 558, - 1 => 'Ȯ', - ), - 561 => - array ( - 0 => 560, - 1 => 'Ȱ', - ), - 563 => - array ( - 0 => 562, - 1 => 'Ȳ', - ), - 11365 => - array ( - 0 => 570, - 1 => 'Ⱥ', - ), - 572 => - array ( - 0 => 571, - 1 => 'Ȼ', - ), - 410 => - array ( - 0 => 573, - 1 => 'Ƚ', - ), - 11366 => - array ( - 0 => 574, - 1 => 'Ⱦ', - ), - 578 => - array ( - 0 => 577, - 1 => 'Ɂ', - ), - 384 => - array ( - 0 => 579, - 1 => 'Ƀ', - ), - 649 => - array ( - 0 => 580, - 1 => 'Ʉ', - ), - 652 => - array ( - 0 => 581, - 1 => 'Ʌ', - ), - 583 => - array ( - 0 => 582, - 1 => 'Ɇ', - ), - 585 => - array ( - 0 => 584, - 1 => 'Ɉ', - ), - 587 => - array ( - 0 => 586, - 1 => 'Ɋ', - ), - 589 => - array ( - 0 => 588, - 1 => 'Ɍ', - ), - 591 => - array ( - 0 => 590, - 1 => 'Ɏ', - ), - 953 => - array ( - 0 => 8126, - 1 => 'ι', - ), - 881 => - array ( - 0 => 880, - 1 => 'Ͱ', - ), - 883 => - array ( - 0 => 882, - 1 => 'Ͳ', - ), - 887 => - array ( - 0 => 886, - 1 => 'Ͷ', - ), - 1011 => - array ( - 0 => 895, - 1 => 'Ϳ', - ), - 940 => - array ( - 0 => 902, - 1 => 'Ά', - ), - 941 => - array ( - 0 => 904, - 1 => 'Έ', - ), - 942 => - array ( - 0 => 905, - 1 => 'Ή', - ), - 943 => - array ( - 0 => 906, - 1 => 'Ί', - ), - 972 => - array ( - 0 => 908, - 1 => 'Ό', - ), - 973 => - array ( - 0 => 910, - 1 => 'Ύ', - ), - 974 => - array ( - 0 => 911, - 1 => 'Ώ', - ), - 945 => - array ( - 0 => 913, - 1 => 'Α', - ), - 946 => - array ( - 0 => 976, - 1 => 'ϐ', - ), - 947 => - array ( - 0 => 915, - 1 => 'Γ', - ), - 948 => - array ( - 0 => 916, - 1 => 'Δ', - ), - 949 => - array ( - 0 => 1013, - 1 => 'ϵ', - ), - 950 => - array ( - 0 => 918, - 1 => 'Ζ', - ), - 951 => - array ( - 0 => 919, - 1 => 'Η', - ), - 952 => - array ( - 0 => 1012, - 1 => 'ϴ', - ), - 954 => - array ( - 0 => 1008, - 1 => 'ϰ', - ), - 955 => - array ( - 0 => 923, - 1 => 'Λ', - ), - 957 => - array ( - 0 => 925, - 1 => 'Ν', - ), - 958 => - array ( - 0 => 926, - 1 => 'Ξ', - ), - 959 => - array ( - 0 => 927, - 1 => 'Ο', - ), - 960 => - array ( - 0 => 982, - 1 => 'ϖ', - ), - 961 => - array ( - 0 => 1009, - 1 => 'ϱ', - ), - 963 => - array ( - 0 => 962, - 1 => 'ς', - ), - 964 => - array ( - 0 => 932, - 1 => 'Τ', - ), - 965 => - array ( - 0 => 933, - 1 => 'Υ', - ), - 966 => - array ( - 0 => 981, - 1 => 'ϕ', - ), - 967 => - array ( - 0 => 935, - 1 => 'Χ', - ), - 968 => - array ( - 0 => 936, - 1 => 'Ψ', - ), - 969 => - array ( - 0 => 8486, - 1 => 'Ω', - ), - 970 => - array ( - 0 => 938, - 1 => 'Ϊ', - ), - 971 => - array ( - 0 => 939, - 1 => 'Ϋ', - ), - 983 => - array ( - 0 => 975, - 1 => 'Ϗ', - ), - 985 => - array ( - 0 => 984, - 1 => 'Ϙ', - ), - 987 => - array ( - 0 => 986, - 1 => 'Ϛ', - ), - 989 => - array ( - 0 => 988, - 1 => 'Ϝ', - ), - 991 => - array ( - 0 => 990, - 1 => 'Ϟ', - ), - 993 => - array ( - 0 => 992, - 1 => 'Ϡ', - ), - 995 => - array ( - 0 => 994, - 1 => 'Ϣ', - ), - 997 => - array ( - 0 => 996, - 1 => 'Ϥ', - ), - 999 => - array ( - 0 => 998, - 1 => 'Ϧ', - ), - 1001 => - array ( - 0 => 1000, - 1 => 'Ϩ', - ), - 1003 => - array ( - 0 => 1002, - 1 => 'Ϫ', - ), - 1005 => - array ( - 0 => 1004, - 1 => 'Ϭ', - ), - 1007 => - array ( - 0 => 1006, - 1 => 'Ϯ', - ), - 1016 => - array ( - 0 => 1015, - 1 => 'Ϸ', - ), - 1010 => - array ( - 0 => 1017, - 1 => 'Ϲ', - ), - 1019 => - array ( - 0 => 1018, - 1 => 'Ϻ', - ), - 891 => - array ( - 0 => 1021, - 1 => 'Ͻ', - ), - 892 => - array ( - 0 => 1022, - 1 => 'Ͼ', - ), - 893 => - array ( - 0 => 1023, - 1 => 'Ͽ', - ), - 1104 => - array ( - 0 => 1024, - 1 => 'Ѐ', - ), - 1105 => - array ( - 0 => 1025, - 1 => 'Ё', - ), - 1106 => - array ( - 0 => 1026, - 1 => 'Ђ', - ), - 1107 => - array ( - 0 => 1027, - 1 => 'Ѓ', - ), - 1108 => - array ( - 0 => 1028, - 1 => 'Є', - ), - 1109 => - array ( - 0 => 1029, - 1 => 'Ѕ', - ), - 1110 => - array ( - 0 => 1030, - 1 => 'І', - ), - 1111 => - array ( - 0 => 1031, - 1 => 'Ї', - ), - 1112 => - array ( - 0 => 1032, - 1 => 'Ј', - ), - 1113 => - array ( - 0 => 1033, - 1 => 'Љ', - ), - 1114 => - array ( - 0 => 1034, - 1 => 'Њ', - ), - 1115 => - array ( - 0 => 1035, - 1 => 'Ћ', - ), - 1116 => - array ( - 0 => 1036, - 1 => 'Ќ', - ), - 1117 => - array ( - 0 => 1037, - 1 => 'Ѝ', - ), - 1118 => - array ( - 0 => 1038, - 1 => 'Ў', - ), - 1119 => - array ( - 0 => 1039, - 1 => 'Џ', - ), - 1072 => - array ( - 0 => 1040, - 1 => 'А', - ), - 1073 => - array ( - 0 => 1041, - 1 => 'Б', - ), - 1074 => - array ( - 0 => 7296, - 1 => 'ᲀ', - ), - 1075 => - array ( - 0 => 1043, - 1 => 'Г', - ), - 1076 => - array ( - 0 => 7297, - 1 => 'ᲁ', - ), - 1077 => - array ( - 0 => 1045, - 1 => 'Е', - ), - 1078 => - array ( - 0 => 1046, - 1 => 'Ж', - ), - 1079 => - array ( - 0 => 1047, - 1 => 'З', - ), - 1080 => - array ( - 0 => 1048, - 1 => 'И', - ), - 1081 => - array ( - 0 => 1049, - 1 => 'Й', - ), - 1082 => - array ( - 0 => 1050, - 1 => 'К', - ), - 1083 => - array ( - 0 => 1051, - 1 => 'Л', - ), - 1084 => - array ( - 0 => 1052, - 1 => 'М', - ), - 1085 => - array ( - 0 => 1053, - 1 => 'Н', - ), - 1086 => - array ( - 0 => 7298, - 1 => 'ᲂ', - ), - 1087 => - array ( - 0 => 1055, - 1 => 'П', - ), - 1088 => - array ( - 0 => 1056, - 1 => 'Р', - ), - 1089 => - array ( - 0 => 7299, - 1 => 'ᲃ', - ), - 1090 => - array ( - 0 => 7301, - 1 => 'ᲅ', - ), - 1091 => - array ( - 0 => 1059, - 1 => 'У', - ), - 1092 => - array ( - 0 => 1060, - 1 => 'Ф', - ), - 1093 => - array ( - 0 => 1061, - 1 => 'Х', - ), - 1094 => - array ( - 0 => 1062, - 1 => 'Ц', - ), - 1095 => - array ( - 0 => 1063, - 1 => 'Ч', - ), - 1096 => - array ( - 0 => 1064, - 1 => 'Ш', - ), - 1097 => - array ( - 0 => 1065, - 1 => 'Щ', - ), - 1098 => - array ( - 0 => 7302, - 1 => 'ᲆ', - ), - 1099 => - array ( - 0 => 1067, - 1 => 'Ы', - ), - 1100 => - array ( - 0 => 1068, - 1 => 'Ь', - ), - 1101 => - array ( - 0 => 1069, - 1 => 'Э', - ), - 1102 => - array ( - 0 => 1070, - 1 => 'Ю', - ), - 1103 => - array ( - 0 => 1071, - 1 => 'Я', - ), - 1121 => - array ( - 0 => 1120, - 1 => 'Ѡ', - ), - 1123 => - array ( - 0 => 7303, - 1 => 'ᲇ', - ), - 1125 => - array ( - 0 => 1124, - 1 => 'Ѥ', - ), - 1127 => - array ( - 0 => 1126, - 1 => 'Ѧ', - ), - 1129 => - array ( - 0 => 1128, - 1 => 'Ѩ', - ), - 1131 => - array ( - 0 => 1130, - 1 => 'Ѫ', - ), - 1133 => - array ( - 0 => 1132, - 1 => 'Ѭ', - ), - 1135 => - array ( - 0 => 1134, - 1 => 'Ѯ', - ), - 1137 => - array ( - 0 => 1136, - 1 => 'Ѱ', - ), - 1139 => - array ( - 0 => 1138, - 1 => 'Ѳ', - ), - 1141 => - array ( - 0 => 1140, - 1 => 'Ѵ', - ), - 1143 => - array ( - 0 => 1142, - 1 => 'Ѷ', - ), - 1145 => - array ( - 0 => 1144, - 1 => 'Ѹ', - ), - 1147 => - array ( - 0 => 1146, - 1 => 'Ѻ', - ), - 1149 => - array ( - 0 => 1148, - 1 => 'Ѽ', - ), - 1151 => - array ( - 0 => 1150, - 1 => 'Ѿ', - ), - 1153 => - array ( - 0 => 1152, - 1 => 'Ҁ', - ), - 1163 => - array ( - 0 => 1162, - 1 => 'Ҋ', - ), - 1165 => - array ( - 0 => 1164, - 1 => 'Ҍ', - ), - 1167 => - array ( - 0 => 1166, - 1 => 'Ҏ', - ), - 1169 => - array ( - 0 => 1168, - 1 => 'Ґ', - ), - 1171 => - array ( - 0 => 1170, - 1 => 'Ғ', - ), - 1173 => - array ( - 0 => 1172, - 1 => 'Ҕ', - ), - 1175 => - array ( - 0 => 1174, - 1 => 'Җ', - ), - 1177 => - array ( - 0 => 1176, - 1 => 'Ҙ', - ), - 1179 => - array ( - 0 => 1178, - 1 => 'Қ', - ), - 1181 => - array ( - 0 => 1180, - 1 => 'Ҝ', - ), - 1183 => - array ( - 0 => 1182, - 1 => 'Ҟ', - ), - 1185 => - array ( - 0 => 1184, - 1 => 'Ҡ', - ), - 1187 => - array ( - 0 => 1186, - 1 => 'Ң', - ), - 1189 => - array ( - 0 => 1188, - 1 => 'Ҥ', - ), - 1191 => - array ( - 0 => 1190, - 1 => 'Ҧ', - ), - 1193 => - array ( - 0 => 1192, - 1 => 'Ҩ', - ), - 1195 => - array ( - 0 => 1194, - 1 => 'Ҫ', - ), - 1197 => - array ( - 0 => 1196, - 1 => 'Ҭ', - ), - 1199 => - array ( - 0 => 1198, - 1 => 'Ү', - ), - 1201 => - array ( - 0 => 1200, - 1 => 'Ұ', - ), - 1203 => - array ( - 0 => 1202, - 1 => 'Ҳ', - ), - 1205 => - array ( - 0 => 1204, - 1 => 'Ҵ', - ), - 1207 => - array ( - 0 => 1206, - 1 => 'Ҷ', - ), - 1209 => - array ( - 0 => 1208, - 1 => 'Ҹ', - ), - 1211 => - array ( - 0 => 1210, - 1 => 'Һ', - ), - 1213 => - array ( - 0 => 1212, - 1 => 'Ҽ', - ), - 1215 => - array ( - 0 => 1214, - 1 => 'Ҿ', - ), - 1231 => - array ( - 0 => 1216, - 1 => 'Ӏ', - ), - 1218 => - array ( - 0 => 1217, - 1 => 'Ӂ', - ), - 1220 => - array ( - 0 => 1219, - 1 => 'Ӄ', - ), - 1222 => - array ( - 0 => 1221, - 1 => 'Ӆ', - ), - 1224 => - array ( - 0 => 1223, - 1 => 'Ӈ', - ), - 1226 => - array ( - 0 => 1225, - 1 => 'Ӊ', - ), - 1228 => - array ( - 0 => 1227, - 1 => 'Ӌ', - ), - 1230 => - array ( - 0 => 1229, - 1 => 'Ӎ', - ), - 1233 => - array ( - 0 => 1232, - 1 => 'Ӑ', - ), - 1235 => - array ( - 0 => 1234, - 1 => 'Ӓ', - ), - 1237 => - array ( - 0 => 1236, - 1 => 'Ӕ', - ), - 1239 => - array ( - 0 => 1238, - 1 => 'Ӗ', - ), - 1241 => - array ( - 0 => 1240, - 1 => 'Ә', - ), - 1243 => - array ( - 0 => 1242, - 1 => 'Ӛ', - ), - 1245 => - array ( - 0 => 1244, - 1 => 'Ӝ', - ), - 1247 => - array ( - 0 => 1246, - 1 => 'Ӟ', - ), - 1249 => - array ( - 0 => 1248, - 1 => 'Ӡ', - ), - 1251 => - array ( - 0 => 1250, - 1 => 'Ӣ', - ), - 1253 => - array ( - 0 => 1252, - 1 => 'Ӥ', - ), - 1255 => - array ( - 0 => 1254, - 1 => 'Ӧ', - ), - 1257 => - array ( - 0 => 1256, - 1 => 'Ө', - ), - 1259 => - array ( - 0 => 1258, - 1 => 'Ӫ', - ), - 1261 => - array ( - 0 => 1260, - 1 => 'Ӭ', - ), - 1263 => - array ( - 0 => 1262, - 1 => 'Ӯ', - ), - 1265 => - array ( - 0 => 1264, - 1 => 'Ӱ', - ), - 1267 => - array ( - 0 => 1266, - 1 => 'Ӳ', - ), - 1269 => - array ( - 0 => 1268, - 1 => 'Ӵ', - ), - 1271 => - array ( - 0 => 1270, - 1 => 'Ӷ', - ), - 1273 => - array ( - 0 => 1272, - 1 => 'Ӹ', - ), - 1275 => - array ( - 0 => 1274, - 1 => 'Ӻ', - ), - 1277 => - array ( - 0 => 1276, - 1 => 'Ӽ', - ), - 1279 => - array ( - 0 => 1278, - 1 => 'Ӿ', - ), - 1281 => - array ( - 0 => 1280, - 1 => 'Ԁ', - ), - 1283 => - array ( - 0 => 1282, - 1 => 'Ԃ', - ), - 1285 => - array ( - 0 => 1284, - 1 => 'Ԅ', - ), - 1287 => - array ( - 0 => 1286, - 1 => 'Ԇ', - ), - 1289 => - array ( - 0 => 1288, - 1 => 'Ԉ', - ), - 1291 => - array ( - 0 => 1290, - 1 => 'Ԋ', - ), - 1293 => - array ( - 0 => 1292, - 1 => 'Ԍ', - ), - 1295 => - array ( - 0 => 1294, - 1 => 'Ԏ', - ), - 1297 => - array ( - 0 => 1296, - 1 => 'Ԑ', - ), - 1299 => - array ( - 0 => 1298, - 1 => 'Ԓ', - ), - 1301 => - array ( - 0 => 1300, - 1 => 'Ԕ', - ), - 1303 => - array ( - 0 => 1302, - 1 => 'Ԗ', - ), - 1305 => - array ( - 0 => 1304, - 1 => 'Ԙ', - ), - 1307 => - array ( - 0 => 1306, - 1 => 'Ԛ', - ), - 1309 => - array ( - 0 => 1308, - 1 => 'Ԝ', - ), - 1311 => - array ( - 0 => 1310, - 1 => 'Ԟ', - ), - 1313 => - array ( - 0 => 1312, - 1 => 'Ԡ', - ), - 1315 => - array ( - 0 => 1314, - 1 => 'Ԣ', - ), - 1317 => - array ( - 0 => 1316, - 1 => 'Ԥ', - ), - 1319 => - array ( - 0 => 1318, - 1 => 'Ԧ', - ), - 1321 => - array ( - 0 => 1320, - 1 => 'Ԩ', - ), - 1323 => - array ( - 0 => 1322, - 1 => 'Ԫ', - ), - 1325 => - array ( - 0 => 1324, - 1 => 'Ԭ', - ), - 1327 => - array ( - 0 => 1326, - 1 => 'Ԯ', - ), - 1377 => - array ( - 0 => 1329, - 1 => 'Ա', - ), - 1378 => - array ( - 0 => 1330, - 1 => 'Բ', - ), - 1379 => - array ( - 0 => 1331, - 1 => 'Գ', - ), - 1380 => - array ( - 0 => 1332, - 1 => 'Դ', - ), - 1381 => - array ( - 0 => 1333, - 1 => 'Ե', - ), - 1382 => - array ( - 0 => 1334, - 1 => 'Զ', - ), - 1383 => - array ( - 0 => 1335, - 1 => 'Է', - ), - 1384 => - array ( - 0 => 1336, - 1 => 'Ը', - ), - 1385 => - array ( - 0 => 1337, - 1 => 'Թ', - ), - 1386 => - array ( - 0 => 1338, - 1 => 'Ժ', - ), - 1387 => - array ( - 0 => 1339, - 1 => 'Ի', - ), - 1388 => - array ( - 0 => 1340, - 1 => 'Լ', - ), - 1389 => - array ( - 0 => 1341, - 1 => 'Խ', - ), - 1390 => - array ( - 0 => 1342, - 1 => 'Ծ', - ), - 1391 => - array ( - 0 => 1343, - 1 => 'Կ', - ), - 1392 => - array ( - 0 => 1344, - 1 => 'Հ', - ), - 1393 => - array ( - 0 => 1345, - 1 => 'Ձ', - ), - 1394 => - array ( - 0 => 1346, - 1 => 'Ղ', - ), - 1395 => - array ( - 0 => 1347, - 1 => 'Ճ', - ), - 1396 => - array ( - 0 => 1348, - 1 => 'Մ', - ), - 1397 => - array ( - 0 => 1349, - 1 => 'Յ', - ), - 1398 => - array ( - 0 => 1350, - 1 => 'Ն', - ), - 1399 => - array ( - 0 => 1351, - 1 => 'Շ', - ), - 1400 => - array ( - 0 => 1352, - 1 => 'Ո', - ), - 1401 => - array ( - 0 => 1353, - 1 => 'Չ', - ), - 1402 => - array ( - 0 => 1354, - 1 => 'Պ', - ), - 1403 => - array ( - 0 => 1355, - 1 => 'Ջ', - ), - 1404 => - array ( - 0 => 1356, - 1 => 'Ռ', - ), - 1405 => - array ( - 0 => 1357, - 1 => 'Ս', - ), - 1406 => - array ( - 0 => 1358, - 1 => 'Վ', - ), - 1407 => - array ( - 0 => 1359, - 1 => 'Տ', - ), - 1408 => - array ( - 0 => 1360, - 1 => 'Ր', - ), - 1409 => - array ( - 0 => 1361, - 1 => 'Ց', - ), - 1410 => - array ( - 0 => 1362, - 1 => 'Ւ', - ), - 1411 => - array ( - 0 => 1363, - 1 => 'Փ', - ), - 1412 => - array ( - 0 => 1364, - 1 => 'Ք', - ), - 1413 => - array ( - 0 => 1365, - 1 => 'Օ', - ), - 1414 => - array ( - 0 => 1366, - 1 => 'Ֆ', - ), - 11520 => - array ( - 0 => 4256, - 1 => 'Ⴀ', - ), - 11521 => - array ( - 0 => 4257, - 1 => 'Ⴁ', - ), - 11522 => - array ( - 0 => 4258, - 1 => 'Ⴂ', - ), - 11523 => - array ( - 0 => 4259, - 1 => 'Ⴃ', - ), - 11524 => - array ( - 0 => 4260, - 1 => 'Ⴄ', - ), - 11525 => - array ( - 0 => 4261, - 1 => 'Ⴅ', - ), - 11526 => - array ( - 0 => 4262, - 1 => 'Ⴆ', - ), - 11527 => - array ( - 0 => 4263, - 1 => 'Ⴇ', - ), - 11528 => - array ( - 0 => 4264, - 1 => 'Ⴈ', - ), - 11529 => - array ( - 0 => 4265, - 1 => 'Ⴉ', - ), - 11530 => - array ( - 0 => 4266, - 1 => 'Ⴊ', - ), - 11531 => - array ( - 0 => 4267, - 1 => 'Ⴋ', - ), - 11532 => - array ( - 0 => 4268, - 1 => 'Ⴌ', - ), - 11533 => - array ( - 0 => 4269, - 1 => 'Ⴍ', - ), - 11534 => - array ( - 0 => 4270, - 1 => 'Ⴎ', - ), - 11535 => - array ( - 0 => 4271, - 1 => 'Ⴏ', - ), - 11536 => - array ( - 0 => 4272, - 1 => 'Ⴐ', - ), - 11537 => - array ( - 0 => 4273, - 1 => 'Ⴑ', - ), - 11538 => - array ( - 0 => 4274, - 1 => 'Ⴒ', - ), - 11539 => - array ( - 0 => 4275, - 1 => 'Ⴓ', - ), - 11540 => - array ( - 0 => 4276, - 1 => 'Ⴔ', - ), - 11541 => - array ( - 0 => 4277, - 1 => 'Ⴕ', - ), - 11542 => - array ( - 0 => 4278, - 1 => 'Ⴖ', - ), - 11543 => - array ( - 0 => 4279, - 1 => 'Ⴗ', - ), - 11544 => - array ( - 0 => 4280, - 1 => 'Ⴘ', - ), - 11545 => - array ( - 0 => 4281, - 1 => 'Ⴙ', - ), - 11546 => - array ( - 0 => 4282, - 1 => 'Ⴚ', - ), - 11547 => - array ( - 0 => 4283, - 1 => 'Ⴛ', - ), - 11548 => - array ( - 0 => 4284, - 1 => 'Ⴜ', - ), - 11549 => - array ( - 0 => 4285, - 1 => 'Ⴝ', - ), - 11550 => - array ( - 0 => 4286, - 1 => 'Ⴞ', - ), - 11551 => - array ( - 0 => 4287, - 1 => 'Ⴟ', - ), - 11552 => - array ( - 0 => 4288, - 1 => 'Ⴠ', - ), - 11553 => - array ( - 0 => 4289, - 1 => 'Ⴡ', - ), - 11554 => - array ( - 0 => 4290, - 1 => 'Ⴢ', - ), - 11555 => - array ( - 0 => 4291, - 1 => 'Ⴣ', - ), - 11556 => - array ( - 0 => 4292, - 1 => 'Ⴤ', - ), - 11557 => - array ( - 0 => 4293, - 1 => 'Ⴥ', - ), - 11559 => - array ( - 0 => 4295, - 1 => 'Ⴧ', - ), - 11565 => - array ( - 0 => 4301, - 1 => 'Ⴭ', - ), - 5104 => - array ( - 0 => 5112, - 1 => 'ᏸ', - ), - 5105 => - array ( - 0 => 5113, - 1 => 'ᏹ', - ), - 5106 => - array ( - 0 => 5114, - 1 => 'ᏺ', - ), - 5107 => - array ( - 0 => 5115, - 1 => 'ᏻ', - ), - 5108 => - array ( - 0 => 5116, - 1 => 'ᏼ', - ), - 5109 => - array ( - 0 => 5117, - 1 => 'ᏽ', - ), - 42571 => - array ( - 0 => 42570, - 1 => 'Ꙋ', - ), - 7681 => - array ( - 0 => 7680, - 1 => 'Ḁ', - ), - 7683 => - array ( - 0 => 7682, - 1 => 'Ḃ', - ), - 7685 => - array ( - 0 => 7684, - 1 => 'Ḅ', - ), - 7687 => - array ( - 0 => 7686, - 1 => 'Ḇ', - ), - 7689 => - array ( - 0 => 7688, - 1 => 'Ḉ', - ), - 7691 => - array ( - 0 => 7690, - 1 => 'Ḋ', - ), - 7693 => - array ( - 0 => 7692, - 1 => 'Ḍ', - ), - 7695 => - array ( - 0 => 7694, - 1 => 'Ḏ', - ), - 7697 => - array ( - 0 => 7696, - 1 => 'Ḑ', - ), - 7699 => - array ( - 0 => 7698, - 1 => 'Ḓ', - ), - 7701 => - array ( - 0 => 7700, - 1 => 'Ḕ', - ), - 7703 => - array ( - 0 => 7702, - 1 => 'Ḗ', - ), - 7705 => - array ( - 0 => 7704, - 1 => 'Ḙ', - ), - 7707 => - array ( - 0 => 7706, - 1 => 'Ḛ', - ), - 7709 => - array ( - 0 => 7708, - 1 => 'Ḝ', - ), - 7711 => - array ( - 0 => 7710, - 1 => 'Ḟ', - ), - 7713 => - array ( - 0 => 7712, - 1 => 'Ḡ', - ), - 7715 => - array ( - 0 => 7714, - 1 => 'Ḣ', - ), - 7717 => - array ( - 0 => 7716, - 1 => 'Ḥ', - ), - 7719 => - array ( - 0 => 7718, - 1 => 'Ḧ', - ), - 7721 => - array ( - 0 => 7720, - 1 => 'Ḩ', - ), - 7723 => - array ( - 0 => 7722, - 1 => 'Ḫ', - ), - 7725 => - array ( - 0 => 7724, - 1 => 'Ḭ', - ), - 7727 => - array ( - 0 => 7726, - 1 => 'Ḯ', - ), - 7729 => - array ( - 0 => 7728, - 1 => 'Ḱ', - ), - 7731 => - array ( - 0 => 7730, - 1 => 'Ḳ', - ), - 7733 => - array ( - 0 => 7732, - 1 => 'Ḵ', - ), - 7735 => - array ( - 0 => 7734, - 1 => 'Ḷ', - ), - 7737 => - array ( - 0 => 7736, - 1 => 'Ḹ', - ), - 7739 => - array ( - 0 => 7738, - 1 => 'Ḻ', - ), - 7741 => - array ( - 0 => 7740, - 1 => 'Ḽ', - ), - 7743 => - array ( - 0 => 7742, - 1 => 'Ḿ', - ), - 7745 => - array ( - 0 => 7744, - 1 => 'Ṁ', - ), - 7747 => - array ( - 0 => 7746, - 1 => 'Ṃ', - ), - 7749 => - array ( - 0 => 7748, - 1 => 'Ṅ', - ), - 7751 => - array ( - 0 => 7750, - 1 => 'Ṇ', - ), - 7753 => - array ( - 0 => 7752, - 1 => 'Ṉ', - ), - 7755 => - array ( - 0 => 7754, - 1 => 'Ṋ', - ), - 7757 => - array ( - 0 => 7756, - 1 => 'Ṍ', - ), - 7759 => - array ( - 0 => 7758, - 1 => 'Ṏ', - ), - 7761 => - array ( - 0 => 7760, - 1 => 'Ṑ', - ), - 7763 => - array ( - 0 => 7762, - 1 => 'Ṓ', - ), - 7765 => - array ( - 0 => 7764, - 1 => 'Ṕ', - ), - 7767 => - array ( - 0 => 7766, - 1 => 'Ṗ', - ), - 7769 => - array ( - 0 => 7768, - 1 => 'Ṙ', - ), - 7771 => - array ( - 0 => 7770, - 1 => 'Ṛ', - ), - 7773 => - array ( - 0 => 7772, - 1 => 'Ṝ', - ), - 7775 => - array ( - 0 => 7774, - 1 => 'Ṟ', - ), - 7777 => - array ( - 0 => 7835, - 1 => 'ẛ', - ), - 7779 => - array ( - 0 => 7778, - 1 => 'Ṣ', - ), - 7781 => - array ( - 0 => 7780, - 1 => 'Ṥ', - ), - 7783 => - array ( - 0 => 7782, - 1 => 'Ṧ', - ), - 7785 => - array ( - 0 => 7784, - 1 => 'Ṩ', - ), - 7787 => - array ( - 0 => 7786, - 1 => 'Ṫ', - ), - 7789 => - array ( - 0 => 7788, - 1 => 'Ṭ', - ), - 7791 => - array ( - 0 => 7790, - 1 => 'Ṯ', - ), - 7793 => - array ( - 0 => 7792, - 1 => 'Ṱ', - ), - 7795 => - array ( - 0 => 7794, - 1 => 'Ṳ', - ), - 7797 => - array ( - 0 => 7796, - 1 => 'Ṵ', - ), - 7799 => - array ( - 0 => 7798, - 1 => 'Ṷ', - ), - 7801 => - array ( - 0 => 7800, - 1 => 'Ṹ', - ), - 7803 => - array ( - 0 => 7802, - 1 => 'Ṻ', - ), - 7805 => - array ( - 0 => 7804, - 1 => 'Ṽ', - ), - 7807 => - array ( - 0 => 7806, - 1 => 'Ṿ', - ), - 7809 => - array ( - 0 => 7808, - 1 => 'Ẁ', - ), - 7811 => - array ( - 0 => 7810, - 1 => 'Ẃ', - ), - 7813 => - array ( - 0 => 7812, - 1 => 'Ẅ', - ), - 7815 => - array ( - 0 => 7814, - 1 => 'Ẇ', - ), - 7817 => - array ( - 0 => 7816, - 1 => 'Ẉ', - ), - 7819 => - array ( - 0 => 7818, - 1 => 'Ẋ', - ), - 7821 => - array ( - 0 => 7820, - 1 => 'Ẍ', - ), - 7823 => - array ( - 0 => 7822, - 1 => 'Ẏ', - ), - 7825 => - array ( - 0 => 7824, - 1 => 'Ẑ', - ), - 7827 => - array ( - 0 => 7826, - 1 => 'Ẓ', - ), - 7829 => - array ( - 0 => 7828, - 1 => 'Ẕ', - ), - 223 => - array ( - 0 => 7838, - 1 => 'ẞ', - ), - 7841 => - array ( - 0 => 7840, - 1 => 'Ạ', - ), - 7843 => - array ( - 0 => 7842, - 1 => 'Ả', - ), - 7845 => - array ( - 0 => 7844, - 1 => 'Ấ', - ), - 7847 => - array ( - 0 => 7846, - 1 => 'Ầ', - ), - 7849 => - array ( - 0 => 7848, - 1 => 'Ẩ', - ), - 7851 => - array ( - 0 => 7850, - 1 => 'Ẫ', - ), - 7853 => - array ( - 0 => 7852, - 1 => 'Ậ', - ), - 7855 => - array ( - 0 => 7854, - 1 => 'Ắ', - ), - 7857 => - array ( - 0 => 7856, - 1 => 'Ằ', - ), - 7859 => - array ( - 0 => 7858, - 1 => 'Ẳ', - ), - 7861 => - array ( - 0 => 7860, - 1 => 'Ẵ', - ), - 7863 => - array ( - 0 => 7862, - 1 => 'Ặ', - ), - 7865 => - array ( - 0 => 7864, - 1 => 'Ẹ', - ), - 7867 => - array ( - 0 => 7866, - 1 => 'Ẻ', - ), - 7869 => - array ( - 0 => 7868, - 1 => 'Ẽ', - ), - 7871 => - array ( - 0 => 7870, - 1 => 'Ế', - ), - 7873 => - array ( - 0 => 7872, - 1 => 'Ề', - ), - 7875 => - array ( - 0 => 7874, - 1 => 'Ể', - ), - 7877 => - array ( - 0 => 7876, - 1 => 'Ễ', - ), - 7879 => - array ( - 0 => 7878, - 1 => 'Ệ', - ), - 7881 => - array ( - 0 => 7880, - 1 => 'Ỉ', - ), - 7883 => - array ( - 0 => 7882, - 1 => 'Ị', - ), - 7885 => - array ( - 0 => 7884, - 1 => 'Ọ', - ), - 7887 => - array ( - 0 => 7886, - 1 => 'Ỏ', - ), - 7889 => - array ( - 0 => 7888, - 1 => 'Ố', - ), - 7891 => - array ( - 0 => 7890, - 1 => 'Ồ', - ), - 7893 => - array ( - 0 => 7892, - 1 => 'Ổ', - ), - 7895 => - array ( - 0 => 7894, - 1 => 'Ỗ', - ), - 7897 => - array ( - 0 => 7896, - 1 => 'Ộ', - ), - 7899 => - array ( - 0 => 7898, - 1 => 'Ớ', - ), - 7901 => - array ( - 0 => 7900, - 1 => 'Ờ', - ), - 7903 => - array ( - 0 => 7902, - 1 => 'Ở', - ), - 7905 => - array ( - 0 => 7904, - 1 => 'Ỡ', - ), - 7907 => - array ( - 0 => 7906, - 1 => 'Ợ', - ), - 7909 => - array ( - 0 => 7908, - 1 => 'Ụ', - ), - 7911 => - array ( - 0 => 7910, - 1 => 'Ủ', - ), - 7913 => - array ( - 0 => 7912, - 1 => 'Ứ', - ), - 7915 => - array ( - 0 => 7914, - 1 => 'Ừ', - ), - 7917 => - array ( - 0 => 7916, - 1 => 'Ử', - ), - 7919 => - array ( - 0 => 7918, - 1 => 'Ữ', - ), - 7921 => - array ( - 0 => 7920, - 1 => 'Ự', - ), - 7923 => - array ( - 0 => 7922, - 1 => 'Ỳ', - ), - 7925 => - array ( - 0 => 7924, - 1 => 'Ỵ', - ), - 7927 => - array ( - 0 => 7926, - 1 => 'Ỷ', - ), - 7929 => - array ( - 0 => 7928, - 1 => 'Ỹ', - ), - 7931 => - array ( - 0 => 7930, - 1 => 'Ỻ', - ), - 7933 => - array ( - 0 => 7932, - 1 => 'Ỽ', - ), - 7935 => - array ( - 0 => 7934, - 1 => 'Ỿ', - ), - 7936 => - array ( - 0 => 7944, - 1 => 'Ἀ', - ), - 7937 => - array ( - 0 => 7945, - 1 => 'Ἁ', - ), - 7938 => - array ( - 0 => 7946, - 1 => 'Ἂ', - ), - 7939 => - array ( - 0 => 7947, - 1 => 'Ἃ', - ), - 7940 => - array ( - 0 => 7948, - 1 => 'Ἄ', - ), - 7941 => - array ( - 0 => 7949, - 1 => 'Ἅ', - ), - 7942 => - array ( - 0 => 7950, - 1 => 'Ἆ', - ), - 7943 => - array ( - 0 => 7951, - 1 => 'Ἇ', - ), - 7952 => - array ( - 0 => 7960, - 1 => 'Ἐ', - ), - 7953 => - array ( - 0 => 7961, - 1 => 'Ἑ', - ), - 7954 => - array ( - 0 => 7962, - 1 => 'Ἒ', - ), - 7955 => - array ( - 0 => 7963, - 1 => 'Ἓ', - ), - 7956 => - array ( - 0 => 7964, - 1 => 'Ἔ', - ), - 7957 => - array ( - 0 => 7965, - 1 => 'Ἕ', - ), - 7968 => - array ( - 0 => 7976, - 1 => 'Ἠ', - ), - 7969 => - array ( - 0 => 7977, - 1 => 'Ἡ', - ), - 7970 => - array ( - 0 => 7978, - 1 => 'Ἢ', - ), - 7971 => - array ( - 0 => 7979, - 1 => 'Ἣ', - ), - 7972 => - array ( - 0 => 7980, - 1 => 'Ἤ', - ), - 7973 => - array ( - 0 => 7981, - 1 => 'Ἥ', - ), - 7974 => - array ( - 0 => 7982, - 1 => 'Ἦ', - ), - 7975 => - array ( - 0 => 7983, - 1 => 'Ἧ', - ), - 7984 => - array ( - 0 => 7992, - 1 => 'Ἰ', - ), - 7985 => - array ( - 0 => 7993, - 1 => 'Ἱ', - ), - 7986 => - array ( - 0 => 7994, - 1 => 'Ἲ', - ), - 7987 => - array ( - 0 => 7995, - 1 => 'Ἳ', - ), - 7988 => - array ( - 0 => 7996, - 1 => 'Ἴ', - ), - 7989 => - array ( - 0 => 7997, - 1 => 'Ἵ', - ), - 7990 => - array ( - 0 => 7998, - 1 => 'Ἶ', - ), - 7991 => - array ( - 0 => 7999, - 1 => 'Ἷ', - ), - 8000 => - array ( - 0 => 8008, - 1 => 'Ὀ', - ), - 8001 => - array ( - 0 => 8009, - 1 => 'Ὁ', - ), - 8002 => - array ( - 0 => 8010, - 1 => 'Ὂ', - ), - 8003 => - array ( - 0 => 8011, - 1 => 'Ὃ', - ), - 8004 => - array ( - 0 => 8012, - 1 => 'Ὄ', - ), - 8005 => - array ( - 0 => 8013, - 1 => 'Ὅ', - ), - 8017 => - array ( - 0 => 8025, - 1 => 'Ὑ', - ), - 8019 => - array ( - 0 => 8027, - 1 => 'Ὓ', - ), - 8021 => - array ( - 0 => 8029, - 1 => 'Ὕ', - ), - 8023 => - array ( - 0 => 8031, - 1 => 'Ὗ', - ), - 8032 => - array ( - 0 => 8040, - 1 => 'Ὠ', - ), - 8033 => - array ( - 0 => 8041, - 1 => 'Ὡ', - ), - 8034 => - array ( - 0 => 8042, - 1 => 'Ὢ', - ), - 8035 => - array ( - 0 => 8043, - 1 => 'Ὣ', - ), - 8036 => - array ( - 0 => 8044, - 1 => 'Ὤ', - ), - 8037 => - array ( - 0 => 8045, - 1 => 'Ὥ', - ), - 8038 => - array ( - 0 => 8046, - 1 => 'Ὦ', - ), - 8039 => - array ( - 0 => 8047, - 1 => 'Ὧ', - ), - 8064 => - array ( - 0 => 8072, - 1 => 'ᾈ', - ), - 8065 => - array ( - 0 => 8073, - 1 => 'ᾉ', - ), - 8066 => - array ( - 0 => 8074, - 1 => 'ᾊ', - ), - 8067 => - array ( - 0 => 8075, - 1 => 'ᾋ', - ), - 8068 => - array ( - 0 => 8076, - 1 => 'ᾌ', - ), - 8069 => - array ( - 0 => 8077, - 1 => 'ᾍ', - ), - 8070 => - array ( - 0 => 8078, - 1 => 'ᾎ', - ), - 8071 => - array ( - 0 => 8079, - 1 => 'ᾏ', - ), - 8080 => - array ( - 0 => 8088, - 1 => 'ᾘ', - ), - 8081 => - array ( - 0 => 8089, - 1 => 'ᾙ', - ), - 8082 => - array ( - 0 => 8090, - 1 => 'ᾚ', - ), - 8083 => - array ( - 0 => 8091, - 1 => 'ᾛ', - ), - 8084 => - array ( - 0 => 8092, - 1 => 'ᾜ', - ), - 8085 => - array ( - 0 => 8093, - 1 => 'ᾝ', - ), - 8086 => - array ( - 0 => 8094, - 1 => 'ᾞ', - ), - 8087 => - array ( - 0 => 8095, - 1 => 'ᾟ', - ), - 8096 => - array ( - 0 => 8104, - 1 => 'ᾨ', - ), - 8097 => - array ( - 0 => 8105, - 1 => 'ᾩ', - ), - 8098 => - array ( - 0 => 8106, - 1 => 'ᾪ', - ), - 8099 => - array ( - 0 => 8107, - 1 => 'ᾫ', - ), - 8100 => - array ( - 0 => 8108, - 1 => 'ᾬ', - ), - 8101 => - array ( - 0 => 8109, - 1 => 'ᾭ', - ), - 8102 => - array ( - 0 => 8110, - 1 => 'ᾮ', - ), - 8103 => - array ( - 0 => 8111, - 1 => 'ᾯ', - ), - 8112 => - array ( - 0 => 8120, - 1 => 'Ᾰ', - ), - 8113 => - array ( - 0 => 8121, - 1 => 'Ᾱ', - ), - 8048 => - array ( - 0 => 8122, - 1 => 'Ὰ', - ), - 8049 => - array ( - 0 => 8123, - 1 => 'Ά', - ), - 8115 => - array ( - 0 => 8124, - 1 => 'ᾼ', - ), - 8050 => - array ( - 0 => 8136, - 1 => 'Ὲ', - ), - 8051 => - array ( - 0 => 8137, - 1 => 'Έ', - ), - 8052 => - array ( - 0 => 8138, - 1 => 'Ὴ', - ), - 8053 => - array ( - 0 => 8139, - 1 => 'Ή', - ), - 8131 => - array ( - 0 => 8140, - 1 => 'ῌ', - ), - 8144 => - array ( - 0 => 8152, - 1 => 'Ῐ', - ), - 8145 => - array ( - 0 => 8153, - 1 => 'Ῑ', - ), - 8054 => - array ( - 0 => 8154, - 1 => 'Ὶ', - ), - 8055 => - array ( - 0 => 8155, - 1 => 'Ί', - ), - 8160 => - array ( - 0 => 8168, - 1 => 'Ῠ', - ), - 8161 => - array ( - 0 => 8169, - 1 => 'Ῡ', - ), - 8058 => - array ( - 0 => 8170, - 1 => 'Ὺ', - ), - 8059 => - array ( - 0 => 8171, - 1 => 'Ύ', - ), - 8165 => - array ( - 0 => 8172, - 1 => 'Ῥ', - ), - 8056 => - array ( - 0 => 8184, - 1 => 'Ὸ', - ), - 8057 => - array ( - 0 => 8185, - 1 => 'Ό', - ), - 8060 => - array ( - 0 => 8186, - 1 => 'Ὼ', - ), - 8061 => - array ( - 0 => 8187, - 1 => 'Ώ', - ), - 8179 => - array ( - 0 => 8188, - 1 => 'ῼ', - ), - 8526 => - array ( - 0 => 8498, - 1 => 'Ⅎ', - ), - 8560 => - array ( - 0 => 8544, - 1 => 'Ⅰ', - ), - 8561 => - array ( - 0 => 8545, - 1 => 'Ⅱ', - ), - 8562 => - array ( - 0 => 8546, - 1 => 'Ⅲ', - ), - 8563 => - array ( - 0 => 8547, - 1 => 'Ⅳ', - ), - 8564 => - array ( - 0 => 8548, - 1 => 'Ⅴ', - ), - 8565 => - array ( - 0 => 8549, - 1 => 'Ⅵ', - ), - 8566 => - array ( - 0 => 8550, - 1 => 'Ⅶ', - ), - 8567 => - array ( - 0 => 8551, - 1 => 'Ⅷ', - ), - 8568 => - array ( - 0 => 8552, - 1 => 'Ⅸ', - ), - 8569 => - array ( - 0 => 8553, - 1 => 'Ⅹ', - ), - 8570 => - array ( - 0 => 8554, - 1 => 'Ⅺ', - ), - 8571 => - array ( - 0 => 8555, - 1 => 'Ⅻ', - ), - 8572 => - array ( - 0 => 8556, - 1 => 'Ⅼ', - ), - 8573 => - array ( - 0 => 8557, - 1 => 'Ⅽ', - ), - 8574 => - array ( - 0 => 8558, - 1 => 'Ⅾ', - ), - 8575 => - array ( - 0 => 8559, - 1 => 'Ⅿ', - ), - 8580 => - array ( - 0 => 8579, - 1 => 'Ↄ', - ), - 9424 => - array ( - 0 => 9398, - 1 => 'Ⓐ', - ), - 9425 => - array ( - 0 => 9399, - 1 => 'Ⓑ', - ), - 9426 => - array ( - 0 => 9400, - 1 => 'Ⓒ', - ), - 9427 => - array ( - 0 => 9401, - 1 => 'Ⓓ', - ), - 9428 => - array ( - 0 => 9402, - 1 => 'Ⓔ', - ), - 9429 => - array ( - 0 => 9403, - 1 => 'Ⓕ', - ), - 9430 => - array ( - 0 => 9404, - 1 => 'Ⓖ', - ), - 9431 => - array ( - 0 => 9405, - 1 => 'Ⓗ', - ), - 9432 => - array ( - 0 => 9406, - 1 => 'Ⓘ', - ), - 9433 => - array ( - 0 => 9407, - 1 => 'Ⓙ', - ), - 9434 => - array ( - 0 => 9408, - 1 => 'Ⓚ', - ), - 9435 => - array ( - 0 => 9409, - 1 => 'Ⓛ', - ), - 9436 => - array ( - 0 => 9410, - 1 => 'Ⓜ', - ), - 9437 => - array ( - 0 => 9411, - 1 => 'Ⓝ', - ), - 9438 => - array ( - 0 => 9412, - 1 => 'Ⓞ', - ), - 9439 => - array ( - 0 => 9413, - 1 => 'Ⓟ', - ), - 9440 => - array ( - 0 => 9414, - 1 => 'Ⓠ', - ), - 9441 => - array ( - 0 => 9415, - 1 => 'Ⓡ', - ), - 9442 => - array ( - 0 => 9416, - 1 => 'Ⓢ', - ), - 9443 => - array ( - 0 => 9417, - 1 => 'Ⓣ', - ), - 9444 => - array ( - 0 => 9418, - 1 => 'Ⓤ', - ), - 9445 => - array ( - 0 => 9419, - 1 => 'Ⓥ', - ), - 9446 => - array ( - 0 => 9420, - 1 => 'Ⓦ', - ), - 9447 => - array ( - 0 => 9421, - 1 => 'Ⓧ', - ), - 9448 => - array ( - 0 => 9422, - 1 => 'Ⓨ', - ), - 9449 => - array ( - 0 => 9423, - 1 => 'Ⓩ', - ), - 11312 => - array ( - 0 => 11264, - 1 => 'Ⰰ', - ), - 11313 => - array ( - 0 => 11265, - 1 => 'Ⰱ', - ), - 11314 => - array ( - 0 => 11266, - 1 => 'Ⰲ', - ), - 11315 => - array ( - 0 => 11267, - 1 => 'Ⰳ', - ), - 11316 => - array ( - 0 => 11268, - 1 => 'Ⰴ', - ), - 11317 => - array ( - 0 => 11269, - 1 => 'Ⰵ', - ), - 11318 => - array ( - 0 => 11270, - 1 => 'Ⰶ', - ), - 11319 => - array ( - 0 => 11271, - 1 => 'Ⰷ', - ), - 11320 => - array ( - 0 => 11272, - 1 => 'Ⰸ', - ), - 11321 => - array ( - 0 => 11273, - 1 => 'Ⰹ', - ), - 11322 => - array ( - 0 => 11274, - 1 => 'Ⰺ', - ), - 11323 => - array ( - 0 => 11275, - 1 => 'Ⰻ', - ), - 11324 => - array ( - 0 => 11276, - 1 => 'Ⰼ', - ), - 11325 => - array ( - 0 => 11277, - 1 => 'Ⰽ', - ), - 11326 => - array ( - 0 => 11278, - 1 => 'Ⰾ', - ), - 11327 => - array ( - 0 => 11279, - 1 => 'Ⰿ', - ), - 11328 => - array ( - 0 => 11280, - 1 => 'Ⱀ', - ), - 11329 => - array ( - 0 => 11281, - 1 => 'Ⱁ', - ), - 11330 => - array ( - 0 => 11282, - 1 => 'Ⱂ', - ), - 11331 => - array ( - 0 => 11283, - 1 => 'Ⱃ', - ), - 11332 => - array ( - 0 => 11284, - 1 => 'Ⱄ', - ), - 11333 => - array ( - 0 => 11285, - 1 => 'Ⱅ', - ), - 11334 => - array ( - 0 => 11286, - 1 => 'Ⱆ', - ), - 11335 => - array ( - 0 => 11287, - 1 => 'Ⱇ', - ), - 11336 => - array ( - 0 => 11288, - 1 => 'Ⱈ', - ), - 11337 => - array ( - 0 => 11289, - 1 => 'Ⱉ', - ), - 11338 => - array ( - 0 => 11290, - 1 => 'Ⱊ', - ), - 11339 => - array ( - 0 => 11291, - 1 => 'Ⱋ', - ), - 11340 => - array ( - 0 => 11292, - 1 => 'Ⱌ', - ), - 11341 => - array ( - 0 => 11293, - 1 => 'Ⱍ', - ), - 11342 => - array ( - 0 => 11294, - 1 => 'Ⱎ', - ), - 11343 => - array ( - 0 => 11295, - 1 => 'Ⱏ', - ), - 11344 => - array ( - 0 => 11296, - 1 => 'Ⱐ', - ), - 11345 => - array ( - 0 => 11297, - 1 => 'Ⱑ', - ), - 11346 => - array ( - 0 => 11298, - 1 => 'Ⱒ', - ), - 11347 => - array ( - 0 => 11299, - 1 => 'Ⱓ', - ), - 11348 => - array ( - 0 => 11300, - 1 => 'Ⱔ', - ), - 11349 => - array ( - 0 => 11301, - 1 => 'Ⱕ', - ), - 11350 => - array ( - 0 => 11302, - 1 => 'Ⱖ', - ), - 11351 => - array ( - 0 => 11303, - 1 => 'Ⱗ', - ), - 11352 => - array ( - 0 => 11304, - 1 => 'Ⱘ', - ), - 11353 => - array ( - 0 => 11305, - 1 => 'Ⱙ', - ), - 11354 => - array ( - 0 => 11306, - 1 => 'Ⱚ', - ), - 11355 => - array ( - 0 => 11307, - 1 => 'Ⱛ', - ), - 11356 => - array ( - 0 => 11308, - 1 => 'Ⱜ', - ), - 11357 => - array ( - 0 => 11309, - 1 => 'Ⱝ', - ), - 11358 => - array ( - 0 => 11310, - 1 => 'Ⱞ', - ), - 11361 => - array ( - 0 => 11360, - 1 => 'Ⱡ', - ), - 619 => - array ( - 0 => 11362, - 1 => 'Ɫ', - ), - 7549 => - array ( - 0 => 11363, - 1 => 'Ᵽ', - ), - 637 => - array ( - 0 => 11364, - 1 => 'Ɽ', - ), - 11368 => - array ( - 0 => 11367, - 1 => 'Ⱨ', - ), - 11370 => - array ( - 0 => 11369, - 1 => 'Ⱪ', - ), - 11372 => - array ( - 0 => 11371, - 1 => 'Ⱬ', - ), - 593 => - array ( - 0 => 11373, - 1 => 'Ɑ', - ), - 625 => - array ( - 0 => 11374, - 1 => 'Ɱ', - ), - 592 => - array ( - 0 => 11375, - 1 => 'Ɐ', - ), - 594 => - array ( - 0 => 11376, - 1 => 'Ɒ', - ), - 11379 => - array ( - 0 => 11378, - 1 => 'Ⱳ', - ), - 11382 => - array ( - 0 => 11381, - 1 => 'Ⱶ', - ), - 575 => - array ( - 0 => 11390, - 1 => 'Ȿ', - ), - 576 => - array ( - 0 => 11391, - 1 => 'Ɀ', - ), - 11393 => - array ( - 0 => 11392, - 1 => 'Ⲁ', - ), - 11395 => - array ( - 0 => 11394, - 1 => 'Ⲃ', - ), - 11397 => - array ( - 0 => 11396, - 1 => 'Ⲅ', - ), - 11399 => - array ( - 0 => 11398, - 1 => 'Ⲇ', - ), - 11401 => - array ( - 0 => 11400, - 1 => 'Ⲉ', - ), - 11403 => - array ( - 0 => 11402, - 1 => 'Ⲋ', - ), - 11405 => - array ( - 0 => 11404, - 1 => 'Ⲍ', - ), - 11407 => - array ( - 0 => 11406, - 1 => 'Ⲏ', - ), - 11409 => - array ( - 0 => 11408, - 1 => 'Ⲑ', - ), - 11411 => - array ( - 0 => 11410, - 1 => 'Ⲓ', - ), - 11413 => - array ( - 0 => 11412, - 1 => 'Ⲕ', - ), - 11415 => - array ( - 0 => 11414, - 1 => 'Ⲗ', - ), - 11417 => - array ( - 0 => 11416, - 1 => 'Ⲙ', - ), - 11419 => - array ( - 0 => 11418, - 1 => 'Ⲛ', - ), - 11421 => - array ( - 0 => 11420, - 1 => 'Ⲝ', - ), - 11423 => - array ( - 0 => 11422, - 1 => 'Ⲟ', - ), - 11425 => - array ( - 0 => 11424, - 1 => 'Ⲡ', - ), - 11427 => - array ( - 0 => 11426, - 1 => 'Ⲣ', - ), - 11429 => - array ( - 0 => 11428, - 1 => 'Ⲥ', - ), - 11431 => - array ( - 0 => 11430, - 1 => 'Ⲧ', - ), - 11433 => - array ( - 0 => 11432, - 1 => 'Ⲩ', - ), - 11435 => - array ( - 0 => 11434, - 1 => 'Ⲫ', - ), - 11437 => - array ( - 0 => 11436, - 1 => 'Ⲭ', - ), - 11439 => - array ( - 0 => 11438, - 1 => 'Ⲯ', - ), - 11441 => - array ( - 0 => 11440, - 1 => 'Ⲱ', - ), - 11443 => - array ( - 0 => 11442, - 1 => 'Ⲳ', - ), - 11445 => - array ( - 0 => 11444, - 1 => 'Ⲵ', - ), - 11447 => - array ( - 0 => 11446, - 1 => 'Ⲷ', - ), - 11449 => - array ( - 0 => 11448, - 1 => 'Ⲹ', - ), - 11451 => - array ( - 0 => 11450, - 1 => 'Ⲻ', - ), - 11453 => - array ( - 0 => 11452, - 1 => 'Ⲽ', - ), - 11455 => - array ( - 0 => 11454, - 1 => 'Ⲿ', - ), - 11457 => - array ( - 0 => 11456, - 1 => 'Ⳁ', - ), - 11459 => - array ( - 0 => 11458, - 1 => 'Ⳃ', - ), - 11461 => - array ( - 0 => 11460, - 1 => 'Ⳅ', - ), - 11463 => - array ( - 0 => 11462, - 1 => 'Ⳇ', - ), - 11465 => - array ( - 0 => 11464, - 1 => 'Ⳉ', - ), - 11467 => - array ( - 0 => 11466, - 1 => 'Ⳋ', - ), - 11469 => - array ( - 0 => 11468, - 1 => 'Ⳍ', - ), - 11471 => - array ( - 0 => 11470, - 1 => 'Ⳏ', - ), - 11473 => - array ( - 0 => 11472, - 1 => 'Ⳑ', - ), - 11475 => - array ( - 0 => 11474, - 1 => 'Ⳓ', - ), - 11477 => - array ( - 0 => 11476, - 1 => 'Ⳕ', - ), - 11479 => - array ( - 0 => 11478, - 1 => 'Ⳗ', - ), - 11481 => - array ( - 0 => 11480, - 1 => 'Ⳙ', - ), - 11483 => - array ( - 0 => 11482, - 1 => 'Ⳛ', - ), - 11485 => - array ( - 0 => 11484, - 1 => 'Ⳝ', - ), - 11487 => - array ( - 0 => 11486, - 1 => 'Ⳟ', - ), - 11489 => - array ( - 0 => 11488, - 1 => 'Ⳡ', - ), - 11491 => - array ( - 0 => 11490, - 1 => 'Ⳣ', - ), - 11500 => - array ( - 0 => 11499, - 1 => 'Ⳬ', - ), - 11502 => - array ( - 0 => 11501, - 1 => 'Ⳮ', - ), - 11507 => - array ( - 0 => 11506, - 1 => 'Ⳳ', - ), - 42561 => - array ( - 0 => 42560, - 1 => 'Ꙁ', - ), - 42563 => - array ( - 0 => 42562, - 1 => 'Ꙃ', - ), - 42565 => - array ( - 0 => 42564, - 1 => 'Ꙅ', - ), - 42567 => - array ( - 0 => 42566, - 1 => 'Ꙇ', - ), - 42569 => - array ( - 0 => 42568, - 1 => 'Ꙉ', - ), - 42573 => - array ( - 0 => 42572, - 1 => 'Ꙍ', - ), - 42575 => - array ( - 0 => 42574, - 1 => 'Ꙏ', - ), - 42577 => - array ( - 0 => 42576, - 1 => 'Ꙑ', - ), - 42579 => - array ( - 0 => 42578, - 1 => 'Ꙓ', - ), - 42581 => - array ( - 0 => 42580, - 1 => 'Ꙕ', - ), - 42583 => - array ( - 0 => 42582, - 1 => 'Ꙗ', - ), - 42585 => - array ( - 0 => 42584, - 1 => 'Ꙙ', - ), - 42587 => - array ( - 0 => 42586, - 1 => 'Ꙛ', - ), - 42589 => - array ( - 0 => 42588, - 1 => 'Ꙝ', - ), - 42591 => - array ( - 0 => 42590, - 1 => 'Ꙟ', - ), - 42593 => - array ( - 0 => 42592, - 1 => 'Ꙡ', - ), - 42595 => - array ( - 0 => 42594, - 1 => 'Ꙣ', - ), - 42597 => - array ( - 0 => 42596, - 1 => 'Ꙥ', - ), - 42599 => - array ( - 0 => 42598, - 1 => 'Ꙧ', - ), - 42601 => - array ( - 0 => 42600, - 1 => 'Ꙩ', - ), - 42603 => - array ( - 0 => 42602, - 1 => 'Ꙫ', - ), - 42605 => - array ( - 0 => 42604, - 1 => 'Ꙭ', - ), - 42625 => - array ( - 0 => 42624, - 1 => 'Ꚁ', - ), - 42627 => - array ( - 0 => 42626, - 1 => 'Ꚃ', - ), - 42629 => - array ( - 0 => 42628, - 1 => 'Ꚅ', - ), - 42631 => - array ( - 0 => 42630, - 1 => 'Ꚇ', - ), - 42633 => - array ( - 0 => 42632, - 1 => 'Ꚉ', - ), - 42635 => - array ( - 0 => 42634, - 1 => 'Ꚋ', - ), - 42637 => - array ( - 0 => 42636, - 1 => 'Ꚍ', - ), - 42639 => - array ( - 0 => 42638, - 1 => 'Ꚏ', - ), - 42641 => - array ( - 0 => 42640, - 1 => 'Ꚑ', - ), - 42643 => - array ( - 0 => 42642, - 1 => 'Ꚓ', - ), - 42645 => - array ( - 0 => 42644, - 1 => 'Ꚕ', - ), - 42647 => - array ( - 0 => 42646, - 1 => 'Ꚗ', - ), - 42649 => - array ( - 0 => 42648, - 1 => 'Ꚙ', - ), - 42651 => - array ( - 0 => 42650, - 1 => 'Ꚛ', - ), - 42787 => - array ( - 0 => 42786, - 1 => 'Ꜣ', - ), - 42789 => - array ( - 0 => 42788, - 1 => 'Ꜥ', - ), - 42791 => - array ( - 0 => 42790, - 1 => 'Ꜧ', - ), - 42793 => - array ( - 0 => 42792, - 1 => 'Ꜩ', - ), - 42795 => - array ( - 0 => 42794, - 1 => 'Ꜫ', - ), - 42797 => - array ( - 0 => 42796, - 1 => 'Ꜭ', - ), - 42799 => - array ( - 0 => 42798, - 1 => 'Ꜯ', - ), - 42803 => - array ( - 0 => 42802, - 1 => 'Ꜳ', - ), - 42805 => - array ( - 0 => 42804, - 1 => 'Ꜵ', - ), - 42807 => - array ( - 0 => 42806, - 1 => 'Ꜷ', - ), - 42809 => - array ( - 0 => 42808, - 1 => 'Ꜹ', - ), - 42811 => - array ( - 0 => 42810, - 1 => 'Ꜻ', - ), - 42813 => - array ( - 0 => 42812, - 1 => 'Ꜽ', - ), - 42815 => - array ( - 0 => 42814, - 1 => 'Ꜿ', - ), - 42817 => - array ( - 0 => 42816, - 1 => 'Ꝁ', - ), - 42819 => - array ( - 0 => 42818, - 1 => 'Ꝃ', - ), - 42821 => - array ( - 0 => 42820, - 1 => 'Ꝅ', - ), - 42823 => - array ( - 0 => 42822, - 1 => 'Ꝇ', - ), - 42825 => - array ( - 0 => 42824, - 1 => 'Ꝉ', - ), - 42827 => - array ( - 0 => 42826, - 1 => 'Ꝋ', - ), - 42829 => - array ( - 0 => 42828, - 1 => 'Ꝍ', - ), - 42831 => - array ( - 0 => 42830, - 1 => 'Ꝏ', - ), - 42833 => - array ( - 0 => 42832, - 1 => 'Ꝑ', - ), - 42835 => - array ( - 0 => 42834, - 1 => 'Ꝓ', - ), - 42837 => - array ( - 0 => 42836, - 1 => 'Ꝕ', - ), - 42839 => - array ( - 0 => 42838, - 1 => 'Ꝗ', - ), - 42841 => - array ( - 0 => 42840, - 1 => 'Ꝙ', - ), - 42843 => - array ( - 0 => 42842, - 1 => 'Ꝛ', - ), - 42845 => - array ( - 0 => 42844, - 1 => 'Ꝝ', - ), - 42847 => - array ( - 0 => 42846, - 1 => 'Ꝟ', - ), - 42849 => - array ( - 0 => 42848, - 1 => 'Ꝡ', - ), - 42851 => - array ( - 0 => 42850, - 1 => 'Ꝣ', - ), - 42853 => - array ( - 0 => 42852, - 1 => 'Ꝥ', - ), - 42855 => - array ( - 0 => 42854, - 1 => 'Ꝧ', - ), - 42857 => - array ( - 0 => 42856, - 1 => 'Ꝩ', - ), - 42859 => - array ( - 0 => 42858, - 1 => 'Ꝫ', - ), - 42861 => - array ( - 0 => 42860, - 1 => 'Ꝭ', - ), - 42863 => - array ( - 0 => 42862, - 1 => 'Ꝯ', - ), - 42874 => - array ( - 0 => 42873, - 1 => 'Ꝺ', - ), - 42876 => - array ( - 0 => 42875, - 1 => 'Ꝼ', - ), - 7545 => - array ( - 0 => 42877, - 1 => 'Ᵹ', - ), - 42879 => - array ( - 0 => 42878, - 1 => 'Ꝿ', - ), - 42881 => - array ( - 0 => 42880, - 1 => 'Ꞁ', - ), - 42883 => - array ( - 0 => 42882, - 1 => 'Ꞃ', - ), - 42885 => - array ( - 0 => 42884, - 1 => 'Ꞅ', - ), - 42887 => - array ( - 0 => 42886, - 1 => 'Ꞇ', - ), - 42892 => - array ( - 0 => 42891, - 1 => 'Ꞌ', - ), - 613 => - array ( - 0 => 42893, - 1 => 'Ɥ', - ), - 42897 => - array ( - 0 => 42896, - 1 => 'Ꞑ', - ), - 42899 => - array ( - 0 => 42898, - 1 => 'Ꞓ', - ), - 42903 => - array ( - 0 => 42902, - 1 => 'Ꞗ', - ), - 42905 => - array ( - 0 => 42904, - 1 => 'Ꞙ', - ), - 42907 => - array ( - 0 => 42906, - 1 => 'Ꞛ', - ), - 42909 => - array ( - 0 => 42908, - 1 => 'Ꞝ', - ), - 42911 => - array ( - 0 => 42910, - 1 => 'Ꞟ', - ), - 42913 => - array ( - 0 => 42912, - 1 => 'Ꞡ', - ), - 42915 => - array ( - 0 => 42914, - 1 => 'Ꞣ', - ), - 42917 => - array ( - 0 => 42916, - 1 => 'Ꞥ', - ), - 42919 => - array ( - 0 => 42918, - 1 => 'Ꞧ', - ), - 42921 => - array ( - 0 => 42920, - 1 => 'Ꞩ', - ), - 614 => - array ( - 0 => 42922, - 1 => 'Ɦ', - ), - 604 => - array ( - 0 => 42923, - 1 => 'Ɜ', - ), - 609 => - array ( - 0 => 42924, - 1 => 'Ɡ', - ), - 620 => - array ( - 0 => 42925, - 1 => 'Ɬ', - ), - 618 => - array ( - 0 => 42926, - 1 => 'Ɪ', - ), - 670 => - array ( - 0 => 42928, - 1 => 'Ʞ', - ), - 647 => - array ( - 0 => 42929, - 1 => 'Ʇ', - ), - 669 => - array ( - 0 => 42930, - 1 => 'Ʝ', - ), - 43859 => - array ( - 0 => 42931, - 1 => 'Ꭓ', - ), - 42933 => - array ( - 0 => 42932, - 1 => 'Ꞵ', - ), - 42935 => - array ( - 0 => 42934, - 1 => 'Ꞷ', - ), - 5024 => - array ( - 0 => 43888, - 1 => 'ꭰ', - ), - 5025 => - array ( - 0 => 43889, - 1 => 'ꭱ', - ), - 5026 => - array ( - 0 => 43890, - 1 => 'ꭲ', - ), - 5027 => - array ( - 0 => 43891, - 1 => 'ꭳ', - ), - 5028 => - array ( - 0 => 43892, - 1 => 'ꭴ', - ), - 5029 => - array ( - 0 => 43893, - 1 => 'ꭵ', - ), - 5030 => - array ( - 0 => 43894, - 1 => 'ꭶ', - ), - 5031 => - array ( - 0 => 43895, - 1 => 'ꭷ', - ), - 5032 => - array ( - 0 => 43896, - 1 => 'ꭸ', - ), - 5033 => - array ( - 0 => 43897, - 1 => 'ꭹ', - ), - 5034 => - array ( - 0 => 43898, - 1 => 'ꭺ', - ), - 5035 => - array ( - 0 => 43899, - 1 => 'ꭻ', - ), - 5036 => - array ( - 0 => 43900, - 1 => 'ꭼ', - ), - 5037 => - array ( - 0 => 43901, - 1 => 'ꭽ', - ), - 5038 => - array ( - 0 => 43902, - 1 => 'ꭾ', - ), - 5039 => - array ( - 0 => 43903, - 1 => 'ꭿ', - ), - 5040 => - array ( - 0 => 43904, - 1 => 'ꮀ', - ), - 5041 => - array ( - 0 => 43905, - 1 => 'ꮁ', - ), - 5042 => - array ( - 0 => 43906, - 1 => 'ꮂ', - ), - 5043 => - array ( - 0 => 43907, - 1 => 'ꮃ', - ), - 5044 => - array ( - 0 => 43908, - 1 => 'ꮄ', - ), - 5045 => - array ( - 0 => 43909, - 1 => 'ꮅ', - ), - 5046 => - array ( - 0 => 43910, - 1 => 'ꮆ', - ), - 5047 => - array ( - 0 => 43911, - 1 => 'ꮇ', - ), - 5048 => - array ( - 0 => 43912, - 1 => 'ꮈ', - ), - 5049 => - array ( - 0 => 43913, - 1 => 'ꮉ', - ), - 5050 => - array ( - 0 => 43914, - 1 => 'ꮊ', - ), - 5051 => - array ( - 0 => 43915, - 1 => 'ꮋ', - ), - 5052 => - array ( - 0 => 43916, - 1 => 'ꮌ', - ), - 5053 => - array ( - 0 => 43917, - 1 => 'ꮍ', - ), - 5054 => - array ( - 0 => 43918, - 1 => 'ꮎ', - ), - 5055 => - array ( - 0 => 43919, - 1 => 'ꮏ', - ), - 5056 => - array ( - 0 => 43920, - 1 => 'ꮐ', - ), - 5057 => - array ( - 0 => 43921, - 1 => 'ꮑ', - ), - 5058 => - array ( - 0 => 43922, - 1 => 'ꮒ', - ), - 5059 => - array ( - 0 => 43923, - 1 => 'ꮓ', - ), - 5060 => - array ( - 0 => 43924, - 1 => 'ꮔ', - ), - 5061 => - array ( - 0 => 43925, - 1 => 'ꮕ', - ), - 5062 => - array ( - 0 => 43926, - 1 => 'ꮖ', - ), - 5063 => - array ( - 0 => 43927, - 1 => 'ꮗ', - ), - 5064 => - array ( - 0 => 43928, - 1 => 'ꮘ', - ), - 5065 => - array ( - 0 => 43929, - 1 => 'ꮙ', - ), - 5066 => - array ( - 0 => 43930, - 1 => 'ꮚ', - ), - 5067 => - array ( - 0 => 43931, - 1 => 'ꮛ', - ), - 5068 => - array ( - 0 => 43932, - 1 => 'ꮜ', - ), - 5069 => - array ( - 0 => 43933, - 1 => 'ꮝ', - ), - 5070 => - array ( - 0 => 43934, - 1 => 'ꮞ', - ), - 5071 => - array ( - 0 => 43935, - 1 => 'ꮟ', - ), - 5072 => - array ( - 0 => 43936, - 1 => 'ꮠ', - ), - 5073 => - array ( - 0 => 43937, - 1 => 'ꮡ', - ), - 5074 => - array ( - 0 => 43938, - 1 => 'ꮢ', - ), - 5075 => - array ( - 0 => 43939, - 1 => 'ꮣ', - ), - 5076 => - array ( - 0 => 43940, - 1 => 'ꮤ', - ), - 5077 => - array ( - 0 => 43941, - 1 => 'ꮥ', - ), - 5078 => - array ( - 0 => 43942, - 1 => 'ꮦ', - ), - 5079 => - array ( - 0 => 43943, - 1 => 'ꮧ', - ), - 5080 => - array ( - 0 => 43944, - 1 => 'ꮨ', - ), - 5081 => - array ( - 0 => 43945, - 1 => 'ꮩ', - ), - 5082 => - array ( - 0 => 43946, - 1 => 'ꮪ', - ), - 5083 => - array ( - 0 => 43947, - 1 => 'ꮫ', - ), - 5084 => - array ( - 0 => 43948, - 1 => 'ꮬ', - ), - 5085 => - array ( - 0 => 43949, - 1 => 'ꮭ', - ), - 5086 => - array ( - 0 => 43950, - 1 => 'ꮮ', - ), - 5087 => - array ( - 0 => 43951, - 1 => 'ꮯ', - ), - 5088 => - array ( - 0 => 43952, - 1 => 'ꮰ', - ), - 5089 => - array ( - 0 => 43953, - 1 => 'ꮱ', - ), - 5090 => - array ( - 0 => 43954, - 1 => 'ꮲ', - ), - 5091 => - array ( - 0 => 43955, - 1 => 'ꮳ', - ), - 5092 => - array ( - 0 => 43956, - 1 => 'ꮴ', - ), - 5093 => - array ( - 0 => 43957, - 1 => 'ꮵ', - ), - 5094 => - array ( - 0 => 43958, - 1 => 'ꮶ', - ), - 5095 => - array ( - 0 => 43959, - 1 => 'ꮷ', - ), - 5096 => - array ( - 0 => 43960, - 1 => 'ꮸ', - ), - 5097 => - array ( - 0 => 43961, - 1 => 'ꮹ', - ), - 5098 => - array ( - 0 => 43962, - 1 => 'ꮺ', - ), - 5099 => - array ( - 0 => 43963, - 1 => 'ꮻ', - ), - 5100 => - array ( - 0 => 43964, - 1 => 'ꮼ', - ), - 5101 => - array ( - 0 => 43965, - 1 => 'ꮽ', - ), - 5102 => - array ( - 0 => 43966, - 1 => 'ꮾ', - ), - 5103 => - array ( - 0 => 43967, - 1 => 'ꮿ', - ), - 65345 => - array ( - 0 => 65313, - 1 => 'A', - ), - 65346 => - array ( - 0 => 65314, - 1 => 'B', - ), - 65347 => - array ( - 0 => 65315, - 1 => 'C', - ), - 65348 => - array ( - 0 => 65316, - 1 => 'D', - ), - 65349 => - array ( - 0 => 65317, - 1 => 'E', - ), - 65350 => - array ( - 0 => 65318, - 1 => 'F', - ), - 65351 => - array ( - 0 => 65319, - 1 => 'G', - ), - 65352 => - array ( - 0 => 65320, - 1 => 'H', - ), - 65353 => - array ( - 0 => 65321, - 1 => 'I', - ), - 65354 => - array ( - 0 => 65322, - 1 => 'J', - ), - 65355 => - array ( - 0 => 65323, - 1 => 'K', - ), - 65356 => - array ( - 0 => 65324, - 1 => 'L', - ), - 65357 => - array ( - 0 => 65325, - 1 => 'M', - ), - 65358 => - array ( - 0 => 65326, - 1 => 'N', - ), - 65359 => - array ( - 0 => 65327, - 1 => 'O', - ), - 65360 => - array ( - 0 => 65328, - 1 => 'P', - ), - 65361 => - array ( - 0 => 65329, - 1 => 'Q', - ), - 65362 => - array ( - 0 => 65330, - 1 => 'R', - ), - 65363 => - array ( - 0 => 65331, - 1 => 'S', - ), - 65364 => - array ( - 0 => 65332, - 1 => 'T', - ), - 65365 => - array ( - 0 => 65333, - 1 => 'U', - ), - 65366 => - array ( - 0 => 65334, - 1 => 'V', - ), - 65367 => - array ( - 0 => 65335, - 1 => 'W', - ), - 65368 => - array ( - 0 => 65336, - 1 => 'X', - ), - 65369 => - array ( - 0 => 65337, - 1 => 'Y', - ), - 65370 => - array ( - 0 => 65338, - 1 => 'Z', - ), - 66600 => - array ( - 0 => 66560, - 1 => '𐐀', - ), - 66601 => - array ( - 0 => 66561, - 1 => '𐐁', - ), - 66602 => - array ( - 0 => 66562, - 1 => '𐐂', - ), - 66603 => - array ( - 0 => 66563, - 1 => '𐐃', - ), - 66604 => - array ( - 0 => 66564, - 1 => '𐐄', - ), - 66605 => - array ( - 0 => 66565, - 1 => '𐐅', - ), - 66606 => - array ( - 0 => 66566, - 1 => '𐐆', - ), - 66607 => - array ( - 0 => 66567, - 1 => '𐐇', - ), - 66608 => - array ( - 0 => 66568, - 1 => '𐐈', - ), - 66609 => - array ( - 0 => 66569, - 1 => '𐐉', - ), - 66610 => - array ( - 0 => 66570, - 1 => '𐐊', - ), - 66611 => - array ( - 0 => 66571, - 1 => '𐐋', - ), - 66612 => - array ( - 0 => 66572, - 1 => '𐐌', - ), - 66613 => - array ( - 0 => 66573, - 1 => '𐐍', - ), - 66614 => - array ( - 0 => 66574, - 1 => '𐐎', - ), - 66615 => - array ( - 0 => 66575, - 1 => '𐐏', - ), - 66616 => - array ( - 0 => 66576, - 1 => '𐐐', - ), - 66617 => - array ( - 0 => 66577, - 1 => '𐐑', - ), - 66618 => - array ( - 0 => 66578, - 1 => '𐐒', - ), - 66619 => - array ( - 0 => 66579, - 1 => '𐐓', - ), - 66620 => - array ( - 0 => 66580, - 1 => '𐐔', - ), - 66621 => - array ( - 0 => 66581, - 1 => '𐐕', - ), - 66622 => - array ( - 0 => 66582, - 1 => '𐐖', - ), - 66623 => - array ( - 0 => 66583, - 1 => '𐐗', - ), - 66624 => - array ( - 0 => 66584, - 1 => '𐐘', - ), - 66625 => - array ( - 0 => 66585, - 1 => '𐐙', - ), - 66626 => - array ( - 0 => 66586, - 1 => '𐐚', - ), - 66627 => - array ( - 0 => 66587, - 1 => '𐐛', - ), - 66628 => - array ( - 0 => 66588, - 1 => '𐐜', - ), - 66629 => - array ( - 0 => 66589, - 1 => '𐐝', - ), - 66630 => - array ( - 0 => 66590, - 1 => '𐐞', - ), - 66631 => - array ( - 0 => 66591, - 1 => '𐐟', - ), - 66632 => - array ( - 0 => 66592, - 1 => '𐐠', - ), - 66633 => - array ( - 0 => 66593, - 1 => '𐐡', - ), - 66634 => - array ( - 0 => 66594, - 1 => '𐐢', - ), - 66635 => - array ( - 0 => 66595, - 1 => '𐐣', - ), - 66636 => - array ( - 0 => 66596, - 1 => '𐐤', - ), - 66637 => - array ( - 0 => 66597, - 1 => '𐐥', - ), - 66638 => - array ( - 0 => 66598, - 1 => '𐐦', - ), - 66639 => - array ( - 0 => 66599, - 1 => '𐐧', - ), - 66776 => - array ( - 0 => 66736, - 1 => '𐒰', - ), - 66777 => - array ( - 0 => 66737, - 1 => '𐒱', - ), - 66778 => - array ( - 0 => 66738, - 1 => '𐒲', - ), - 66779 => - array ( - 0 => 66739, - 1 => '𐒳', - ), - 66780 => - array ( - 0 => 66740, - 1 => '𐒴', - ), - 66781 => - array ( - 0 => 66741, - 1 => '𐒵', - ), - 66782 => - array ( - 0 => 66742, - 1 => '𐒶', - ), - 66783 => - array ( - 0 => 66743, - 1 => '𐒷', - ), - 66784 => - array ( - 0 => 66744, - 1 => '𐒸', - ), - 66785 => - array ( - 0 => 66745, - 1 => '𐒹', - ), - 66786 => - array ( - 0 => 66746, - 1 => '𐒺', - ), - 66787 => - array ( - 0 => 66747, - 1 => '𐒻', - ), - 66788 => - array ( - 0 => 66748, - 1 => '𐒼', - ), - 66789 => - array ( - 0 => 66749, - 1 => '𐒽', - ), - 66790 => - array ( - 0 => 66750, - 1 => '𐒾', - ), - 66791 => - array ( - 0 => 66751, - 1 => '𐒿', - ), - 66792 => - array ( - 0 => 66752, - 1 => '𐓀', - ), - 66793 => - array ( - 0 => 66753, - 1 => '𐓁', - ), - 66794 => - array ( - 0 => 66754, - 1 => '𐓂', - ), - 66795 => - array ( - 0 => 66755, - 1 => '𐓃', - ), - 66796 => - array ( - 0 => 66756, - 1 => '𐓄', - ), - 66797 => - array ( - 0 => 66757, - 1 => '𐓅', - ), - 66798 => - array ( - 0 => 66758, - 1 => '𐓆', - ), - 66799 => - array ( - 0 => 66759, - 1 => '𐓇', - ), - 66800 => - array ( - 0 => 66760, - 1 => '𐓈', - ), - 66801 => - array ( - 0 => 66761, - 1 => '𐓉', - ), - 66802 => - array ( - 0 => 66762, - 1 => '𐓊', - ), - 66803 => - array ( - 0 => 66763, - 1 => '𐓋', - ), - 66804 => - array ( - 0 => 66764, - 1 => '𐓌', - ), - 66805 => - array ( - 0 => 66765, - 1 => '𐓍', - ), - 66806 => - array ( - 0 => 66766, - 1 => '𐓎', - ), - 66807 => - array ( - 0 => 66767, - 1 => '𐓏', - ), - 66808 => - array ( - 0 => 66768, - 1 => '𐓐', - ), - 66809 => - array ( - 0 => 66769, - 1 => '𐓑', - ), - 66810 => - array ( - 0 => 66770, - 1 => '𐓒', - ), - 66811 => - array ( - 0 => 66771, - 1 => '𐓓', - ), - 68800 => - array ( - 0 => 68736, - 1 => '𐲀', - ), - 68801 => - array ( - 0 => 68737, - 1 => '𐲁', - ), - 68802 => - array ( - 0 => 68738, - 1 => '𐲂', - ), - 68803 => - array ( - 0 => 68739, - 1 => '𐲃', - ), - 68804 => - array ( - 0 => 68740, - 1 => '𐲄', - ), - 68805 => - array ( - 0 => 68741, - 1 => '𐲅', - ), - 68806 => - array ( - 0 => 68742, - 1 => '𐲆', - ), - 68807 => - array ( - 0 => 68743, - 1 => '𐲇', - ), - 68808 => - array ( - 0 => 68744, - 1 => '𐲈', - ), - 68809 => - array ( - 0 => 68745, - 1 => '𐲉', - ), - 68810 => - array ( - 0 => 68746, - 1 => '𐲊', - ), - 68811 => - array ( - 0 => 68747, - 1 => '𐲋', - ), - 68812 => - array ( - 0 => 68748, - 1 => '𐲌', - ), - 68813 => - array ( - 0 => 68749, - 1 => '𐲍', - ), - 68814 => - array ( - 0 => 68750, - 1 => '𐲎', - ), - 68815 => - array ( - 0 => 68751, - 1 => '𐲏', - ), - 68816 => - array ( - 0 => 68752, - 1 => '𐲐', - ), - 68817 => - array ( - 0 => 68753, - 1 => '𐲑', - ), - 68818 => - array ( - 0 => 68754, - 1 => '𐲒', - ), - 68819 => - array ( - 0 => 68755, - 1 => '𐲓', - ), - 68820 => - array ( - 0 => 68756, - 1 => '𐲔', - ), - 68821 => - array ( - 0 => 68757, - 1 => '𐲕', - ), - 68822 => - array ( - 0 => 68758, - 1 => '𐲖', - ), - 68823 => - array ( - 0 => 68759, - 1 => '𐲗', - ), - 68824 => - array ( - 0 => 68760, - 1 => '𐲘', - ), - 68825 => - array ( - 0 => 68761, - 1 => '𐲙', - ), - 68826 => - array ( - 0 => 68762, - 1 => '𐲚', - ), - 68827 => - array ( - 0 => 68763, - 1 => '𐲛', - ), - 68828 => - array ( - 0 => 68764, - 1 => '𐲜', - ), - 68829 => - array ( - 0 => 68765, - 1 => '𐲝', - ), - 68830 => - array ( - 0 => 68766, - 1 => '𐲞', - ), - 68831 => - array ( - 0 => 68767, - 1 => '𐲟', - ), - 68832 => - array ( - 0 => 68768, - 1 => '𐲠', - ), - 68833 => - array ( - 0 => 68769, - 1 => '𐲡', - ), - 68834 => - array ( - 0 => 68770, - 1 => '𐲢', - ), - 68835 => - array ( - 0 => 68771, - 1 => '𐲣', - ), - 68836 => - array ( - 0 => 68772, - 1 => '𐲤', - ), - 68837 => - array ( - 0 => 68773, - 1 => '𐲥', - ), - 68838 => - array ( - 0 => 68774, - 1 => '𐲦', - ), - 68839 => - array ( - 0 => 68775, - 1 => '𐲧', - ), - 68840 => - array ( - 0 => 68776, - 1 => '𐲨', - ), - 68841 => - array ( - 0 => 68777, - 1 => '𐲩', - ), - 68842 => - array ( - 0 => 68778, - 1 => '𐲪', - ), - 68843 => - array ( - 0 => 68779, - 1 => '𐲫', - ), - 68844 => - array ( - 0 => 68780, - 1 => '𐲬', - ), - 68845 => - array ( - 0 => 68781, - 1 => '𐲭', - ), - 68846 => - array ( - 0 => 68782, - 1 => '𐲮', - ), - 68847 => - array ( - 0 => 68783, - 1 => '𐲯', - ), - 68848 => - array ( - 0 => 68784, - 1 => '𐲰', - ), - 68849 => - array ( - 0 => 68785, - 1 => '𐲱', - ), - 68850 => - array ( - 0 => 68786, - 1 => '𐲲', - ), - 71872 => - array ( - 0 => 71840, - 1 => '𑢠', - ), - 71873 => - array ( - 0 => 71841, - 1 => '𑢡', - ), - 71874 => - array ( - 0 => 71842, - 1 => '𑢢', - ), - 71875 => - array ( - 0 => 71843, - 1 => '𑢣', - ), - 71876 => - array ( - 0 => 71844, - 1 => '𑢤', - ), - 71877 => - array ( - 0 => 71845, - 1 => '𑢥', - ), - 71878 => - array ( - 0 => 71846, - 1 => '𑢦', - ), - 71879 => - array ( - 0 => 71847, - 1 => '𑢧', - ), - 71880 => - array ( - 0 => 71848, - 1 => '𑢨', - ), - 71881 => - array ( - 0 => 71849, - 1 => '𑢩', - ), - 71882 => - array ( - 0 => 71850, - 1 => '𑢪', - ), - 71883 => - array ( - 0 => 71851, - 1 => '𑢫', - ), - 71884 => - array ( - 0 => 71852, - 1 => '𑢬', - ), - 71885 => - array ( - 0 => 71853, - 1 => '𑢭', - ), - 71886 => - array ( - 0 => 71854, - 1 => '𑢮', - ), - 71887 => - array ( - 0 => 71855, - 1 => '𑢯', - ), - 71888 => - array ( - 0 => 71856, - 1 => '𑢰', - ), - 71889 => - array ( - 0 => 71857, - 1 => '𑢱', - ), - 71890 => - array ( - 0 => 71858, - 1 => '𑢲', - ), - 71891 => - array ( - 0 => 71859, - 1 => '𑢳', - ), - 71892 => - array ( - 0 => 71860, - 1 => '𑢴', - ), - 71893 => - array ( - 0 => 71861, - 1 => '𑢵', - ), - 71894 => - array ( - 0 => 71862, - 1 => '𑢶', - ), - 71895 => - array ( - 0 => 71863, - 1 => '𑢷', - ), - 71896 => - array ( - 0 => 71864, - 1 => '𑢸', - ), - 71897 => - array ( - 0 => 71865, - 1 => '𑢹', - ), - 71898 => - array ( - 0 => 71866, - 1 => '𑢺', - ), - 71899 => - array ( - 0 => 71867, - 1 => '𑢻', - ), - 71900 => - array ( - 0 => 71868, - 1 => '𑢼', - ), - 71901 => - array ( - 0 => 71869, - 1 => '𑢽', - ), - 71902 => - array ( - 0 => 71870, - 1 => '𑢾', - ), - 71903 => - array ( - 0 => 71871, - 1 => '𑢿', - ), - 125218 => - array ( - 0 => 125184, - 1 => '𞤀', - ), - 125219 => - array ( - 0 => 125185, - 1 => '𞤁', - ), - 125220 => - array ( - 0 => 125186, - 1 => '𞤂', - ), - 125221 => - array ( - 0 => 125187, - 1 => '𞤃', - ), - 125222 => - array ( - 0 => 125188, - 1 => '𞤄', - ), - 125223 => - array ( - 0 => 125189, - 1 => '𞤅', - ), - 125224 => - array ( - 0 => 125190, - 1 => '𞤆', - ), - 125225 => - array ( - 0 => 125191, - 1 => '𞤇', - ), - 125226 => - array ( - 0 => 125192, - 1 => '𞤈', - ), - 125227 => - array ( - 0 => 125193, - 1 => '𞤉', - ), - 125228 => - array ( - 0 => 125194, - 1 => '𞤊', - ), - 125229 => - array ( - 0 => 125195, - 1 => '𞤋', - ), - 125230 => - array ( - 0 => 125196, - 1 => '𞤌', - ), - 125231 => - array ( - 0 => 125197, - 1 => '𞤍', - ), - 125232 => - array ( - 0 => 125198, - 1 => '𞤎', - ), - 125233 => - array ( - 0 => 125199, - 1 => '𞤏', - ), - 125234 => - array ( - 0 => 125200, - 1 => '𞤐', - ), - 125235 => - array ( - 0 => 125201, - 1 => '𞤑', - ), - 125236 => - array ( - 0 => 125202, - 1 => '𞤒', - ), - 125237 => - array ( - 0 => 125203, - 1 => '𞤓', - ), - 125238 => - array ( - 0 => 125204, - 1 => '𞤔', - ), - 125239 => - array ( - 0 => 125205, - 1 => '𞤕', - ), - 125240 => - array ( - 0 => 125206, - 1 => '𞤖', - ), - 125241 => - array ( - 0 => 125207, - 1 => '𞤗', - ), - 125242 => - array ( - 0 => 125208, - 1 => '𞤘', - ), - 125243 => - array ( - 0 => 125209, - 1 => '𞤙', - ), - 125244 => - array ( - 0 => 125210, - 1 => '𞤚', - ), - 125245 => - array ( - 0 => 125211, - 1 => '𞤛', - ), - 125246 => - array ( - 0 => 125212, - 1 => '𞤜', - ), - 125247 => - array ( - 0 => 125213, - 1 => '𞤝', - ), - 125248 => - array ( - 0 => 125214, - 1 => '𞤞', - ), - 125249 => - array ( - 0 => 125215, - 1 => '𞤟', - ), - 125250 => - array ( - 0 => 125216, - 1 => '𞤠', - ), - 125251 => - array ( - 0 => 125217, - 1 => '𞤡', - ), -); +return [ +0x61 => 0x41, +0x62 => 0x42, +0x63 => 0x43, +0x64 => 0x44, +0x65 => 0x45, +0x66 => 0x46, +0x67 => 0x47, +0x68 => 0x48, +0x69 => 0x49, +0x6A => 0x4A, +0x6B => 0x4B, +0x6C => 0x4C, +0x6D => 0x4D, +0x6E => 0x4E, +0x6F => 0x4F, +0x70 => 0x50, +0x71 => 0x51, +0x72 => 0x52, +0x73 => 0x53, +0x74 => 0x54, +0x75 => 0x55, +0x76 => 0x56, +0x77 => 0x57, +0x78 => 0x58, +0x79 => 0x59, +0x7A => 0x5A, +0xB5 => 0x39C, +0xE0 => 0xC0, +0xE1 => 0xC1, +0xE2 => 0xC2, +0xE3 => 0xC3, +0xE4 => 0xC4, +0xE5 => 0xC5, +0xE6 => 0xC6, +0xE7 => 0xC7, +0xE8 => 0xC8, +0xE9 => 0xC9, +0xEA => 0xCA, +0xEB => 0xCB, +0xEC => 0xCC, +0xED => 0xCD, +0xEE => 0xCE, +0xEF => 0xCF, +0xF0 => 0xD0, +0xF1 => 0xD1, +0xF2 => 0xD2, +0xF3 => 0xD3, +0xF4 => 0xD4, +0xF5 => 0xD5, +0xF6 => 0xD6, +0xF8 => 0xD8, +0xF9 => 0xD9, +0xFA => 0xDA, +0xFB => 0xDB, +0xFC => 0xDC, +0xFD => 0xDD, +0xFE => 0xDE, +0xFF => 0x178, +0x101 => 0x100, +0x103 => 0x102, +0x105 => 0x104, +0x107 => 0x106, +0x109 => 0x108, +0x10B => 0x10A, +0x10D => 0x10C, +0x10F => 0x10E, +0x111 => 0x110, +0x113 => 0x112, +0x115 => 0x114, +0x117 => 0x116, +0x119 => 0x118, +0x11B => 0x11A, +0x11D => 0x11C, +0x11F => 0x11E, +0x121 => 0x120, +0x123 => 0x122, +0x125 => 0x124, +0x127 => 0x126, +0x129 => 0x128, +0x12B => 0x12A, +0x12D => 0x12C, +0x12F => 0x12E, +0x131 => 0x49, +0x133 => 0x132, +0x135 => 0x134, +0x137 => 0x136, +0x13A => 0x139, +0x13C => 0x13B, +0x13E => 0x13D, +0x140 => 0x13F, +0x142 => 0x141, +0x144 => 0x143, +0x146 => 0x145, +0x148 => 0x147, +0x14B => 0x14A, +0x14D => 0x14C, +0x14F => 0x14E, +0x151 => 0x150, +0x153 => 0x152, +0x155 => 0x154, +0x157 => 0x156, +0x159 => 0x158, +0x15B => 0x15A, +0x15D => 0x15C, +0x15F => 0x15E, +0x161 => 0x160, +0x163 => 0x162, +0x165 => 0x164, +0x167 => 0x166, +0x169 => 0x168, +0x16B => 0x16A, +0x16D => 0x16C, +0x16F => 0x16E, +0x171 => 0x170, +0x173 => 0x172, +0x175 => 0x174, +0x177 => 0x176, +0x17A => 0x179, +0x17C => 0x17B, +0x17E => 0x17D, +0x17F => 0x53, +0x180 => 0x243, +0x183 => 0x182, +0x185 => 0x184, +0x188 => 0x187, +0x18C => 0x18B, +0x192 => 0x191, +0x195 => 0x1F6, +0x199 => 0x198, +0x19A => 0x23D, +0x19E => 0x220, +0x1A1 => 0x1A0, +0x1A3 => 0x1A2, +0x1A5 => 0x1A4, +0x1A8 => 0x1A7, +0x1AD => 0x1AC, +0x1B0 => 0x1AF, +0x1B4 => 0x1B3, +0x1B6 => 0x1B5, +0x1B9 => 0x1B8, +0x1BD => 0x1BC, +0x1BF => 0x1F7, +0x1C5 => 0x1C4, +0x1C6 => 0x1C4, +0x1C8 => 0x1C7, +0x1C9 => 0x1C7, +0x1CB => 0x1CA, +0x1CC => 0x1CA, +0x1CE => 0x1CD, +0x1D0 => 0x1CF, +0x1D2 => 0x1D1, +0x1D4 => 0x1D3, +0x1D6 => 0x1D5, +0x1D8 => 0x1D7, +0x1DA => 0x1D9, +0x1DC => 0x1DB, +0x1DD => 0x18E, +0x1DF => 0x1DE, +0x1E1 => 0x1E0, +0x1E3 => 0x1E2, +0x1E5 => 0x1E4, +0x1E7 => 0x1E6, +0x1E9 => 0x1E8, +0x1EB => 0x1EA, +0x1ED => 0x1EC, +0x1EF => 0x1EE, +0x1F2 => 0x1F1, +0x1F3 => 0x1F1, +0x1F5 => 0x1F4, +0x1F9 => 0x1F8, +0x1FB => 0x1FA, +0x1FD => 0x1FC, +0x1FF => 0x1FE, +0x201 => 0x200, +0x203 => 0x202, +0x205 => 0x204, +0x207 => 0x206, +0x209 => 0x208, +0x20B => 0x20A, +0x20D => 0x20C, +0x20F => 0x20E, +0x211 => 0x210, +0x213 => 0x212, +0x215 => 0x214, +0x217 => 0x216, +0x219 => 0x218, +0x21B => 0x21A, +0x21D => 0x21C, +0x21F => 0x21E, +0x223 => 0x222, +0x225 => 0x224, +0x227 => 0x226, +0x229 => 0x228, +0x22B => 0x22A, +0x22D => 0x22C, +0x22F => 0x22E, +0x231 => 0x230, +0x233 => 0x232, +0x23C => 0x23B, +0x23F => 0x2C7E, +0x240 => 0x2C7F, +0x242 => 0x241, +0x247 => 0x246, +0x249 => 0x248, +0x24B => 0x24A, +0x24D => 0x24C, +0x24F => 0x24E, +0x250 => 0x2C6F, +0x251 => 0x2C6D, +0x252 => 0x2C70, +0x253 => 0x181, +0x254 => 0x186, +0x256 => 0x189, +0x257 => 0x18A, +0x259 => 0x18F, +0x25B => 0x190, +0x25C => 0xA7AB, +0x260 => 0x193, +0x261 => 0xA7AC, +0x263 => 0x194, +0x265 => 0xA78D, +0x266 => 0xA7AA, +0x268 => 0x197, +0x269 => 0x196, +0x26A => 0xA7AE, +0x26B => 0x2C62, +0x26C => 0xA7AD, +0x26F => 0x19C, +0x271 => 0x2C6E, +0x272 => 0x19D, +0x275 => 0x19F, +0x27D => 0x2C64, +0x280 => 0x1A6, +0x282 => 0xA7C5, +0x283 => 0x1A9, +0x287 => 0xA7B1, +0x288 => 0x1AE, +0x289 => 0x244, +0x28A => 0x1B1, +0x28B => 0x1B2, +0x28C => 0x245, +0x292 => 0x1B7, +0x29D => 0xA7B2, +0x29E => 0xA7B0, +0x345 => 0x399, +0x371 => 0x370, +0x373 => 0x372, +0x377 => 0x376, +0x37B => 0x3FD, +0x37C => 0x3FE, +0x37D => 0x3FF, +0x3AC => 0x386, +0x3AD => 0x388, +0x3AE => 0x389, +0x3AF => 0x38A, +0x3B1 => 0x391, +0x3B2 => 0x392, +0x3B3 => 0x393, +0x3B4 => 0x394, +0x3B5 => 0x395, +0x3B6 => 0x396, +0x3B7 => 0x397, +0x3B8 => 0x398, +0x3B9 => 0x399, +0x3BA => 0x39A, +0x3BB => 0x39B, +0x3BC => 0x39C, +0x3BD => 0x39D, +0x3BE => 0x39E, +0x3BF => 0x39F, +0x3C0 => 0x3A0, +0x3C1 => 0x3A1, +0x3C2 => 0x3A3, +0x3C3 => 0x3A3, +0x3C4 => 0x3A4, +0x3C5 => 0x3A5, +0x3C6 => 0x3A6, +0x3C7 => 0x3A7, +0x3C8 => 0x3A8, +0x3C9 => 0x3A9, +0x3CA => 0x3AA, +0x3CB => 0x3AB, +0x3CC => 0x38C, +0x3CD => 0x38E, +0x3CE => 0x38F, +0x3D0 => 0x392, +0x3D1 => 0x398, +0x3D5 => 0x3A6, +0x3D6 => 0x3A0, +0x3D7 => 0x3CF, +0x3D9 => 0x3D8, +0x3DB => 0x3DA, +0x3DD => 0x3DC, +0x3DF => 0x3DE, +0x3E1 => 0x3E0, +0x3E3 => 0x3E2, +0x3E5 => 0x3E4, +0x3E7 => 0x3E6, +0x3E9 => 0x3E8, +0x3EB => 0x3EA, +0x3ED => 0x3EC, +0x3EF => 0x3EE, +0x3F0 => 0x39A, +0x3F1 => 0x3A1, +0x3F2 => 0x3F9, +0x3F3 => 0x37F, +0x3F5 => 0x395, +0x3F8 => 0x3F7, +0x3FB => 0x3FA, +0x430 => 0x410, +0x431 => 0x411, +0x432 => 0x412, +0x433 => 0x413, +0x434 => 0x414, +0x435 => 0x415, +0x436 => 0x416, +0x437 => 0x417, +0x438 => 0x418, +0x439 => 0x419, +0x43A => 0x41A, +0x43B => 0x41B, +0x43C => 0x41C, +0x43D => 0x41D, +0x43E => 0x41E, +0x43F => 0x41F, +0x440 => 0x420, +0x441 => 0x421, +0x442 => 0x422, +0x443 => 0x423, +0x444 => 0x424, +0x445 => 0x425, +0x446 => 0x426, +0x447 => 0x427, +0x448 => 0x428, +0x449 => 0x429, +0x44A => 0x42A, +0x44B => 0x42B, +0x44C => 0x42C, +0x44D => 0x42D, +0x44E => 0x42E, +0x44F => 0x42F, +0x450 => 0x400, +0x451 => 0x401, +0x452 => 0x402, +0x453 => 0x403, +0x454 => 0x404, +0x455 => 0x405, +0x456 => 0x406, +0x457 => 0x407, +0x458 => 0x408, +0x459 => 0x409, +0x45A => 0x40A, +0x45B => 0x40B, +0x45C => 0x40C, +0x45D => 0x40D, +0x45E => 0x40E, +0x45F => 0x40F, +0x461 => 0x460, +0x463 => 0x462, +0x465 => 0x464, +0x467 => 0x466, +0x469 => 0x468, +0x46B => 0x46A, +0x46D => 0x46C, +0x46F => 0x46E, +0x471 => 0x470, +0x473 => 0x472, +0x475 => 0x474, +0x477 => 0x476, +0x479 => 0x478, +0x47B => 0x47A, +0x47D => 0x47C, +0x47F => 0x47E, +0x481 => 0x480, +0x48B => 0x48A, +0x48D => 0x48C, +0x48F => 0x48E, +0x491 => 0x490, +0x493 => 0x492, +0x495 => 0x494, +0x497 => 0x496, +0x499 => 0x498, +0x49B => 0x49A, +0x49D => 0x49C, +0x49F => 0x49E, +0x4A1 => 0x4A0, +0x4A3 => 0x4A2, +0x4A5 => 0x4A4, +0x4A7 => 0x4A6, +0x4A9 => 0x4A8, +0x4AB => 0x4AA, +0x4AD => 0x4AC, +0x4AF => 0x4AE, +0x4B1 => 0x4B0, +0x4B3 => 0x4B2, +0x4B5 => 0x4B4, +0x4B7 => 0x4B6, +0x4B9 => 0x4B8, +0x4BB => 0x4BA, +0x4BD => 0x4BC, +0x4BF => 0x4BE, +0x4C2 => 0x4C1, +0x4C4 => 0x4C3, +0x4C6 => 0x4C5, +0x4C8 => 0x4C7, +0x4CA => 0x4C9, +0x4CC => 0x4CB, +0x4CE => 0x4CD, +0x4CF => 0x4C0, +0x4D1 => 0x4D0, +0x4D3 => 0x4D2, +0x4D5 => 0x4D4, +0x4D7 => 0x4D6, +0x4D9 => 0x4D8, +0x4DB => 0x4DA, +0x4DD => 0x4DC, +0x4DF => 0x4DE, +0x4E1 => 0x4E0, +0x4E3 => 0x4E2, +0x4E5 => 0x4E4, +0x4E7 => 0x4E6, +0x4E9 => 0x4E8, +0x4EB => 0x4EA, +0x4ED => 0x4EC, +0x4EF => 0x4EE, +0x4F1 => 0x4F0, +0x4F3 => 0x4F2, +0x4F5 => 0x4F4, +0x4F7 => 0x4F6, +0x4F9 => 0x4F8, +0x4FB => 0x4FA, +0x4FD => 0x4FC, +0x4FF => 0x4FE, +0x501 => 0x500, +0x503 => 0x502, +0x505 => 0x504, +0x507 => 0x506, +0x509 => 0x508, +0x50B => 0x50A, +0x50D => 0x50C, +0x50F => 0x50E, +0x511 => 0x510, +0x513 => 0x512, +0x515 => 0x514, +0x517 => 0x516, +0x519 => 0x518, +0x51B => 0x51A, +0x51D => 0x51C, +0x51F => 0x51E, +0x521 => 0x520, +0x523 => 0x522, +0x525 => 0x524, +0x527 => 0x526, +0x529 => 0x528, +0x52B => 0x52A, +0x52D => 0x52C, +0x52F => 0x52E, +0x561 => 0x531, +0x562 => 0x532, +0x563 => 0x533, +0x564 => 0x534, +0x565 => 0x535, +0x566 => 0x536, +0x567 => 0x537, +0x568 => 0x538, +0x569 => 0x539, +0x56A => 0x53A, +0x56B => 0x53B, +0x56C => 0x53C, +0x56D => 0x53D, +0x56E => 0x53E, +0x56F => 0x53F, +0x570 => 0x540, +0x571 => 0x541, +0x572 => 0x542, +0x573 => 0x543, +0x574 => 0x544, +0x575 => 0x545, +0x576 => 0x546, +0x577 => 0x547, +0x578 => 0x548, +0x579 => 0x549, +0x57A => 0x54A, +0x57B => 0x54B, +0x57C => 0x54C, +0x57D => 0x54D, +0x57E => 0x54E, +0x57F => 0x54F, +0x580 => 0x550, +0x581 => 0x551, +0x582 => 0x552, +0x583 => 0x553, +0x584 => 0x554, +0x585 => 0x555, +0x586 => 0x556, +0x10D0 => 0x1C90, +0x10D1 => 0x1C91, +0x10D2 => 0x1C92, +0x10D3 => 0x1C93, +0x10D4 => 0x1C94, +0x10D5 => 0x1C95, +0x10D6 => 0x1C96, +0x10D7 => 0x1C97, +0x10D8 => 0x1C98, +0x10D9 => 0x1C99, +0x10DA => 0x1C9A, +0x10DB => 0x1C9B, +0x10DC => 0x1C9C, +0x10DD => 0x1C9D, +0x10DE => 0x1C9E, +0x10DF => 0x1C9F, +0x10E0 => 0x1CA0, +0x10E1 => 0x1CA1, +0x10E2 => 0x1CA2, +0x10E3 => 0x1CA3, +0x10E4 => 0x1CA4, +0x10E5 => 0x1CA5, +0x10E6 => 0x1CA6, +0x10E7 => 0x1CA7, +0x10E8 => 0x1CA8, +0x10E9 => 0x1CA9, +0x10EA => 0x1CAA, +0x10EB => 0x1CAB, +0x10EC => 0x1CAC, +0x10ED => 0x1CAD, +0x10EE => 0x1CAE, +0x10EF => 0x1CAF, +0x10F0 => 0x1CB0, +0x10F1 => 0x1CB1, +0x10F2 => 0x1CB2, +0x10F3 => 0x1CB3, +0x10F4 => 0x1CB4, +0x10F5 => 0x1CB5, +0x10F6 => 0x1CB6, +0x10F7 => 0x1CB7, +0x10F8 => 0x1CB8, +0x10F9 => 0x1CB9, +0x10FA => 0x1CBA, +0x10FD => 0x1CBD, +0x10FE => 0x1CBE, +0x10FF => 0x1CBF, +0x13F8 => 0x13F0, +0x13F9 => 0x13F1, +0x13FA => 0x13F2, +0x13FB => 0x13F3, +0x13FC => 0x13F4, +0x13FD => 0x13F5, +0x1C80 => 0x412, +0x1C81 => 0x414, +0x1C82 => 0x41E, +0x1C83 => 0x421, +0x1C84 => 0x422, +0x1C85 => 0x422, +0x1C86 => 0x42A, +0x1C87 => 0x462, +0x1C88 => 0xA64A, +0x1D79 => 0xA77D, +0x1D7D => 0x2C63, +0x1D8E => 0xA7C6, +0x1E01 => 0x1E00, +0x1E03 => 0x1E02, +0x1E05 => 0x1E04, +0x1E07 => 0x1E06, +0x1E09 => 0x1E08, +0x1E0B => 0x1E0A, +0x1E0D => 0x1E0C, +0x1E0F => 0x1E0E, +0x1E11 => 0x1E10, +0x1E13 => 0x1E12, +0x1E15 => 0x1E14, +0x1E17 => 0x1E16, +0x1E19 => 0x1E18, +0x1E1B => 0x1E1A, +0x1E1D => 0x1E1C, +0x1E1F => 0x1E1E, +0x1E21 => 0x1E20, +0x1E23 => 0x1E22, +0x1E25 => 0x1E24, +0x1E27 => 0x1E26, +0x1E29 => 0x1E28, +0x1E2B => 0x1E2A, +0x1E2D => 0x1E2C, +0x1E2F => 0x1E2E, +0x1E31 => 0x1E30, +0x1E33 => 0x1E32, +0x1E35 => 0x1E34, +0x1E37 => 0x1E36, +0x1E39 => 0x1E38, +0x1E3B => 0x1E3A, +0x1E3D => 0x1E3C, +0x1E3F => 0x1E3E, +0x1E41 => 0x1E40, +0x1E43 => 0x1E42, +0x1E45 => 0x1E44, +0x1E47 => 0x1E46, +0x1E49 => 0x1E48, +0x1E4B => 0x1E4A, +0x1E4D => 0x1E4C, +0x1E4F => 0x1E4E, +0x1E51 => 0x1E50, +0x1E53 => 0x1E52, +0x1E55 => 0x1E54, +0x1E57 => 0x1E56, +0x1E59 => 0x1E58, +0x1E5B => 0x1E5A, +0x1E5D => 0x1E5C, +0x1E5F => 0x1E5E, +0x1E61 => 0x1E60, +0x1E63 => 0x1E62, +0x1E65 => 0x1E64, +0x1E67 => 0x1E66, +0x1E69 => 0x1E68, +0x1E6B => 0x1E6A, +0x1E6D => 0x1E6C, +0x1E6F => 0x1E6E, +0x1E71 => 0x1E70, +0x1E73 => 0x1E72, +0x1E75 => 0x1E74, +0x1E77 => 0x1E76, +0x1E79 => 0x1E78, +0x1E7B => 0x1E7A, +0x1E7D => 0x1E7C, +0x1E7F => 0x1E7E, +0x1E81 => 0x1E80, +0x1E83 => 0x1E82, +0x1E85 => 0x1E84, +0x1E87 => 0x1E86, +0x1E89 => 0x1E88, +0x1E8B => 0x1E8A, +0x1E8D => 0x1E8C, +0x1E8F => 0x1E8E, +0x1E91 => 0x1E90, +0x1E93 => 0x1E92, +0x1E95 => 0x1E94, +0x1E9B => 0x1E60, +0x1EA1 => 0x1EA0, +0x1EA3 => 0x1EA2, +0x1EA5 => 0x1EA4, +0x1EA7 => 0x1EA6, +0x1EA9 => 0x1EA8, +0x1EAB => 0x1EAA, +0x1EAD => 0x1EAC, +0x1EAF => 0x1EAE, +0x1EB1 => 0x1EB0, +0x1EB3 => 0x1EB2, +0x1EB5 => 0x1EB4, +0x1EB7 => 0x1EB6, +0x1EB9 => 0x1EB8, +0x1EBB => 0x1EBA, +0x1EBD => 0x1EBC, +0x1EBF => 0x1EBE, +0x1EC1 => 0x1EC0, +0x1EC3 => 0x1EC2, +0x1EC5 => 0x1EC4, +0x1EC7 => 0x1EC6, +0x1EC9 => 0x1EC8, +0x1ECB => 0x1ECA, +0x1ECD => 0x1ECC, +0x1ECF => 0x1ECE, +0x1ED1 => 0x1ED0, +0x1ED3 => 0x1ED2, +0x1ED5 => 0x1ED4, +0x1ED7 => 0x1ED6, +0x1ED9 => 0x1ED8, +0x1EDB => 0x1EDA, +0x1EDD => 0x1EDC, +0x1EDF => 0x1EDE, +0x1EE1 => 0x1EE0, +0x1EE3 => 0x1EE2, +0x1EE5 => 0x1EE4, +0x1EE7 => 0x1EE6, +0x1EE9 => 0x1EE8, +0x1EEB => 0x1EEA, +0x1EED => 0x1EEC, +0x1EEF => 0x1EEE, +0x1EF1 => 0x1EF0, +0x1EF3 => 0x1EF2, +0x1EF5 => 0x1EF4, +0x1EF7 => 0x1EF6, +0x1EF9 => 0x1EF8, +0x1EFB => 0x1EFA, +0x1EFD => 0x1EFC, +0x1EFF => 0x1EFE, +0x1F00 => 0x1F08, +0x1F01 => 0x1F09, +0x1F02 => 0x1F0A, +0x1F03 => 0x1F0B, +0x1F04 => 0x1F0C, +0x1F05 => 0x1F0D, +0x1F06 => 0x1F0E, +0x1F07 => 0x1F0F, +0x1F10 => 0x1F18, +0x1F11 => 0x1F19, +0x1F12 => 0x1F1A, +0x1F13 => 0x1F1B, +0x1F14 => 0x1F1C, +0x1F15 => 0x1F1D, +0x1F20 => 0x1F28, +0x1F21 => 0x1F29, +0x1F22 => 0x1F2A, +0x1F23 => 0x1F2B, +0x1F24 => 0x1F2C, +0x1F25 => 0x1F2D, +0x1F26 => 0x1F2E, +0x1F27 => 0x1F2F, +0x1F30 => 0x1F38, +0x1F31 => 0x1F39, +0x1F32 => 0x1F3A, +0x1F33 => 0x1F3B, +0x1F34 => 0x1F3C, +0x1F35 => 0x1F3D, +0x1F36 => 0x1F3E, +0x1F37 => 0x1F3F, +0x1F40 => 0x1F48, +0x1F41 => 0x1F49, +0x1F42 => 0x1F4A, +0x1F43 => 0x1F4B, +0x1F44 => 0x1F4C, +0x1F45 => 0x1F4D, +0x1F51 => 0x1F59, +0x1F53 => 0x1F5B, +0x1F55 => 0x1F5D, +0x1F57 => 0x1F5F, +0x1F60 => 0x1F68, +0x1F61 => 0x1F69, +0x1F62 => 0x1F6A, +0x1F63 => 0x1F6B, +0x1F64 => 0x1F6C, +0x1F65 => 0x1F6D, +0x1F66 => 0x1F6E, +0x1F67 => 0x1F6F, +0x1F70 => 0x1FBA, +0x1F71 => 0x1FBB, +0x1F72 => 0x1FC8, +0x1F73 => 0x1FC9, +0x1F74 => 0x1FCA, +0x1F75 => 0x1FCB, +0x1F76 => 0x1FDA, +0x1F77 => 0x1FDB, +0x1F78 => 0x1FF8, +0x1F79 => 0x1FF9, +0x1F7A => 0x1FEA, +0x1F7B => 0x1FEB, +0x1F7C => 0x1FFA, +0x1F7D => 0x1FFB, +0x1F80 => 0x1F88, +0x1F81 => 0x1F89, +0x1F82 => 0x1F8A, +0x1F83 => 0x1F8B, +0x1F84 => 0x1F8C, +0x1F85 => 0x1F8D, +0x1F86 => 0x1F8E, +0x1F87 => 0x1F8F, +0x1F90 => 0x1F98, +0x1F91 => 0x1F99, +0x1F92 => 0x1F9A, +0x1F93 => 0x1F9B, +0x1F94 => 0x1F9C, +0x1F95 => 0x1F9D, +0x1F96 => 0x1F9E, +0x1F97 => 0x1F9F, +0x1FA0 => 0x1FA8, +0x1FA1 => 0x1FA9, +0x1FA2 => 0x1FAA, +0x1FA3 => 0x1FAB, +0x1FA4 => 0x1FAC, +0x1FA5 => 0x1FAD, +0x1FA6 => 0x1FAE, +0x1FA7 => 0x1FAF, +0x1FB0 => 0x1FB8, +0x1FB1 => 0x1FB9, +0x1FB3 => 0x1FBC, +0x1FBE => 0x399, +0x1FC3 => 0x1FCC, +0x1FD0 => 0x1FD8, +0x1FD1 => 0x1FD9, +0x1FE0 => 0x1FE8, +0x1FE1 => 0x1FE9, +0x1FE5 => 0x1FEC, +0x1FF3 => 0x1FFC, +0x214E => 0x2132, +0x2170 => 0x2160, +0x2171 => 0x2161, +0x2172 => 0x2162, +0x2173 => 0x2163, +0x2174 => 0x2164, +0x2175 => 0x2165, +0x2176 => 0x2166, +0x2177 => 0x2167, +0x2178 => 0x2168, +0x2179 => 0x2169, +0x217A => 0x216A, +0x217B => 0x216B, +0x217C => 0x216C, +0x217D => 0x216D, +0x217E => 0x216E, +0x217F => 0x216F, +0x2184 => 0x2183, +0x24D0 => 0x24B6, +0x24D1 => 0x24B7, +0x24D2 => 0x24B8, +0x24D3 => 0x24B9, +0x24D4 => 0x24BA, +0x24D5 => 0x24BB, +0x24D6 => 0x24BC, +0x24D7 => 0x24BD, +0x24D8 => 0x24BE, +0x24D9 => 0x24BF, +0x24DA => 0x24C0, +0x24DB => 0x24C1, +0x24DC => 0x24C2, +0x24DD => 0x24C3, +0x24DE => 0x24C4, +0x24DF => 0x24C5, +0x24E0 => 0x24C6, +0x24E1 => 0x24C7, +0x24E2 => 0x24C8, +0x24E3 => 0x24C9, +0x24E4 => 0x24CA, +0x24E5 => 0x24CB, +0x24E6 => 0x24CC, +0x24E7 => 0x24CD, +0x24E8 => 0x24CE, +0x24E9 => 0x24CF, +0x2C30 => 0x2C00, +0x2C31 => 0x2C01, +0x2C32 => 0x2C02, +0x2C33 => 0x2C03, +0x2C34 => 0x2C04, +0x2C35 => 0x2C05, +0x2C36 => 0x2C06, +0x2C37 => 0x2C07, +0x2C38 => 0x2C08, +0x2C39 => 0x2C09, +0x2C3A => 0x2C0A, +0x2C3B => 0x2C0B, +0x2C3C => 0x2C0C, +0x2C3D => 0x2C0D, +0x2C3E => 0x2C0E, +0x2C3F => 0x2C0F, +0x2C40 => 0x2C10, +0x2C41 => 0x2C11, +0x2C42 => 0x2C12, +0x2C43 => 0x2C13, +0x2C44 => 0x2C14, +0x2C45 => 0x2C15, +0x2C46 => 0x2C16, +0x2C47 => 0x2C17, +0x2C48 => 0x2C18, +0x2C49 => 0x2C19, +0x2C4A => 0x2C1A, +0x2C4B => 0x2C1B, +0x2C4C => 0x2C1C, +0x2C4D => 0x2C1D, +0x2C4E => 0x2C1E, +0x2C4F => 0x2C1F, +0x2C50 => 0x2C20, +0x2C51 => 0x2C21, +0x2C52 => 0x2C22, +0x2C53 => 0x2C23, +0x2C54 => 0x2C24, +0x2C55 => 0x2C25, +0x2C56 => 0x2C26, +0x2C57 => 0x2C27, +0x2C58 => 0x2C28, +0x2C59 => 0x2C29, +0x2C5A => 0x2C2A, +0x2C5B => 0x2C2B, +0x2C5C => 0x2C2C, +0x2C5D => 0x2C2D, +0x2C5E => 0x2C2E, +0x2C61 => 0x2C60, +0x2C65 => 0x23A, +0x2C66 => 0x23E, +0x2C68 => 0x2C67, +0x2C6A => 0x2C69, +0x2C6C => 0x2C6B, +0x2C73 => 0x2C72, +0x2C76 => 0x2C75, +0x2C81 => 0x2C80, +0x2C83 => 0x2C82, +0x2C85 => 0x2C84, +0x2C87 => 0x2C86, +0x2C89 => 0x2C88, +0x2C8B => 0x2C8A, +0x2C8D => 0x2C8C, +0x2C8F => 0x2C8E, +0x2C91 => 0x2C90, +0x2C93 => 0x2C92, +0x2C95 => 0x2C94, +0x2C97 => 0x2C96, +0x2C99 => 0x2C98, +0x2C9B => 0x2C9A, +0x2C9D => 0x2C9C, +0x2C9F => 0x2C9E, +0x2CA1 => 0x2CA0, +0x2CA3 => 0x2CA2, +0x2CA5 => 0x2CA4, +0x2CA7 => 0x2CA6, +0x2CA9 => 0x2CA8, +0x2CAB => 0x2CAA, +0x2CAD => 0x2CAC, +0x2CAF => 0x2CAE, +0x2CB1 => 0x2CB0, +0x2CB3 => 0x2CB2, +0x2CB5 => 0x2CB4, +0x2CB7 => 0x2CB6, +0x2CB9 => 0x2CB8, +0x2CBB => 0x2CBA, +0x2CBD => 0x2CBC, +0x2CBF => 0x2CBE, +0x2CC1 => 0x2CC0, +0x2CC3 => 0x2CC2, +0x2CC5 => 0x2CC4, +0x2CC7 => 0x2CC6, +0x2CC9 => 0x2CC8, +0x2CCB => 0x2CCA, +0x2CCD => 0x2CCC, +0x2CCF => 0x2CCE, +0x2CD1 => 0x2CD0, +0x2CD3 => 0x2CD2, +0x2CD5 => 0x2CD4, +0x2CD7 => 0x2CD6, +0x2CD9 => 0x2CD8, +0x2CDB => 0x2CDA, +0x2CDD => 0x2CDC, +0x2CDF => 0x2CDE, +0x2CE1 => 0x2CE0, +0x2CE3 => 0x2CE2, +0x2CEC => 0x2CEB, +0x2CEE => 0x2CED, +0x2CF3 => 0x2CF2, +0x2D00 => 0x10A0, +0x2D01 => 0x10A1, +0x2D02 => 0x10A2, +0x2D03 => 0x10A3, +0x2D04 => 0x10A4, +0x2D05 => 0x10A5, +0x2D06 => 0x10A6, +0x2D07 => 0x10A7, +0x2D08 => 0x10A8, +0x2D09 => 0x10A9, +0x2D0A => 0x10AA, +0x2D0B => 0x10AB, +0x2D0C => 0x10AC, +0x2D0D => 0x10AD, +0x2D0E => 0x10AE, +0x2D0F => 0x10AF, +0x2D10 => 0x10B0, +0x2D11 => 0x10B1, +0x2D12 => 0x10B2, +0x2D13 => 0x10B3, +0x2D14 => 0x10B4, +0x2D15 => 0x10B5, +0x2D16 => 0x10B6, +0x2D17 => 0x10B7, +0x2D18 => 0x10B8, +0x2D19 => 0x10B9, +0x2D1A => 0x10BA, +0x2D1B => 0x10BB, +0x2D1C => 0x10BC, +0x2D1D => 0x10BD, +0x2D1E => 0x10BE, +0x2D1F => 0x10BF, +0x2D20 => 0x10C0, +0x2D21 => 0x10C1, +0x2D22 => 0x10C2, +0x2D23 => 0x10C3, +0x2D24 => 0x10C4, +0x2D25 => 0x10C5, +0x2D27 => 0x10C7, +0x2D2D => 0x10CD, +0xA641 => 0xA640, +0xA643 => 0xA642, +0xA645 => 0xA644, +0xA647 => 0xA646, +0xA649 => 0xA648, +0xA64B => 0xA64A, +0xA64D => 0xA64C, +0xA64F => 0xA64E, +0xA651 => 0xA650, +0xA653 => 0xA652, +0xA655 => 0xA654, +0xA657 => 0xA656, +0xA659 => 0xA658, +0xA65B => 0xA65A, +0xA65D => 0xA65C, +0xA65F => 0xA65E, +0xA661 => 0xA660, +0xA663 => 0xA662, +0xA665 => 0xA664, +0xA667 => 0xA666, +0xA669 => 0xA668, +0xA66B => 0xA66A, +0xA66D => 0xA66C, +0xA681 => 0xA680, +0xA683 => 0xA682, +0xA685 => 0xA684, +0xA687 => 0xA686, +0xA689 => 0xA688, +0xA68B => 0xA68A, +0xA68D => 0xA68C, +0xA68F => 0xA68E, +0xA691 => 0xA690, +0xA693 => 0xA692, +0xA695 => 0xA694, +0xA697 => 0xA696, +0xA699 => 0xA698, +0xA69B => 0xA69A, +0xA723 => 0xA722, +0xA725 => 0xA724, +0xA727 => 0xA726, +0xA729 => 0xA728, +0xA72B => 0xA72A, +0xA72D => 0xA72C, +0xA72F => 0xA72E, +0xA733 => 0xA732, +0xA735 => 0xA734, +0xA737 => 0xA736, +0xA739 => 0xA738, +0xA73B => 0xA73A, +0xA73D => 0xA73C, +0xA73F => 0xA73E, +0xA741 => 0xA740, +0xA743 => 0xA742, +0xA745 => 0xA744, +0xA747 => 0xA746, +0xA749 => 0xA748, +0xA74B => 0xA74A, +0xA74D => 0xA74C, +0xA74F => 0xA74E, +0xA751 => 0xA750, +0xA753 => 0xA752, +0xA755 => 0xA754, +0xA757 => 0xA756, +0xA759 => 0xA758, +0xA75B => 0xA75A, +0xA75D => 0xA75C, +0xA75F => 0xA75E, +0xA761 => 0xA760, +0xA763 => 0xA762, +0xA765 => 0xA764, +0xA767 => 0xA766, +0xA769 => 0xA768, +0xA76B => 0xA76A, +0xA76D => 0xA76C, +0xA76F => 0xA76E, +0xA77A => 0xA779, +0xA77C => 0xA77B, +0xA77F => 0xA77E, +0xA781 => 0xA780, +0xA783 => 0xA782, +0xA785 => 0xA784, +0xA787 => 0xA786, +0xA78C => 0xA78B, +0xA791 => 0xA790, +0xA793 => 0xA792, +0xA794 => 0xA7C4, +0xA797 => 0xA796, +0xA799 => 0xA798, +0xA79B => 0xA79A, +0xA79D => 0xA79C, +0xA79F => 0xA79E, +0xA7A1 => 0xA7A0, +0xA7A3 => 0xA7A2, +0xA7A5 => 0xA7A4, +0xA7A7 => 0xA7A6, +0xA7A9 => 0xA7A8, +0xA7B5 => 0xA7B4, +0xA7B7 => 0xA7B6, +0xA7B9 => 0xA7B8, +0xA7BB => 0xA7BA, +0xA7BD => 0xA7BC, +0xA7BF => 0xA7BE, +0xA7C3 => 0xA7C2, +0xA7C8 => 0xA7C7, +0xA7CA => 0xA7C9, +0xA7F6 => 0xA7F5, +0xAB53 => 0xA7B3, +0xAB70 => 0x13A0, +0xAB71 => 0x13A1, +0xAB72 => 0x13A2, +0xAB73 => 0x13A3, +0xAB74 => 0x13A4, +0xAB75 => 0x13A5, +0xAB76 => 0x13A6, +0xAB77 => 0x13A7, +0xAB78 => 0x13A8, +0xAB79 => 0x13A9, +0xAB7A => 0x13AA, +0xAB7B => 0x13AB, +0xAB7C => 0x13AC, +0xAB7D => 0x13AD, +0xAB7E => 0x13AE, +0xAB7F => 0x13AF, +0xAB80 => 0x13B0, +0xAB81 => 0x13B1, +0xAB82 => 0x13B2, +0xAB83 => 0x13B3, +0xAB84 => 0x13B4, +0xAB85 => 0x13B5, +0xAB86 => 0x13B6, +0xAB87 => 0x13B7, +0xAB88 => 0x13B8, +0xAB89 => 0x13B9, +0xAB8A => 0x13BA, +0xAB8B => 0x13BB, +0xAB8C => 0x13BC, +0xAB8D => 0x13BD, +0xAB8E => 0x13BE, +0xAB8F => 0x13BF, +0xAB90 => 0x13C0, +0xAB91 => 0x13C1, +0xAB92 => 0x13C2, +0xAB93 => 0x13C3, +0xAB94 => 0x13C4, +0xAB95 => 0x13C5, +0xAB96 => 0x13C6, +0xAB97 => 0x13C7, +0xAB98 => 0x13C8, +0xAB99 => 0x13C9, +0xAB9A => 0x13CA, +0xAB9B => 0x13CB, +0xAB9C => 0x13CC, +0xAB9D => 0x13CD, +0xAB9E => 0x13CE, +0xAB9F => 0x13CF, +0xABA0 => 0x13D0, +0xABA1 => 0x13D1, +0xABA2 => 0x13D2, +0xABA3 => 0x13D3, +0xABA4 => 0x13D4, +0xABA5 => 0x13D5, +0xABA6 => 0x13D6, +0xABA7 => 0x13D7, +0xABA8 => 0x13D8, +0xABA9 => 0x13D9, +0xABAA => 0x13DA, +0xABAB => 0x13DB, +0xABAC => 0x13DC, +0xABAD => 0x13DD, +0xABAE => 0x13DE, +0xABAF => 0x13DF, +0xABB0 => 0x13E0, +0xABB1 => 0x13E1, +0xABB2 => 0x13E2, +0xABB3 => 0x13E3, +0xABB4 => 0x13E4, +0xABB5 => 0x13E5, +0xABB6 => 0x13E6, +0xABB7 => 0x13E7, +0xABB8 => 0x13E8, +0xABB9 => 0x13E9, +0xABBA => 0x13EA, +0xABBB => 0x13EB, +0xABBC => 0x13EC, +0xABBD => 0x13ED, +0xABBE => 0x13EE, +0xABBF => 0x13EF, +0xFF41 => 0xFF21, +0xFF42 => 0xFF22, +0xFF43 => 0xFF23, +0xFF44 => 0xFF24, +0xFF45 => 0xFF25, +0xFF46 => 0xFF26, +0xFF47 => 0xFF27, +0xFF48 => 0xFF28, +0xFF49 => 0xFF29, +0xFF4A => 0xFF2A, +0xFF4B => 0xFF2B, +0xFF4C => 0xFF2C, +0xFF4D => 0xFF2D, +0xFF4E => 0xFF2E, +0xFF4F => 0xFF2F, +0xFF50 => 0xFF30, +0xFF51 => 0xFF31, +0xFF52 => 0xFF32, +0xFF53 => 0xFF33, +0xFF54 => 0xFF34, +0xFF55 => 0xFF35, +0xFF56 => 0xFF36, +0xFF57 => 0xFF37, +0xFF58 => 0xFF38, +0xFF59 => 0xFF39, +0xFF5A => 0xFF3A, +0x10428 => 0x10400, +0x10429 => 0x10401, +0x1042A => 0x10402, +0x1042B => 0x10403, +0x1042C => 0x10404, +0x1042D => 0x10405, +0x1042E => 0x10406, +0x1042F => 0x10407, +0x10430 => 0x10408, +0x10431 => 0x10409, +0x10432 => 0x1040A, +0x10433 => 0x1040B, +0x10434 => 0x1040C, +0x10435 => 0x1040D, +0x10436 => 0x1040E, +0x10437 => 0x1040F, +0x10438 => 0x10410, +0x10439 => 0x10411, +0x1043A => 0x10412, +0x1043B => 0x10413, +0x1043C => 0x10414, +0x1043D => 0x10415, +0x1043E => 0x10416, +0x1043F => 0x10417, +0x10440 => 0x10418, +0x10441 => 0x10419, +0x10442 => 0x1041A, +0x10443 => 0x1041B, +0x10444 => 0x1041C, +0x10445 => 0x1041D, +0x10446 => 0x1041E, +0x10447 => 0x1041F, +0x10448 => 0x10420, +0x10449 => 0x10421, +0x1044A => 0x10422, +0x1044B => 0x10423, +0x1044C => 0x10424, +0x1044D => 0x10425, +0x1044E => 0x10426, +0x1044F => 0x10427, +0x104D8 => 0x104B0, +0x104D9 => 0x104B1, +0x104DA => 0x104B2, +0x104DB => 0x104B3, +0x104DC => 0x104B4, +0x104DD => 0x104B5, +0x104DE => 0x104B6, +0x104DF => 0x104B7, +0x104E0 => 0x104B8, +0x104E1 => 0x104B9, +0x104E2 => 0x104BA, +0x104E3 => 0x104BB, +0x104E4 => 0x104BC, +0x104E5 => 0x104BD, +0x104E6 => 0x104BE, +0x104E7 => 0x104BF, +0x104E8 => 0x104C0, +0x104E9 => 0x104C1, +0x104EA => 0x104C2, +0x104EB => 0x104C3, +0x104EC => 0x104C4, +0x104ED => 0x104C5, +0x104EE => 0x104C6, +0x104EF => 0x104C7, +0x104F0 => 0x104C8, +0x104F1 => 0x104C9, +0x104F2 => 0x104CA, +0x104F3 => 0x104CB, +0x104F4 => 0x104CC, +0x104F5 => 0x104CD, +0x104F6 => 0x104CE, +0x104F7 => 0x104CF, +0x104F8 => 0x104D0, +0x104F9 => 0x104D1, +0x104FA => 0x104D2, +0x104FB => 0x104D3, +0x10CC0 => 0x10C80, +0x10CC1 => 0x10C81, +0x10CC2 => 0x10C82, +0x10CC3 => 0x10C83, +0x10CC4 => 0x10C84, +0x10CC5 => 0x10C85, +0x10CC6 => 0x10C86, +0x10CC7 => 0x10C87, +0x10CC8 => 0x10C88, +0x10CC9 => 0x10C89, +0x10CCA => 0x10C8A, +0x10CCB => 0x10C8B, +0x10CCC => 0x10C8C, +0x10CCD => 0x10C8D, +0x10CCE => 0x10C8E, +0x10CCF => 0x10C8F, +0x10CD0 => 0x10C90, +0x10CD1 => 0x10C91, +0x10CD2 => 0x10C92, +0x10CD3 => 0x10C93, +0x10CD4 => 0x10C94, +0x10CD5 => 0x10C95, +0x10CD6 => 0x10C96, +0x10CD7 => 0x10C97, +0x10CD8 => 0x10C98, +0x10CD9 => 0x10C99, +0x10CDA => 0x10C9A, +0x10CDB => 0x10C9B, +0x10CDC => 0x10C9C, +0x10CDD => 0x10C9D, +0x10CDE => 0x10C9E, +0x10CDF => 0x10C9F, +0x10CE0 => 0x10CA0, +0x10CE1 => 0x10CA1, +0x10CE2 => 0x10CA2, +0x10CE3 => 0x10CA3, +0x10CE4 => 0x10CA4, +0x10CE5 => 0x10CA5, +0x10CE6 => 0x10CA6, +0x10CE7 => 0x10CA7, +0x10CE8 => 0x10CA8, +0x10CE9 => 0x10CA9, +0x10CEA => 0x10CAA, +0x10CEB => 0x10CAB, +0x10CEC => 0x10CAC, +0x10CED => 0x10CAD, +0x10CEE => 0x10CAE, +0x10CEF => 0x10CAF, +0x10CF0 => 0x10CB0, +0x10CF1 => 0x10CB1, +0x10CF2 => 0x10CB2, +0x118C0 => 0x118A0, +0x118C1 => 0x118A1, +0x118C2 => 0x118A2, +0x118C3 => 0x118A3, +0x118C4 => 0x118A4, +0x118C5 => 0x118A5, +0x118C6 => 0x118A6, +0x118C7 => 0x118A7, +0x118C8 => 0x118A8, +0x118C9 => 0x118A9, +0x118CA => 0x118AA, +0x118CB => 0x118AB, +0x118CC => 0x118AC, +0x118CD => 0x118AD, +0x118CE => 0x118AE, +0x118CF => 0x118AF, +0x118D0 => 0x118B0, +0x118D1 => 0x118B1, +0x118D2 => 0x118B2, +0x118D3 => 0x118B3, +0x118D4 => 0x118B4, +0x118D5 => 0x118B5, +0x118D6 => 0x118B6, +0x118D7 => 0x118B7, +0x118D8 => 0x118B8, +0x118D9 => 0x118B9, +0x118DA => 0x118BA, +0x118DB => 0x118BB, +0x118DC => 0x118BC, +0x118DD => 0x118BD, +0x118DE => 0x118BE, +0x118DF => 0x118BF, +0x16E60 => 0x16E40, +0x16E61 => 0x16E41, +0x16E62 => 0x16E42, +0x16E63 => 0x16E43, +0x16E64 => 0x16E44, +0x16E65 => 0x16E45, +0x16E66 => 0x16E46, +0x16E67 => 0x16E47, +0x16E68 => 0x16E48, +0x16E69 => 0x16E49, +0x16E6A => 0x16E4A, +0x16E6B => 0x16E4B, +0x16E6C => 0x16E4C, +0x16E6D => 0x16E4D, +0x16E6E => 0x16E4E, +0x16E6F => 0x16E4F, +0x16E70 => 0x16E50, +0x16E71 => 0x16E51, +0x16E72 => 0x16E52, +0x16E73 => 0x16E53, +0x16E74 => 0x16E54, +0x16E75 => 0x16E55, +0x16E76 => 0x16E56, +0x16E77 => 0x16E57, +0x16E78 => 0x16E58, +0x16E79 => 0x16E59, +0x16E7A => 0x16E5A, +0x16E7B => 0x16E5B, +0x16E7C => 0x16E5C, +0x16E7D => 0x16E5D, +0x16E7E => 0x16E5E, +0x16E7F => 0x16E5F, +0x1E922 => 0x1E900, +0x1E923 => 0x1E901, +0x1E924 => 0x1E902, +0x1E925 => 0x1E903, +0x1E926 => 0x1E904, +0x1E927 => 0x1E905, +0x1E928 => 0x1E906, +0x1E929 => 0x1E907, +0x1E92A => 0x1E908, +0x1E92B => 0x1E909, +0x1E92C => 0x1E90A, +0x1E92D => 0x1E90B, +0x1E92E => 0x1E90C, +0x1E92F => 0x1E90D, +0x1E930 => 0x1E90E, +0x1E931 => 0x1E90F, +0x1E932 => 0x1E910, +0x1E933 => 0x1E911, +0x1E934 => 0x1E912, +0x1E935 => 0x1E913, +0x1E936 => 0x1E914, +0x1E937 => 0x1E915, +0x1E938 => 0x1E916, +0x1E939 => 0x1E917, +0x1E93A => 0x1E918, +0x1E93B => 0x1E919, +0x1E93C => 0x1E91A, +0x1E93D => 0x1E91B, +0x1E93E => 0x1E91C, +0x1E93F => 0x1E91D, +0x1E940 => 0x1E91E, +0x1E941 => 0x1E91F, +0x1E942 => 0x1E920, +0x1E943 => 0x1E921, +]; diff --git a/src/Exception/InvalidCharException.php b/src/Exception/InvalidCharException.php new file mode 100644 index 0000000..117dd4d --- /dev/null +++ b/src/Exception/InvalidCharException.php @@ -0,0 +1,46 @@ +char = $char; + } + + /** + * @return mixed + */ + public function char() + { + return $this->char; + } +} diff --git a/src/Exception/InvalidCodePointException.php b/src/Exception/InvalidCodePointException.php new file mode 100644 index 0000000..8b53e05 --- /dev/null +++ b/src/Exception/InvalidCodePointException.php @@ -0,0 +1,46 @@ +codePoint = $codePoint; + } + + /** + * @return mixed + */ + public function codePoint() + { + return$this->codePoint; + } +} diff --git a/src/Exception/InvalidStringException.php b/src/Exception/InvalidStringException.php new file mode 100644 index 0000000..6c7bb2d --- /dev/null +++ b/src/Exception/InvalidStringException.php @@ -0,0 +1,61 @@ +string = $string; + $this->offset = $offset; + } + + /** + * @return string + */ + public function string(): string + { + return $this->string; + } + + /** + * @return int + */ + public function offset(): int + { + return $this->offset; + } +} diff --git a/src/Exception/UnicodeException.php b/src/Exception/UnicodeException.php new file mode 100644 index 0000000..d695e9e --- /dev/null +++ b/src/Exception/UnicodeException.php @@ -0,0 +1,25 @@ +codes = $codes; - $this->chars = $chars; - $this->length = count($codes); - } + protected $length = 0; /** - * @param mixed $offset - * @return bool + * @var string|null */ - public function offsetExists($offset) - { - return isset($this->codes[$offset]); - } + protected $str = null; /** - * @param mixed $offset - * @return string + * @var null|array */ - public function offsetGet($offset) - { - return $this->chars[$offset]; - } + protected $cache = null; /** - * @param mixed $offset - * @param mixed $value + * @param int[] $codes */ - public function offsetSet($offset, $value) + protected function __construct(array $codes = []) { - throw new RuntimeException("Invalid operation"); + $this->codes = $codes; + $this->length = count($codes); } /** - * @param mixed $offset + * @return int[] */ - public function offsetUnset($offset) + public function codePoints(): array { - throw new RuntimeException("Invalid operation"); + return $this->codes; } /** @@ -100,17 +86,12 @@ public function offsetUnset($offset) */ public function chars(): array { + if ($this->chars === null) { + $this->chars = self::getCharsFromCodePoints($this->codes); + } return $this->chars; } - /** - * @return int[] - */ - public function codePoints(): array - { - return $this->codes; - } - /** * @return int */ @@ -128,115 +109,167 @@ public function isEmpty(): bool } /** - * @param string|UnicodeString $text + * @param string|self|int[]|string[] $text * @param bool $ignoreCase * @return bool */ public function equals($text, bool $ignoreCase = false): bool { - $text = static::from($text); - - if ($ignoreCase) { - return $this->toLower()->equals($text->toLower()); - } - - return $this->codes === $text->codes; + return $this->compareTo($text, $ignoreCase) === 0; } /** - * @param string|UnicodeString $text + * @param string|self|int[]|string[] $text * @param bool $ignoreCase * @return int */ public function compareTo($text, bool $ignoreCase = false): int { - $text = static::from($text); + $mode = $ignoreCase ? self::FOLD_CASE : self::KEEP_CASE; - if ($this->length !== $text->length) { - return $this->length > $text->length ? 1 : -1; - } + $text = self::resolveCodePoints($text, $mode); - if ($ignoreCase) { - return $this->toLower()->compareTo($text->toLower()); - } + $length = count($text); - for ($i = 0, $l = $this->length; $i < $l; $i++) { - if ($this->codes[$i] !== $text->codes[$i]) { - return $this->codes[$i] > $text->codes[$i] ? 1 : -1; - } + if ($length !== $this->length) { + return $this->length <=> $length; } - return 0; + return $this->getMappedCodes($mode) <=> $text; } /** - * @param string|UnicodeString $text + * @param string|self|int[]|string[] $text * @param bool $ignoreCase * @return bool */ public function contains($text, bool $ignoreCase = false): bool { - return $this->indexOf($text, 0, $ignoreCase) !== false; + return $this->indexOf($text, 0, $ignoreCase) !== -1; } /** - * @param string|UnicodeString $text + * @param string|self|int[]|string[] $text * @param bool $ignoreCase * @return bool */ public function startsWith($text, bool $ignoreCase = false): bool { - return $this->indexOf($text, 0, $ignoreCase) === 0; + $mode = $ignoreCase ? self::FOLD_CASE : self::KEEP_CASE; + + $text = self::resolveCodePoints($text, $mode); + + $len = count($text); + + if ($len === 0 || $len > $this->length) { + return false; + } + + return array_slice($this->getMappedCodes($mode), 0, $len) === $text; } /** - * @param string|UnicodeString $text + * @param string|self|int[]|string[] $text * @param bool $ignoreCase * @return bool */ public function endsWith($text, bool $ignoreCase = false): bool { - $text = static::from($text); + $mode = $ignoreCase ? self::FOLD_CASE : self::KEEP_CASE; + + $text = self::resolveCodePoints($text, $mode); - $offset = $this->length - $text->length; + if (empty($text)) { + return false; + } + + $codes = $this->getMappedCodes($mode); + + $offset = $this->length - count($text); if ($offset < 0) { return false; } - return $this->indexOf($text, $offset, $ignoreCase) === $offset; + return array_slice($codes, $offset) === $text; } /** - * @param string|UnicodeString $text + * @param string|self|int[]|string[] $text * @param int $offset * @param bool $ignoreCase - * @return int|false + * @return int */ - public function indexOf($text, int $offset = 0, bool $ignoreCase = false) + public function indexOf($text, int $offset = 0, bool $ignoreCase = false): int { - $text = static::from($text); + if ($offset < 0) { + $offset += $this->length; + } + if ($offset < 0 || $offset >= $this->length) { + return -1; + } - if ($this->length < $text->length) { - return false; + $mode = $ignoreCase ? self::FOLD_CASE : self::KEEP_CASE; + + $text = self::resolveCodePoints($text, $mode); + + $len = count($text); + + if ($len === 0 || $offset + $len > $this->length) { + return -1; } - if ($ignoreCase) { - return $this->toLower()->indexOf($text->toLower(), $offset); + return $this->doIndexOf($this->getMappedCodes($mode), $text, $offset); + } + + /** + * @param string|self|int[]|string[] $text + * @param int $offset + * @param bool $ignoreCase + * @return int + */ + public function lastIndexOf($text, int $offset = 0, bool $ignoreCase = false): int + { + if ($offset < 0) { + $start = $this->length + $offset; + if ($start < 0) { + return -1; + } + $last = 0; + } else { + if ($offset >= $this->length) { + return -1; + } + $start = $this->length - 1; + $last = $offset; + } + + $mode = $ignoreCase ? self::FOLD_CASE : self::KEEP_CASE; + + $text = self::resolveCodePoints($text, $mode); + + $len = count($text); + + if ($len === 0) { + return -1; } if ($offset < 0) { - $offset = 0; + if ($len > $this->length) { + return -1; + } + $start = min($start, $this->length - $len); + } elseif ($offset + $len > $this->length) { + return -1; } - $cp1 = $this->codes; - $cp2 = $text->codes; + $codes = $this->getMappedCodes($mode); - for ($i = $offset, $l = $this->length - $text->length; $i <= $l; $i++) { + for ($i = $start; $i >= $last; $i--) { $match = true; - for ($j = 0, $f = $text->length; $j < $f; $j++) { - if ($cp1[$i + $j] != $cp2[$j]) { + for ($j = 0; $j < $len; $j++) { + if ($codes[$i + $j] !== $text[$j]) { $match = false; break; } @@ -247,719 +280,1432 @@ public function indexOf($text, int $offset = 0, bool $ignoreCase = false) } } - return false; + return -1; } /** - * @param UnicodeString|string $text + * @param string|self|int[]|string[] $text * @param bool $ignoreCase - * @return false|int + * @param bool $allowPrefixOnly If true the result can contain only the prefix + * @return $this */ - public function lastIndexOf($text, bool $ignoreCase = false) + public function ensurePrefix($text, bool $ignoreCase = false, bool $allowPrefixOnly = true): self { - $text = static::from($text); + $text = self::resolveCodePoints($text); - if ($this->length < $text->length) { - return false; + $len = count($text); + + if ($len === 0) { + return clone $this; + } + + if ($this->length === 0) { + return new static($text); } if ($ignoreCase) { - return $this->toLower()->lastIndexOf($text->toLower()); + $prefix = self::getMappedCodePoints($text, self::FOLD_CASE); + } else { + $prefix = &$text; + } + + if ($this->length === $len) { + $part = $this->getMappedCodes($ignoreCase ? self::FOLD_CASE : self::KEEP_CASE); + if ($allowPrefixOnly && $part === $prefix) { + return clone $this; + } + // Remove last element to avoid double check + array_pop($part); + } elseif ($this->length < $len) { + $part = $this->getMappedCodes($ignoreCase ? self::FOLD_CASE : self::KEEP_CASE); + // Checks if this can be a suffix + if ($allowPrefixOnly && (array_slice($prefix, 0, $this->length) === $part)) { + $text = array_slice($text, $this->length); + return new static(array_merge($this->codes, $text)); + } + } else { + $part = array_slice($this->codes, 0, $len); + if ($ignoreCase) { + $part = self::getMappedCodePoints($part, self::FOLD_CASE); + } + if ($part === $prefix) { + return clone $this; + } + // Remove last element to avoid double check + array_pop($part); } - $index = false; - $offset = 0; + $copy = $len; - while (true) { - if (false === $offset = $this->indexOf($text, $offset)) { + $part_len = count($part); + + while ($part_len) { + if ($part === array_slice($prefix, -$part_len)) { + $copy = $len - $part_len; break; } - $index = $offset; - $offset += $text->length; + array_pop($part); + $part_len--; + } + + if ($copy === 0) { + return clone $this; + } + + if ($copy < $len) { + $text = array_slice($text, 0, $copy); } - return $index; + return new static(array_merge($text, $this->codes)); } /** - * @param string|UnicodeString $text + * @param string|self|int[]|string[] $text * @param bool $ignoreCase - * @return UnicodeString + * @param bool $allowSuffixOnly If true the result can contain only the suffix + * @return static */ - public function ensurePrefix($text, bool $ignoreCase = false): self + public function ensureSuffix($text, bool $ignoreCase = false, bool $allowSuffixOnly = true): self { - $text = static::from($text); + $text = self::resolveCodePoints($text); - if (!$this->startsWith($text, $ignoreCase)) { - $cp = array_merge($text->codes, $this->codes); - $ch = array_merge($text->chars, $this->chars); + $len = count($text); - return new static($cp, $ch); + if ($len === 0) { + return clone $this; } - return clone $this; - } + if ($this->length === 0) { + return new static($text); + } - /** - * @param string|UnicodeString $text - * @param bool $ignoreCase - * @return UnicodeString - */ - public function ensureSuffix($text, bool $ignoreCase = false): self - { - $text = static::from($text); + if ($ignoreCase) { + $suffix = self::getMappedCodePoints($text, self::FOLD_CASE); + } else { + $suffix = &$text; + } + + if ($this->length === $len) { + $part = $this->getMappedCodes($ignoreCase ? self::FOLD_CASE : self::KEEP_CASE); + if ($allowSuffixOnly && $part === $suffix) { + return clone $this; + } + // Remove first element to avoid double check + array_shift($part); + } elseif ($this->length < $len) { + $part = $this->getMappedCodes($ignoreCase ? self::FOLD_CASE : self::KEEP_CASE); + // Checks if this can be a prefix + if ($allowSuffixOnly && (array_slice($suffix, -$this->length) === $part)) { + $text = array_slice($text, 0, $len - $this->length); + return new static(array_merge($text, $this->codes)); + } + } else { + $part = array_slice($this->codes, -$len); + if ($ignoreCase) { + $part = self::getMappedCodePoints($part, self::FOLD_CASE); + } + if ($part === $suffix) { + return clone $this; + } + // Remove first element to avoid double check + array_shift($part); + } + + $skip = 0; + + $part_len = count($part); + + while ($part_len) { + if ($part === array_slice($suffix, 0, $part_len)) { + $skip = $part_len; + break; + } + array_shift($part); + $part_len--; + } - if (!$this->endsWith($text, $ignoreCase)) { - $cp = array_merge($this->codes, $text->codes); - $ch = array_merge($this->chars, $text->chars); + if ($skip === $len) { + return clone $this; + } - return new static($cp, $ch); + if ($skip) { + array_splice($text, 0, $skip); } - return clone $this; + return new static(array_merge($this->codes, $text)); } /** - * @param UnicodeString|string $text - * @return UnicodeString + * @param string|self|int[]|string[] $text + * @param int $mode + * @return static */ - public function append($text): self + public function append($text, int $mode = self::KEEP_CASE): self { - $text = static::from($text); - $cp = array_merge($this->codes, $text->codes); - $ch = array_merge($this->chars, $text->chars); - - return new static($cp, $ch); + return new static(array_merge($this->codes, self::resolveCodePoints($text, $mode))); } /** - * @param UnicodeString|string $text - * @return UnicodeString + * @param string|self|int[]|string[] $text + * @param int $mode + * @return static */ - public function prepend($text): self + public function prepend($text, int $mode = self::KEEP_CASE): self { - $text = static::from($text); - $cp = array_merge($text->codes, $this->codes); - $ch = array_merge($text->chars, $this->chars); - - return new static($cp, $ch); + return new static(array_merge(self::resolveCodePoints($text, $mode), $this->codes)); } /** - * @param string|UnicodeString $text - * @param int $index - * @return UnicodeString + * @param string|self|int[]|string[] $text + * @param int $offset + * @param int $mode + * @return static */ - public function insert($text, int $index): self + public function insert($text, int $offset, int $mode = self::KEEP_CASE): self { - if ($index <= 0) { - return $this->prepend($text); - } - - if ($index >= $this->length) { - return $this->append($text); - } + $codes = $this->codes; - $text = static::from($text); + array_splice($codes, $offset, 0, self::resolveCodePoints($text, $mode)); - $lcp = array_slice($this->codes, 0, $index); - $lch = array_slice($this->chars, 0, $index); + return new static($codes); + } - $rcp = array_slice($this->codes, $index); - $rch = array_slice($this->chars, $index); + /** + * @param int $offset + * @param int|null $length + * @return static + */ + public function remove(int $offset, int $length = null): self + { + $codes = $this->codes; - $cp = array_merge($lcp, $text->codes, $rcp); - $ch = array_merge($lch, $text->chars, $rch); + if ($length === null) { + array_splice($codes, $offset); + } else { + array_splice($codes, $offset, $length); + } - return new static($cp, $ch); + return new static($codes); } /** - * @param string|UnicodeString $character_mask - * @return UnicodeString + * @param string|self|int[]|string[] $mask + * @return static */ - public function trim($character_mask = " \t\n\r\0\x0B"): self + public function trim($mask = " \t\n\r\0\x0B"): self { - return $this->doTrim($character_mask); + return $this->doTrim($mask, true, true); } /** - * @param string|UnicodeString $character_mask - * @return UnicodeString + * @param string|self|int[]|string[] $mask + * @return static */ - public function trimLeft($character_mask = " \t\n\r\0\x0B"): self + public function trimLeft($mask = " \t\n\r\0\x0B"): self { - return $this->doTrim($character_mask, true, false); + return $this->doTrim($mask, true, false); } /** - * @param string|UnicodeString $character_mask - * @return UnicodeString + * @param string|self|int[]|string[] $mask + * @return static */ - public function trimRight($character_mask = " \t\n\r\0\x0B"): self + public function trimRight($mask = " \t\n\r\0\x0B"): self { - return $this->doTrim($character_mask, false, true); + return $this->doTrim($mask, false, true); } /** - * @param string|UnicodeString $subject - * @param string|UnicodeString $replace - * @param int $offset - * @return UnicodeString + * @return static */ - public function replace($subject, $replace, int $offset = 0): self + public function reverse(): self { - $subject = static::from($subject); - $replace = static::from($replace); - - if (false === $pos = $this->indexOf($subject, $offset)) { - return clone $this; - } - - $cp1 = array_slice($this->codes, 0, $pos); - $cp2 = array_slice($this->codes, $pos + $subject->length); - $ch1 = array_slice($this->chars, 0, $pos); - $ch2 = array_slice($this->chars, $pos + $subject->length); - - $cp = array_merge($cp1, $replace->codes, $cp2); - $ch = array_merge($ch1, $replace->chars, $ch2); - - return new static($cp, $ch); + return new static(array_reverse($this->codes)); } /** - * @param string|UnicodeString $subject - * @param string|UnicodeString $replace - * @return UnicodeString + * @param int $times + * @return static */ - public function replaceAll($subject, $replace): self + public function repeat(int $times = 1): self { - $subject = static::from($subject); - $replace = static::from($replace); - - if (false === $offset = $this->indexOf($subject) || $subject->isEmpty()) { + if ($times <= 1) { return clone $this; } - $text = $this; + $codes = []; - do { - $text = $text->replace($subject, $replace, $offset); - $offset = $text->indexOf($subject, $offset + $replace->length); - } while ($offset !== false); + while ($times--) { + $codes = array_merge($codes, $this->codes); + } - return $text; + return new static($codes); } /** - * @return UnicodeString + * @param string|self|int[]|string[] $subject + * @param string|self|int[]|string[] $replace + * @param int $offset + * @param bool $ignoreCase + * @return static */ - public function reverse(): self + public function replace($subject, $replace, int $offset = 0, bool $ignoreCase = false): self { - $cp = array_reverse($this->codes); - $ch = array_reverse($this->chars); + if ($offset < 0) { + $offset += $this->length; + } + if ($offset < 0 || $offset >= $this->length) { + return clone $this; + } - return new static($cp, $ch); - } + $mode = $ignoreCase ? self::FOLD_CASE : self::KEEP_CASE; + $subject = self::resolveCodePoints($subject, $mode); - /** - * @param int $times - * @return UnicodeString - */ - public function repeat(int $times = 1): self - { - if ($times < 1) { - $times = 1; + $len = count($subject); + + if ($len === 0 || $offset + $len > $this->length) { + return clone $this; } - $cp = $this->codes; - $ch = $this->chars; + $offset = $this->doIndexOf($this->getMappedCodes($mode), $subject, $offset); - for ($i = 0; $i < $times; $i++) { - $cp = array_merge($cp, $this->codes); - $ch = array_merge($ch, $this->chars); + if ($offset === -1) { + return clone $this; } - return new static($cp, $ch); + $codes = $this->codes; + + array_splice($codes, $offset, count($subject), self::resolveCodePoints($replace)); + + return new static($codes); } /** - * @param int $index - * @param int $length - * @return UnicodeString + * @param string|self|int[]|string[] $subject + * @param string|self|int[]|string[] $replace + * @param bool $ignoreCase + * @param int $offset + * @return static */ - public function remove(int $index, int $length): self + public function replaceAll($subject, $replace, bool $ignoreCase = false, int $offset = 0): self { - if ($index < 0) { - $index = 0; + if ($offset < 0) { + $offset += $this->length; + } + if ($offset < 0 || $offset >= $this->length) { + return clone $this; } - if ($length < 0) { - $length = 0; + $mode = $ignoreCase ? self::FOLD_CASE : self::KEEP_CASE; + + $subject = self::resolveCodePoints($subject, $mode); + + $len = count($subject); + + if ($len === 0 || $offset + $len > $this->length) { + return clone $this; } - $lcp = array_slice($this->codes, 0, $index); - $lch = array_slice($this->chars, 0, $index); - $rcp = array_slice($this->codes, $index + $length); - $rch = array_slice($this->chars, $index + $length); + $replace = self::resolveCodePoints($replace); + + $codes = $this->getMappedCodes($mode); + + $copy = $this->codes; + + $fix = count($replace) - $len; - $cp = array_merge($lcp, $rcp); - $ch = array_merge($lch, $rch); + $t = 0; - return new static($cp, $ch); + while (($pos = $this->doIndexOf($codes, $subject, $offset)) >= 0) { + array_splice($copy, $pos + $t * $fix, $len, $replace); + $offset = $pos + $len; + $t++; + } + + return new static($copy); } /** - * @param string|UnicodeString $char - * @return UnicodeString[] + * @param string|self|int[]|string[] $delimiter + * @param bool $ignoreCase + * @return array */ - public function split($char = ''): array + public function split($delimiter = '', bool $ignoreCase = false): array { - $char = static::from($char); - $results = []; + $mode = $ignoreCase ? self::FOLD_CASE : self::KEEP_CASE; + $delimiter = self::resolveCodePoints($delimiter, $mode); + $len = count($delimiter); - if ($char->isEmpty()) { - for ($i = 0, $l = $this->length; $i < $l; $i++) { - $results[] = new static([$this->codes[$i]], [$this->chars[$i]]); + $ret = []; + + if ($len === 0) { + foreach ($this->codes as $code) { + $ret[] = new static([$code]); } - return $results; - } + } else { + $codes = $this->getMappedCodes($mode); - if (false === $offset = $this->indexOf($char)) { - return [clone $this]; - } + $offset = 0; + + while (($pos = $this->doIndexOf($codes, $delimiter, $offset)) >= 0) { + $ret[] = new static(array_slice($this->codes, $offset, $pos - $offset)); + $offset = $pos + $len; + } - $start = 0; - do { - $cp = array_slice($this->codes, $start, $offset - $start); - $ch = array_slice($this->chars, $start, $offset - $start); - $results[] = new static($cp, $ch); - $start = $offset + $char->length; - $offset = $this->indexOf($char, $start); - } while ($offset !== false); + $ret[] = new static(array_slice($this->codes, $offset)); + } - $cp = array_slice($this->codes, $start); - $ch = array_slice($this->chars, $start); - $results[] = new static($cp, $ch); - return $results; + return $ret; } /** * @param int $start * @param int|null $length - * @return UnicodeString + * @return static */ public function substring(int $start, int $length = null): self { - $cp = array_slice($this->codes, $start, $length); - $ch = array_slice($this->chars, $start, $length); - - return new static($cp, $ch); + return new static(array_slice($this->codes, $start, $length)); } /** - * @param int $length - * @param string|UnicodeString $char - * @return UnicodeString + * @param int $size If negative then pad left otherwise pad right + * @param self|string|int $char A char or a code point + * @return static */ - public function padLeft(int $length, $char = ' '): self + public function pad(int $size, $char = 0x20): self { - return $this->doPad($length, $char, true); + return new static(array_pad($this->codes, $size, self::resolveFirstCodePoint($char, 0x20))); } /** - * @param int $length - * @param string|UnicodeString $char - * @return UnicodeString + * @param int $size + * @param self|string|int $char + * @return static */ - public function padRight($length, $char = ' '): self + public function padLeft(int $size, $char = 0x20): self { - return $this->doPad($length, $char, false); + if ($size > 0) { + $size = -$size; + } + + return $this->pad($size, $char); } /** - * @return bool + * @param int $size + * @param self|string|int $char + * @return static */ - public function isLowerCase(): bool + public function padRight(int $size, $char = 0x20): self { - if (!isset($this->cache[static::CACHE_IS_LOWER])) { - $this->cache[static::CACHE_IS_LOWER] = $this->isCase($this->getLowerMap()); + if ($size < 0) { + $size = -$size; } - return $this->cache[static::CACHE_IS_LOWER]; + return $this->pad($size, $char); } /** * @return bool */ - public function isUpperCase(): bool + public function isLowerCase(): bool { - if (!isset($this->cache[static::CACHE_IS_UPPER])) { - $this->cache[static::CACHE_IS_UPPER] = $this->isCase($this->getUpperMap()); - } - - return $this->cache[static::CACHE_IS_UPPER]; + return $this->isCase(self::LOWER_CASE); } /** * @return bool */ - public function isAscii(): bool + public function isUpperCase(): bool { - if (!isset($this->cache[static::CACHE_IS_ASCII])) { - foreach ($this->codes as $code) { - if ($code >= 0x80) { - return $this->cache[static::CACHE_IS_ASCII] = false; - } - } - return $this->cache[static::CACHE_IS_ASCII] = true; - } - - return $this->cache[static::CACHE_IS_ASCII]; + return $this->isCase(self::UPPER_CASE); } /** - * @return UnicodeString + * @return bool */ - public function toAscii(): self + public function isAscii(): bool { + $key = 'i' . self::ASCII_CONV; - if (!isset($this->cache[static::CACHE_TO_ASCII])) { - if (isset($this->cache[static::CACHE_IS_ASCII]) && $this->cache[static::CACHE_IS_ASCII]) { - $this->cache[static::CACHE_TO_ASCII] = clone $this; - } else { - $ascii = $this->getAsciiMap(); - $char = $this->getCharMap(); - $ch = []; - $cp = []; - - foreach ($this->codes as $code) { - if (isset($ascii[$code])) { - $cp[] = $c = $ascii[$code]; - $ch[] = $char[$c]; - } - } - - $instance = new static($cp, $ch); - $instance->cache[static::CACHE_IS_ASCII] = true; + if (!isset($this->cache[$key])) { + $ok = true; - $keys = [static::CACHE_IS_UPPER, static::CACHE_IS_LOWER]; - - foreach ($keys as $key) { - if (isset($this->cache[$key])) { - $instance->cache[$key] = $this->cache[$key]; - } + foreach ($this->codes as $code) { + if ($code >= 0x80) { + $ok = false; + break; } - - $this->cache[static::CACHE_TO_ASCII] = $instance; } + + $this->cache[$key] = $ok; } - return $this->cache[static::CACHE_TO_ASCII]; + return $this->cache[$key]; } /** - * @return UnicodeString + * Convert all chars to lower case (where possible) + * @return static */ public function toLower(): self { - if (!isset($this->cache[static::CACHE_TO_LOWER])) { - if (isset($this->cache[static::CACHE_IS_LOWER]) && $this->cache[static::CACHE_IS_LOWER]) { - $this->cache[static::CACHE_TO_LOWER] = clone $this; - } else { - $this->cache[static::CACHE_TO_LOWER] = $this->toCase($this->getLowerMap(), static::CACHE_IS_LOWER); - } + if ($this->cache['i' . self::LOWER_CASE] ?? false) { + return clone $this; } - - return $this->cache[static::CACHE_TO_LOWER]; + return new static($this->getMappedCodes(self::LOWER_CASE)); } /** - * @return UnicodeString + * Convert all chars to upper case (where possible) + * @return static */ public function toUpper(): self { - if (!isset($this->cache[static::CACHE_TO_UPPER])) { - if (isset($this->cache[static::CACHE_IS_UPPER]) && $this->cache[static::CACHE_IS_UPPER]) { - $this->cache[static::CACHE_TO_UPPER] = clone $this; - } else { - $this->cache[static::CACHE_TO_UPPER] = $this->toCase($this->getUpperMap(), static::CACHE_IS_UPPER); - } + if ($this->cache['i' . self::UPPER_CASE] ?? false) { + return clone $this; } - - return $this->cache[static::CACHE_TO_UPPER]; + return new static($this->getMappedCodes(self::UPPER_CASE)); } /** - * @param int $offset - * @return int + * Converts all chars to their ASCII equivalent (if any) + * @return static */ - public function __invoke($offset) + public function toAscii(): self { - return $this->codes[$offset]; + if ($this->cache['i' . self::ASCII_CONV] ?? false) { + return clone $this; + } + return new static($this->getMappedCodes(self::ASCII_CONV)); } /** + * @param int $index * @return string */ - public function __toString() + public function charAt(int $index): string { - if ($this->string === null) { - $this->string = implode('', $this->chars); + // Allow negative index + if ($index < 0 && $index + $this->length >= 0) { + $index += $this->length; + } + + if ($index < 0 || $index >= $this->length) { + return ''; } - return $this->string; + return $this->chars()[$index]; } /** - * @param $string - * @param string $encoding - * @return UnicodeString + * @param int $index + * @return int */ - public static function from($string, $encoding = 'UTF-8') + public function codePointAt(int $index): int { - static $ord; + // Allow negative index + if ($index < 0 && $index + $this->length >= 0) { + $index += $this->length; + } - if ($string instanceof self) { - return $string; + if ($index < 0 || $index >= $this->length) { + return -1; } - if ($encoding !== 'UTF-8') { - if (false === $string = @iconv($encoding, 'UTF-8', $string)) { - throw new RuntimeException("Could not convert string from '$encoding' encoding to UTF-8 encoding"); + return $this->codes[$index]; + } + + /** + * @param int $offset + * @return int + */ + public function __invoke(int $offset): int + { + if ($offset < 0) { + if ($offset + $this->length < 0) { + throw new OutOfBoundsException("Undefined offset: {$offset}"); } + $offset += $this->length; + } elseif ($offset >= $this->length) { + throw new OutOfBoundsException("Undefined offset: {$offset}"); } - if ($ord === null) { - $ord = require __DIR__ . '/../res/ord.php'; + return $this->codes[$offset]; + } + + /** + * @inheritDoc + */ + public function offsetExists($offset) + { + // Allow negative index + if ($offset < 0) { + $offset += $this->length; } - $codes = $chars = []; + return isset($this->codes[$offset]); + } - for ($i = 0, $l = strlen($string); $i < $l; $i++) { - $c = $ord[$ch = $string[$i]]; + /** + * @inheritDoc + */ + public function offsetGet($offset) + { + if ($offset < 0) { + if ($offset + $this->length < 0) { + throw new OutOfBoundsException("Undefined offset: {$offset}"); + } + $offset += $this->length; + } elseif ($offset >= $this->length) { + throw new OutOfBoundsException("Undefined offset: {$offset}"); + } - if (($c & 0x80) == 0) { - $codes[] = $c; - $chars[] = $ch; - } elseif (($c & 0xE0) == 0xC0) { - $c1 = $ord[$string[++$i]]; - $codes[] = (($c & 0x1F) << 6) | ($c1 & 0x3F); - $chars[] = substr($string, $i - 1, 2); - } elseif (($c & 0xF0) == 0xE0) { - $c1 = $ord[$string[++$i]]; - $c2 = $ord[$string[++$i]]; - $codes[] = (($c & 0x0F) << 12) | (($c1 & 0x3F) << 6) | ($c2 & 0x3F); - $chars[] = substr($string, $i - 2, 3); - } elseif (($c & 0xF8) == 0xF0) { - $c1 = $ord[$string[++$i]]; - $c2 = $ord[$string[++$i]]; - $c3 = $ord[$string[++$i]]; - $codes[] = (($c & 0x07) << 18) | (($c1 & 0x3F) << 12) | (($c2 & 0x3F) << 6) | ($c3 & 0x3F); - $chars[] = substr($string, $i - 3, 4); - } else { - throw new RuntimeException('Invalid UTF-8 string'); + return $this->chars()[$offset]; + } + + /** + * @inheritDoc + */ + public function offsetSet($offset, $value) + { + // Allow negative index + if ($offset < 0) { + $offset += $this->length; + } + + if (!isset($this->codes[$offset])) { + return; + } + + + $value = self::resolveFirstCodePoint($value); + if ($value === -1) { + return; + } + + if ($value === $this->codes[$offset]) { + // Same value, nothing to do + return; + } + + $this->codes[$offset] = $value; + + // Clear cache + $this->str = null; + $this->cache = null; + if ($this->chars) { + $this->chars[$offset] = self::getCharFromCodePoint($value); + } + } + + /** + * @inheritDoc + */ + public function offsetUnset($offset) + { + throw new RuntimeException("Invalid operation"); + } + + /** + * @inheritDoc + */ + public function count() + { + return $this->length; + } + + /** + * @return string + */ + public function __toString(): string + { + if ($this->str === null) { + $this->str = implode('', $this->chars()); + } + + return $this->str; + } + + /** + * @inheritDoc + */ + public function jsonSerialize() + { + return $this->__toString(); + } + + /** + * @inheritDoc + */ + public function serialize() + { + return $this->__toString(); + } + + /** + * @inheritDoc + */ + public function unserialize($serialized) + { + if (is_string($serialized)) { + $this->str = $serialized; + $this->codes = self::getCodePointsFromString($serialized); + $this->length = count($this->codes); + } else { + $this->codes = []; + } + } + + /** + * @param int $mode + * @return int[] + */ + protected function getMappedCodes(int $mode): array + { + if ($mode === self::KEEP_CASE || ($this->cache['i' . $mode] ?? false)) { + return $this->codes; + } + + $key = 'm' . $mode; + + if (!isset($this->cache[$key])) { + $this->cache[$key] = self::getMappedCodePoints($this->codes, $mode); + } + + return $this->cache[$key]; + } + + /** + * @param int $mode + * @return bool + */ + protected function isCase(int $mode): bool + { + $key = 'i' . $mode; + + if (!isset($this->cache[$key])) { + $list = self::getMapByMode($mode); + foreach ($this->codes as $code) { + if (isset($list[$code])) { + return $this->cache[$key] = false; + } } + + return $this->cache[$key] = true; } - return new static($codes, $chars); + return $this->cache[$key]; } /** - * @param string|UnicodeString $character_mask + * @param int[] $codes + * @param int[] $text + * @param int $offset + * @return int + */ + protected function doIndexOf(array $codes, array $text, int $offset = 0): int + { + $len = count($text); + + for ($i = $offset, $last = count($codes) - $len; $i <= $last; $i++) { + $match = true; + + for ($j = 0; $j < $len; $j++) { + if ($codes[$i + $j] !== $text[$j]) { + $match = false; + break; + } + } + + if ($match) { + return $i; + } + } + + return -1; + } + + /** + * @param string|self|int[]|string[] $mask * @param bool $left * @param bool $right - * @return UnicodeString + * @return static */ - protected function doTrim($character_mask, bool $left = true, bool $right = true): self + protected function doTrim($mask, bool $left, bool $right): self { - $character_mask = static::from($character_mask); + if ($this->length === 0) { + return clone $this; + } + + $mask = self::resolveCodePoints($mask); + + if (empty($mask)) { + return clone $this; + } - $cm = $character_mask->codes; - $cp = $this->codes; - $start = 0; - $end = $this->length; + $codes = $this->codes; if ($left) { - for ($i = 0; $i < $this->length; $i++) { - if (!in_array($cp[$i], $cm)) { - break; + while (in_array($codes[0], $mask, true)) { + array_shift($codes); + if (empty($codes)) { + return new static(); } } - $start = $i; } if ($right) { - for ($i = $this->length - 1; $i > $start; $i--) { - if (!in_array($cp[$i], $cm)) { - break; + $last = count($codes) - 1; + while (in_array($codes[$last], $mask, true)) { + array_pop($codes); + if (--$last < 0) { + return new static(); } } - $end = $i + 1; } - $cp = array_slice($cp, $start, $end - $start); - $ch = array_slice($this->chars, $start, $end - $start); - - return new static($cp, $ch); + return new static($codes); } + /***************************************** + ***** Static methods and properties ***** + *****************************************/ + /** - * @param int $length - * @param string|UnicodeString $pad - * @param bool $left - * @return UnicodeString + * @var int[][] */ - protected function doPad(int $length, $pad, bool $left = true): self + protected static $maps = []; + + /** + * Creates an unicode string instance from raw string + * @param string $string + * @param string|null $encoding Defaults to UTF-8 + * @param int $mode + * @return static + * @throws InvalidStringException + */ + public static function from(string $string, string $encoding = null, int $mode = self::KEEP_CASE): self { - if ($length <= 0) { - return new static([], []); + if ($encoding !== null && strcasecmp($encoding, 'UTF-8') !== 0) { + if (false === $string = @iconv($encoding, 'UTF-8', $string)) { + throw new UnicodeException("Could not convert string from '$encoding' encoding to UTF-8 encoding"); + } } - if ($length === $this->length) { - return clone $this; + $instance = new static(self::getCodePointsFromString($string, $mode)); + if ($mode === self::KEEP_CASE) { + $instance->str = $string; } + return $instance; + } - if ($length < $this->length) { - if ($left) { - return $this->substring($this->length - $length); + /** + * Creates an unicode string instance from code points + * @param int[] $codes + * @param int $mode + * @return static + * @throws InvalidCodePointException + */ + public static function fromCodePoints(array $codes, int $mode = self::KEEP_CASE): self + { + $map = self::getMapByMode($mode); + + foreach ($codes as &$code) { + if (!is_int($codes) || !self::isValidCodePoint($code)) { + throw new InvalidCodePointException($code); } else { - return $this->substring(0, $length); + $code = $map[$code] ?? $code; } } - $pad = static::from($pad); + return new static(array_values($codes)); + } - if ($pad->isEmpty()) { - $pad = static::from(' '); + /** + * Creates an unicode string instance from chars + * @param string[] $chars + * @param int $mode + * @return static + */ + public static function fromChars(array $chars, int $mode = self::KEEP_CASE): self + { + return new static(self::getCodePointsFromChars($chars, $mode)); + } + + /** + * Converts the char to corresponding code point + * @param string $char + * @return int Code point or -1 if char is invalid + */ + public static function getCodePointFromChar(string $char): int + { + return self::getNextCodePoint($char, strlen($char)); + } + + /** + * Converts the code point to corresponding char + * @param int $code + * @return string The char or an empty string if code point is invalid + */ + public static function getCharFromCodePoint(int $code): string + { + if ($code < 0) { + return ''; } - $noch = $length - $this->length; - $mod = $noch % $pad->length; - $times = ($noch - $mod) / $pad->length; + if ($code < 0x80) { + return chr($code); + } - $padchars = []; - $padcodes = []; + if ($code < 0x800) { + return chr(($code >> 6) + 0xC0) . chr(($code & 0x3F) + 0x80); + } - for ($i = 0; $i < $times; $i++) { - $padcodes = array_merge($padcodes, $pad->codes); - $padchars = array_merge($padchars, $pad->chars); + if ($code >= 0xD800 && $code <= 0xDFFF) { + /* + The definition of UTF-8 prohibits encoding character numbers between + U+D800 and U+DFFF, which are reserved for use with the UTF-16 + encoding form (as surrogate pairs) and do not directly represent characters. + */ + return ''; } - if ($mod != 0) { - $padcodes = array_merge($padcodes, array_slice($pad->codes, 0, $mod)); - $padchars = array_merge($padchars, array_slice($pad->chars, 0, $mod)); + if ($code <= 0xFFFF) { + return + chr(($code >> 12) + 0xE0) . + chr((($code >> 6) & 0x3F) + 0x80) . + chr(($code & 0x3F) + 0x80); } - if ($left) { - $cp = array_merge($padcodes, $this->codes); - $ch = array_merge($padchars, $this->chars); - } else { - $cp = array_merge($this->codes, $padcodes); - $ch = array_merge($this->chars, $padchars); + if ($code <= 0x10FFFF) { + return + chr(($code >> 18) + 0xF0) . + chr((($code >> 12) & 0x3F) + 0x80) . + chr((($code >> 6) & 0x3F) + 0x80) . + chr(($code & 0x3F) + 0x80); } - return new static($cp, $ch); + /* + Restricted the range of characters to 0000-10FFFF (the UTF-16 accessible range). + */ + + return ''; } /** - * @param array $map - * @param int $cacheKey - * @return UnicodeString + * Convert a string to a code point array + * @param string $str + * @param int $mode + * @return array + * @throws InvalidStringException */ - protected function toCase(array $map, int $cacheKey): self + public static function getCodePointsFromString(string $str, int $mode = self::KEEP_CASE): array { - $cp = $this->codes; - $ch = $this->chars; - $ocp = $och = []; + $i = 0; + $codes = []; + $used_len = 0; + $length = strlen($str); + + if ($mode === self::KEEP_CASE) { + while ($i < $length) { + $code = self::getNextCodePoint($str, $length, $i, $used_len); + if ($code >= 0) { + $codes[] = $code; + $i += $used_len; + } else { + throw new InvalidStringException($str, $i + $used_len - 1); + } + } + } else { + $mode = self::getMapByMode($mode); + while ($i < $length) { + $code = self::getNextCodePoint($str, $length, $i, $used_len); + if ($code >= 0) { + $codes[] = $mode[$code] ?? $code; + $i += $used_len; + } else { + throw new InvalidStringException($str, $i + $used_len - 1); + } + } + } + + return $codes; + } - for ($i = 0, $l = $this->length; $i < $l; $i++) { - $p = $cp[$i]; - if (isset($map[$p])) { - $v = $map[$p]; - $ocp[] = $v[0]; - $och[] = $v[1]; + /** + * Convert string to a char array + * @param string $str + * @return array + * @throws InvalidStringException + */ + public static function getCharsFromString(string $str): array + { + $i = 0; + $chars = []; + $used_len = 0; + $length = strlen($str); + + while ($i < $length) { + $char = self::getNextChar($str, $length, $i, $used_len); + if ($char !== '') { + $chars[] = $char; + $i += $used_len; } else { - $ocp[] = $p; - $och[] = $ch[$i]; + throw new InvalidStringException($str, $i + $used_len - 1); } } - $str = new static($ocp, $och); - $str->cache[$cacheKey] = true; - - return $str; + return $chars; } /** - * @param array $map - * @return bool + * Converts each char to a code point + * @param array $chars + * @param int $mode + * @return array + * @throws InvalidCharException */ - protected function isCase(array $map): bool + public static function getCodePointsFromChars(array $chars, int $mode = self::KEEP_CASE): array { - foreach ($this->codes as $cp) { - if (isset($map[$cp])) { - return false; + $mode = self::getMapByMode($mode); + + foreach ($chars as &$char) { + $code = self::getCodePointFromChar($char); + if ($code === -1) { + throw new InvalidCharException($char); + } else { + $char = $mode[$code] ?? $code; } } - return true; + + return $chars; } /** + * Converts each code point to a char + * @param array $codes + * @param int $mode * @return array + * @throws InvalidCodePointException */ - protected function getUpperMap(): array + public static function getCharsFromCodePoints(array $codes, int $mode = self::KEEP_CASE): array { - static $upper; + $mode = self::getMapByMode($mode); - if ($upper === null) { - $upper = require __DIR__ . '/../res/upper.php'; + foreach ($codes as &$code) { + $char = self::getCharFromCodePoint($mode[$code] ?? $code); + if ($char === '') { + throw new InvalidCodePointException($code); + } else { + $code = $char; + } } - return $upper; + return $codes; } /** + * Converts all code points to chars and returns the string + * Invalid code points are ignored + * @param array $codes + * @param int $mode + * @return string + */ + public static function getStringFromCodePoints(array $codes, int $mode = self::KEEP_CASE): string + { + return implode('', self::getCharsFromCodePoints($codes, $mode)); + } + + /** + * Concatenates all chars + * @param array $chars + * @return string + */ + public static function getStringFromChars(array $chars): string + { + return implode('', $chars); + } + + /** + * @param array $codes + * @param int $mode * @return array */ - protected function getLowerMap(): array + public static function getMappedCodePoints(array $codes, int $mode): array { - static $lower; + if ($mode === self::KEEP_CASE) { + return $codes; + } - if ($lower === null) { - $lower = require __DIR__ . '/../res/lower.php'; + $mode = self::getMapByMode($mode); + + if (empty($mode)) { + return $codes; + } + + foreach ($codes as &$code) { + $code = $mode[$code] ?? $code; } - return $lower; + return $codes; } /** - * @return array + * Checks if a code point is valid + * @param int $code + * @return bool + */ + public static function isValidCodePoint(int $code): bool + { + if ($code < 0 || $code > 0x10FFFF) { + return false; + } + + return $code < 0xD800 || $code > 0xDFFF; + } + + /** + * Checks if a char is valid + * @param string $char + * @return bool + */ + public static function isValidChar(string $char): bool + { + if ($char === '') { + return false; + } + + $length = strlen($char); + + if (self::getNextCodePoint($char, $length, 0, $used_len) >= 0) { + return $length === $used_len; + } + + return false; + } + + /** + * Internal function used to get next code point from string + * @param string $char + * @param int $length + * @param int $offset + * @param int|null $used_len + * @return int + */ + protected static function getNextCodePoint(string &$char, int $length, int $offset = 0, int &$used_len = null): int + { + $used_len = 0; + $length -= $offset; + + if ($length < 1) { + return -1; + } + + // 0x00-0x7F + $used_len = 1; + $ord0 = ord($char[$offset]); + + if ($ord0 < 0x80) { + return $ord0; + } elseif ($length < 2) { + return -1; + } + + // 0xC2-0xDF 0x80-0xBF + + if ($ord0 < 0xC2) { + return -1; + } + + $used_len = 2; + $ord1 = ord($char[$offset + 1]); + + if ($ord0 < 0xE0) { + if ($ord1 < 0x80 || $ord1 >= 0xC0) { + return -1; + } + + return ($ord0 - 0xC0) * 64 + $ord1 - 0x80; + } elseif ($length < 3) { + return -1; + } + + // 0xE0-0xE0 0xA0-0xBF 0x80-0xBF + // 0xE1-0xEC 0x80-0xBF 0x80-0xBF + // 0xED-0xED 0x80-0x9F 0x80-0xBF + // 0xEE-0xEF 0x80-0xBF 0x80-0xBF + + $used_len = 3; + $ord2 = ord($char[$offset + 2]); + + if ($ord0 < 0xF0) { + if ($ord0 === 0xE0) { + if ($ord1 < 0xA0 || $ord1 >= 0xC0) { + $used_len = 2; + return -1; + } + } elseif ($ord0 === 0xED) { + if ($ord1 < 0x80 || $ord1 >= 0xA0) { + $used_len = 2; + return -1; + } + } elseif ($ord1 < 0x80 || $ord1 >= 0xC0) { + $used_len = 2; + return -1; + } + + if ($ord2 < 0x80 || $ord2 >= 0xC0) { + return -1; + } + + return ($ord0 - 0xE0) * 0x1000 + ($ord1 - 0x80) * 64 + $ord2 - 0x80; + } elseif ($length < 4) { + return -1; + } + + // 0xF0-0xF0 0x90-0xBF 0x80-0xBF 0x80-0xBF + // 0xF1-0xF3 0x80-0xBF 0x80-0xBF 0x80-0xBF + // 0xF4-0xF4 0x80-0x8F 0x80-0xBF 0x80-0xBF + + $used_len = 4; + $ord3 = ord($char[$offset + 3]); + + if ($ord0 < 0xF5) { + if ($ord0 === 0xF0) { + if ($ord1 < 0x90 || $ord1 >= 0xC0) { + $used_len = 2; + return -1; + } + } elseif ($ord0 === 0xF4) { + if ($ord1 < 0x80 || $ord1 >= 0x90) { + $used_len = 2; + return -1; + } + } elseif ($ord1 < 0x80 || $ord1 >= 0xC0) { + $used_len = 2; + return -1; + } + + if ($ord2 < 0x80 || $ord2 >= 0xC0) { + $used_len = 3; + return -1; + } + + if ($ord3 < 0x80 || $ord3 >= 0xC0) { + return -1; + } + + return ($ord0 - 0xF0) * 0x40000 + ($ord1 - 0x80) * 0x1000 + ($ord2 - 0x80) * 64 + $ord3 - 0x80; + } + + $used_len = 1; + + return -1; + } + + /** + * Internal function used to get next char from string + * @param string $char + * @param int $length + * @param int $offset + * @param int|null $used_len + * @return string */ - protected function getAsciiMap(): array + protected static function getNextChar(string &$char, int $length, int $offset = 0, int &$used_len = null): string { - static $ascii; + $used_len = 0; + $length -= $offset; + + if ($length < 1) { + return ''; + } + + // 0x00-0x7F + $used_len = 1; + $ord0 = ord($char[$offset]); + + if ($ord0 < 0x80) { + return $char[$offset]; + } elseif ($length < 2) { + return ''; + } + + // 0xC2-0xDF 0x80-0xBF + + if ($ord0 < 0xC2) { + return ''; + } + + $used_len = 2; + $ord1 = ord($char[$offset + 1]); + + if ($ord0 < 0xE0) { + if ($ord1 < 0x80 || $ord1 >= 0xC0) { + return ''; + } + + return $char[$offset] . $char[$offset + 1]; + } elseif ($length < 3) { + return ''; + } + + // 0xE0-0xE0 0xA0-0xBF 0x80-0xBF + // 0xE1-0xEC 0x80-0xBF 0x80-0xBF + // 0xED-0xED 0x80-0x9F 0x80-0xBF + // 0xEE-0xEF 0x80-0xBF 0x80-0xBF + + $used_len = 3; + $ord2 = ord($char[$offset + 2]); + + if ($ord0 < 0xF0) { + if ($ord0 === 0xE0) { + if ($ord1 < 0xA0 || $ord1 >= 0xC0) { + $used_len = 2; + return ''; + } + } elseif ($ord0 === 0xED) { + if ($ord1 < 0x80 || $ord1 >= 0xA0) { + $used_len = 2; + return ''; + } + } elseif ($ord1 < 0x80 || $ord1 >= 0xC0) { + $used_len = 2; + return ''; + } + + if ($ord2 < 0x80 || $ord2 >= 0xC0) { + return ''; + } + + return $char[$offset] . $char[$offset + 1] . $char[$offset + 2]; + } elseif ($length < 4) { + return ''; + } + + // 0xF0-0xF0 0x90-0xBF 0x80-0xBF 0x80-0xBF + // 0xF1-0xF3 0x80-0xBF 0x80-0xBF 0x80-0xBF + // 0xF4-0xF4 0x80-0x8F 0x80-0xBF 0x80-0xBF + + $used_len = 4; + $ord3 = ord($char[$offset + 3]); + + if ($ord0 < 0xF5) { + if ($ord0 === 0xF0) { + if ($ord1 < 0x90 || $ord1 >= 0xC0) { + $used_len = 2; + return ''; + } + } elseif ($ord0 === 0xF4) { + if ($ord1 < 0x80 || $ord1 >= 0x90) { + $used_len = 2; + return ''; + } + } elseif ($ord1 < 0x80 || $ord1 >= 0xC0) { + $used_len = 2; + return ''; + } + + if ($ord2 < 0x80 || $ord2 >= 0xC0) { + $used_len = 3; + return ''; + } + + if ($ord3 < 0x80 || $ord3 >= 0xC0) { + return ''; + } - if ($ascii === null) { - $ascii = require __DIR__ . '/../res/ascii.php'; + return $char[$offset] . $char[$offset + 1] . $char[$offset + 2] . $char[$offset + 3]; } - return $ascii; + $used_len = 1; + + return ''; } /** + * @param string|self|int[]|string[] $text + * @param int $mode * @return array */ - protected function getCharMap(): array + protected static function resolveCodePoints($text, int $mode = self::KEEP_CASE): array { - static $char; + if ($text instanceof self) { + return $text->getMappedCodes($mode); + } + + if (is_string($text)) { + return self::getCodePointsFromString($text, $mode); + } - if ($char === null) { - $char = require __DIR__ . '/../res/char.php'; + if (is_array($text) && $text) { + return is_int($text[0]) + ? self::getMappedCodePoints($text, $mode) + : self::getCodePointsFromChars($text, $mode); } - return $char; + return []; } + /** + * @param self|string|int|string[]|int[] $text + * @param int $invalid + * @return int + */ + protected static function resolveFirstCodePoint($text, int $invalid = -1): int + { + if ($text instanceof self) { + return $text->length === 0 ? $invalid : $text->codes[0]; + } + + if (is_array($text)) { + if (empty($text)) { + return $invalid; + } + $text = reset($text); + } + + if (is_string($text)) { + $text = self::getNextCodePoint($text, strlen($text)); + return $text === -1 ? $invalid : $text; + } + + if (is_int($text)) { + return self::isValidCodePoint($text) ? $text : $invalid; + } + + return $invalid; + } + + /** + * @param int $mode + * @return int[] + */ + protected static function getMapByMode(int $mode): array + { + if (isset(self::$maps[$mode])) { + return self::$maps[$mode]; + } + + switch ($mode) { + case self::LOWER_CASE: + $file = 'lower'; + break; + case self::UPPER_CASE: + $file = 'upper'; + break; + case self::ASCII_CONV: + $file = 'ascii'; + break; + case self::FOLD_CASE: + $file = 'fold'; + break; + default: + return []; + } + + return self::$maps[$mode] = include(__DIR__ . "/../res/{$file}.php"); + } } diff --git a/tests/UnicodeStringTest.php b/tests/UnicodeStringTest.php index a1dc94d..6c4b6ae 100644 --- a/tests/UnicodeStringTest.php +++ b/tests/UnicodeStringTest.php @@ -1,6 +1,6 @@ assertEquals(10, wstring::from('ăĂâÂîÎşŞţŢ')->length()); - } - public function testToString() + public function testFrom() { - $this->assertEquals('ăĂâÂîÎşŞţŢ', (string) wstring::from('ăĂâÂîÎşŞţŢ')); - } + $this->assertEquals("aBcDe", wstr::from("aBcDe")); + $this->assertEquals("abcde", wstr::from("aBcDe", null, wstr::LOWER_CASE)); + $this->assertEquals("ABCDE", wstr::from("aBcDe", null, wstr::UPPER_CASE)); - public function testArrayAccess() - { - $str = wstring::from('ăĂâÂîÎşŞţŢ'); - $this->assertEquals('ă', $str[0]); - $this->assertEquals('Ţ', $str[9]); - $this->assertEquals('Î', $str[5]); + $this->assertEquals("ăĂâÂîÎșȘțȚ", wstr::from("ăĂâÂîÎșȘțȚ")); + $this->assertEquals("ăăââîîșșțț", wstr::from("ăĂâÂîÎșȘțȚ", null, wstr::LOWER_CASE)); + $this->assertEquals("ĂĂÂÂÎÎȘȘȚȚ", wstr::from("ăĂâÂîÎșȘțȚ", null, wstr::UPPER_CASE)); } - public function testEquals() + public function testFromInvalidEncoding() { - $this->assertTrue(wstring::from('abc')->equals('abc')); - $this->assertFalse(wstring::from('Abc')->equals('abc')); - } + $this->expectException(UnicodeException::class); + $this->expectExceptionMessage("Could not convert string from 'error_encoding' encoding to UTF-8 encoding"); - public function testEqualsCaseInsensitive() - { - $this->assertTrue(wstring::from('Abc')->equals('aBc', true)); - $this->assertFalse(wstring::from('Abd')->equals('aBc', true)); + wstr::from('abcd', 'error_encoding'); } - public function testCompareTo() + /** + * @dataProvider invalidStringOffsetDataProvider + */ + public function testFromInvalidString(string $str, int $offset) { - $this->assertEquals(0, wstring::from('abc')->compareTo('abc')); - $this->assertEquals(1, wstring::from('abcd')->compareTo('abc')); - $this->assertEquals(1, wstring::from('abc')->compareTo('Abc')); - $this->assertEquals(-1, wstring::from('Abc')->compareTo('abc')); - $this->assertEquals(-1, wstring::from('abc')->compareTo('abcd')); - } + $this->expectException(InvalidStringException::class); + $this->expectExceptionMessage("Invalid UTF-8 string at offset {$offset}"); - public function testCompareToCaseInsensitive() - { - $this->assertEquals(0, wstring::from('abc')->compareTo('abc', true)); - $this->assertEquals(1, wstring::from('abcd')->compareTo('abc', true)); - $this->assertEquals(0, wstring::from('abc')->compareTo('Abc', true)); - $this->assertEquals(0, wstring::from('Abc')->compareTo('abc', true)); - $this->assertEquals(-1, wstring::from('abc')->compareTo('abcd', true)); + wstr::from($str); } - public function testContains() + public function invalidStringOffsetDataProvider() { - $this->assertTrue(wstring::from('abcdefg')->contains('cde')); - $this->assertTrue(wstring::from('abcdefg')->contains('abc')); - $this->assertTrue(wstring::from('abcdefg')->contains('efg')); - $this->assertFalse(wstring::from('abcdefg')->contains('cda')); - } + return [ + ["\x80", 0], + ["\xC1", 0], + ["\xF5", 0], + ["\xC2\x7F", 1], + ["\xC2\xC0", 1], - public function testContainsCaseInsensitive() - { - $this->assertTrue(wstring::from('abcdefg')->contains('CDE', true)); - $this->assertTrue(wstring::from('abcdefg')->contains('ABC', true)); - $this->assertTrue(wstring::from('abcdefg')->contains('EFG', true)); - $this->assertFalse(wstring::from('abcdefg')->contains('CDA')); - } + ["\xE0\x9F\x80", 1], + ["\xE0\xC0\x80", 1], + ["\xE0\xA0\x7F", 2], + ["\xE0\xA0\xC0", 2], + ["\xE1\x80\xC0", 2], - public function testStartsWith() - { - $this->assertTrue(wstring::from('abcde')->startsWith('ab')); - $this->assertFalse(wstring::from('abcde')->startsWith('ac')); + ["\xF4\x90\x80\x80", 1], + ["\xF4\x80\x7F\x80", 2], + ["\xF4\x80\x80\xC0", 3], + ]; } - public function testStartsWithCaseInsensitive() + /** + * @dataProvider codePointsDataProvider + */ + public function testCodePoints(string $str, array $codes) { - $this->assertTrue(wstring::from('abcde')->startsWith('AB', true)); - $this->assertFalse(wstring::from('abcde')->startsWith('AC', true)); + $this->assertEquals($codes, wstr::from($str)->codePoints()); } - public function testEndsWith() + public function codePointsDataProvider() { - $this->assertTrue(wstring::from('abcde')->endsWith('de')); - $this->assertFalse(wstring::from('abcde')->endsWith('ce')); + return [ + ["\u{61}\u{41}\u{103}\u{102}", [0x61, 0x41, 0x103, 0x102]], + ["ăĂâÂîÎșȘțȚ", [0x103, 0x102, 0xE2, 0xC2, 0xEE, 0xCE, 0x219, 0x218, 0x21B, 0x21A]], + ]; } - public function testEndsWithOffsetShouldBeLessThanZero() + public function testChars() { - $this->assertFalse(wstring::from('abcde')->endsWith('ceffff')); + $this->assertEquals(['ă', 'Ă', 'â', 'Â', 'î', 'Î', 'ș', 'Ș', 'ț', 'Ț'], wstr::from("ăĂâÂîÎșȘțȚ")->chars()); } - public function testEndsWithCaseInsensitive() + public function testLength() { - $this->assertTrue(wstring::from('abcde')->endsWith('DE', true)); - $this->assertFalse(wstring::from('abcde')->endsWith('CE', true)); + $this->assertEquals(0, wstr::from('')->length()); + $this->assertEquals(1, wstr::from(' ')->length()); + $this->assertEquals(5, wstr::from('abcde')->length()); + $this->assertEquals(10, wstr::from('ăĂâÂîÎșȘțȚ')->length()); + $this->assertEquals(15, wstr::from('abcdeăĂâÂîÎșȘțȚ')->length()); } - public function testIndexOf() + public function testIsEmpty() { - $this->assertEquals(0, wstring::from('abcabc')->indexOf('ab')); - $this->assertEquals(3, wstring::from('abcabc')->indexOf('ab', 1)); + $this->assertTrue(wstr::from('')->isEmpty()); + + $this->assertFalse(wstr::from(' ')->isEmpty()); + $this->assertFalse(wstr::from('0')->isEmpty()); + $this->assertFalse(wstr::from("\x00")->isEmpty()); } - public function testIndexOfShouldBeFalse() + public function testEquals() { - $this->assertFalse(wstring::from('abcabc')->indexOf('abcdefg')); + $this->assertTrue(wstr::from("abc")->equals("abc")); + $this->assertTrue(wstr::from("abc")->equals("ABC", true)); + $this->assertTrue(wstr::from("ăĂâÂîÎșȘțȚ")->equals("ăĂâÂîÎșȘțȚ")); + $this->assertTrue(wstr::from("ăâîșț")->equals("ĂÂÎȘȚ", true)); + + $this->assertFalse(wstr::from("abc")->equals("ABC")); + $this->assertFalse(wstr::from("ăâîșț")->equals("ĂÂÎȘȚ")); } - public function testIndexOfOffsetShouldBeChangedIntoZero() + /** + * @dataProvider compareToDataProvider + */ + public function testCompareTo(string $str, string $to, int $result, bool $ignoreCase = false) { - $this->assertEquals(0, wstring::from('abcabc')->indexOf('ab', -1)); + $this->assertEquals($result, wstr::from($str)->compareTo($to, $ignoreCase)); } - public function testIndexOfCaseInsensitive() + public function compareToDataProvider() { - $this->assertEquals(0, wstring::from('abcabc')->indexOf('AB', 0, true)); - $this->assertEquals(3, wstring::from('abcabc')->indexOf('AB', 1, true)); + return [ + ['abc', 'abc', 0], + ['abc', 'ABC', 0, true], + ['abc', 'ABC', 1], + ['ABC', 'abc', -1], + ["abc", "ab", 1], + ["ab", "abc", -1], + + ["ĂÂÎȘȚ", "ĂÂÎȘȚ", 0], + ["ăâîșț", "ĂÂÎȘȚ", 1], + ["ĂÂÎȘȚ", "ăâîșț", -1], + ["ĂÂÎȘȚ", "ăâîșț", 0, true], + ]; } - public function testLastIndexOf() + public function testContains() { - $this->assertEquals(3, wstring::from('abcabcAbc')->lastIndexOf('ab')); + $this->assertTrue(wstr::from("abcde")->contains("bc")); + $this->assertFalse(wstr::from("abcde")->contains("bf")); + + $this->assertFalse(wstr::from("abcde")->contains("Bc")); + $this->assertTrue(wstr::from("abcde")->contains("Bc", true)); + + $this->assertFalse(wstr::from("ĂÂÎȘȚ")->contains("ăâîșț")); + $this->assertTrue(wstr::from("ĂÂÎȘȚ")->contains("ăâîșț", true)); + + $this->assertFalse(wstr::from("abc")->contains('')); } - public function testLastIndexOfShouldBeFalse() + /** + * @dataProvider startsWithDataProvider + */ + public function testStartsWith(string $str, string $start, bool $result, bool $ignoreCase = false) { - $this->assertFalse(wstring::from('abcabcAbc')->lastIndexOf('abcdefghijk')); + $this->assertEquals($result, wstr::from($str)->startsWith($start, $ignoreCase)); } - public function testLastIndexOfCaseInsensitive() + public function startsWithDataProvider() { - $this->assertEquals(6, wstring::from('abcabcAbc')->lastIndexOf('AB', true)); + return [ + ["abc", "a", true], + ["abc", "ab", true], + ["abc", "abc", true], + + ["abc", "abcd", false], + ["abc", "b", false], + + ["abc", "A", false], + ["abc", "A", true, true], + ["aBc", "Ab", true, true], + + ["abc", "", false], + + ["dabc", "abc", false], + ["Abc", "ab", false], + + ["ĂÂÎȘȚ", "A", false], + ["ĂÂÎȘȚ", "A", false, true], + ["ĂÂÎȘȚ", "Ă", true], + ["ĂÂÎȘȚ", "ă", false], + ["ĂÂÎȘȚ", "ăâ", true, true], + ]; } - public function testEnsurePrefix() + /** + * @dataProvider endsWithDataProvider + */ + public function testEndsWith(string $str, string $end, bool $result, bool $ignoreCase = false) { - $this->assertEquals("abc", (string) wstring::from('abc')->ensurePrefix('a')); - $this->assertEquals("Aabc", (string) wstring::from('abc')->ensurePrefix('A')); - $this->assertEquals("aAbc", (string) wstring::from('Abc')->ensurePrefix('a')); - $this->assertEquals("abc", (string) wstring::from('abc')->ensurePrefix('A', true)); - $this->assertEquals("Abc", (string) wstring::from('Abc')->ensurePrefix('a', true)); + $this->assertEquals($result, wstr::from($str)->endsWith($end, $ignoreCase)); } - public function testEnsureSuffix() + public function endsWithDataProvider() { - $this->assertEquals("abc", (string) wstring::from('abc')->ensureSuffix('c')); - $this->assertEquals("abcC", (string) wstring::from('abc')->ensureSuffix('C')); - $this->assertEquals("abCc", (string) wstring::from('abC')->ensureSuffix('c')); - $this->assertEquals("abc", (string) wstring::from('abc')->ensureSuffix('C', true)); - $this->assertEquals("abC", (string) wstring::from('abC')->ensureSuffix('c', true)); + return [ + ["abc", "c", true], + ["abc", "bc", true], + ["abc", "abc", true], + ["abc", "C", false], + ["abc", "Bc", false], + ["abC", "bc", false], + ["abc", "", false], + + ["ĂÂÎȘȚ", "T", false], + ["ĂÂÎȘȚ", "T", false, true], + ["ĂÂÎȘȚ", "Ț", true], + ["ĂÂÎȘȚ", "ț", false], + ["ĂÂÎȘȚ", "șț", true, true], + ]; } - public function testAppend() + /** + * @dataProvider indexOfProvider + */ + public function testIndexOf(string $str, string $needle, int $result, int $offset = 0, bool $ignoreCase = false) { - $this->assertEquals("abcdef", (string) wstring::from('abc')->append('def')); + $this->assertEquals($result, wstr::from($str)->indexOf($needle, $offset, $ignoreCase)); } - public function testPrepend() + public function indexOfProvider() { - $this->assertEquals("abcdef", (string) wstring::from('def')->prepend('abc')); + return [ + ["abc-abc", "a", 0], + ["abc-abc", "a", 4, 1], + ["abc-abc", "a", -1, 5], + ["abc-abc", "A", -1], + ["abc-abc", "A", 0, 0, true], + ["abc-abc", "A", 4, 1, true], + ["abc-abc", "A", -1, 5, true], + + ["Abc-Cba", "b", 5, -2], + ["Abc-Cba", "b", 5, -5], + ["Abc-Cba", "b", 1, -6], + ["Abc-Cba", "b", -1, -100], + + ["abcAbcabCABC", "Ab", 3], + ["abcAbcabCABC", "Ab", 0, 0, true], + ["abcAbcabCABC", "Ab", 3, 1, true], + + ["ĂÂÎȘȚ", "ÎȘ", 2], + ["ĂÂÎȘȚ", "îș", 2, 0, true], + ]; } - public function testInsert() + /** + * @dataProvider lastIndexOfDataProvider + */ + public function testLastIndexOf(string $str, string $needle, int $result, int $offset = 0, bool $ignoreCase = false) { - $this->assertEquals("x012345", (string) wstring::from('012345')->insert('x', 0)); - $this->assertEquals("x012345", (string) wstring::from('012345')->insert('x', -10)); - $this->assertEquals("012x345", (string) wstring::from('012345')->insert('x', 3)); - $this->assertEquals("0123x45", (string) wstring::from('012345')->insert('x', 4)); - $this->assertEquals("01234x5", (string) wstring::from('012345')->insert('x', 5)); - $this->assertEquals("012345x", (string) wstring::from('012345')->insert('x', 6)); - $this->assertEquals("012345x", (string) wstring::from('012345')->insert('x', 100)); + $this->assertEquals($result, wstr::from($str)->lastIndexOf($needle, $offset, $ignoreCase)); } - public function testTrim() + public function lastIndexOfDataProvider() { - $this->assertEquals("abc", (string) wstring::from(" \nabc\n\r\t \n")->trim()); + return [ + ["abacad", "a", 4], + ["abacad", "A", -1], + ["abc", "a", -1, 1], + ["abAbabABaB", "Ab", 8, 0, true], + + // strrpos() like tests + ["0123456789a123456789b123456789c", "0", 0], + ["0123456789a123456789b123456789c", "0", -1, 1], + ["0123456789a123456789b123456789c", "7", 27, 20], + ["0123456789a123456789b123456789c", "7", -1, 28], + ["0123456789a123456789b123456789c", "7", 17, -5], + ["0123456789a123456789b123456789c", "c", -1, -2], + ["0123456789a123456789b123456789c", "9c", 29, -2], + ]; } - public function testRightTrim() + /** + * @dataProvider ensurePrefixDataProvider + */ + public function testEnsurePrefix(string $str, string $prefix, string $result, bool $ignoreCase = false, bool $allow = true) { - $this->assertEquals(" \nabc", (string) wstring::from(" \nabc\n\r\t \n")->trimRight()); + $this->assertEquals($result, (string)wstr::from($str)->ensurePrefix($prefix, $ignoreCase, $allow)); } - public function testLeftTrim() + public function ensurePrefixDataProvider() { - $this->assertEquals("abc\n\r\t \n", (string) wstring::from(" \nabc\n\r\t \n")->trimLeft()); + return [ + ["abc", "id_", "id_abc"], // needs "id_" prefix + ["_abc", "id_", "id_abc"], // needs only "id" prefix + ["d_abc", "id_", "id_abc"], // needs only "i" prefix + ["id_abc", "id_", "id_abc"], // already prefixed + + ["ID_abc", "id_", "id_ID_abc"], // needs "id_" prefix ("ID_" != "id_") + ["D_abc", "id_", "iD_abc", true], // needs only "i" prefix (case insensitive) + + ["i", "id_", "id_"], // needs only "d_" suffix so the resulting string will still be prefixed with "id_" + ["id_", "id_", "id_", false, true], // the result can be just the prefix + ["id_", "id_", "id_id_", false, false], // result cannot be only the prefix + ["id_abc", "id_", "id_abc", false, false], // the resulted string is not just the prefix + + // others + ["xxx", "xxxabc", "xxxabc"], + ["abcdef", "xyz_", "xyz_abcdef"], + ]; } - public function testReplace() + /** + * @dataProvider ensureSuffixDataProvider + */ + public function testEnsureSuffix(string $str, string $suffix, string $result, bool $ignoreCase = false, bool $allow = true) { - $this->assertEquals("0x0a0", (string) wstring::from("0a0a0")->replace("a", "x")); - $this->assertEquals("0a0x0", (string) wstring::from("0a0a0")->replace("a", "x", 2)); + $this->assertEquals($result, (string)wstr::from($str)->ensureSuffix($suffix, $ignoreCase, $allow)); } - public function testReplaceWithSubjectIsNotInTheSting() + public function ensureSuffixDataProvider() { - $this->assertInstanceOf("Opis\String\UnicodeString", wstring::from("0a0a0")->replace("x", "a")); + return [ + ["abc", "_id", "abc_id"], // needs "_id" suffix + ["abc_", "_id", "abc_id"], // needs only "id" suffix + ["abc_i", "_id", "abc_id"], // needs only "d" suffix + ["abc_id", "_id", "abc_id"], // already suffixed + + ["abc_ID", "_id", "abc_ID_id"], // needs "_id" suffix ("_ID" != "_id") + ["abc_I", "_id", "abc_Id", true], // needs only "d" suffix (case insensitive) + + ["d", "_id", "_id"], // needs only "_i" prefix so the resulting string will still be suffixed with "_id" + ["_id", "_id", "_id", false, true], // the result can be just the suffix + ["_id", "_id", "_id_id", false, false], // result cannot be only the suffix + ["abc_id", "_id", "abc_id", false, false], // the resulted string is not just the suffix + + // others + + ["abc", "xxxabc", "xxxabc"], + ["abcdef", "_xyz", "abcdef_xyz"], + ]; } - public function testReplaceAll() + public function testAppend() { - $this->assertEquals("0x0x0", (string) wstring::from("0a0a0")->replaceAll("a", "x")); + $this->assertEquals("abcDEF", (string)wstr::from("abc")->append("DEF")); + $this->assertEquals("AbCdef", (string)wstr::from("AbC")->append("DeF", wstr::LOWER_CASE)); + $this->assertEquals("AbCDEF", (string)wstr::from("AbC")->append("dEf", wstr::UPPER_CASE)); } - public function testReplaceAllWithSubjectIsNotInTheSting() + public function testPrepend() { - $this->assertInstanceOf("Opis\String\UnicodeString", wstring::from("0a0a0")->replaceAll("x", "a")); + $this->assertEquals("DEFabc", (string)wstr::from("abc")->prepend("DEF")); + $this->assertEquals("defabc", (string)wstr::from("abc")->prepend("DeF", wstr::LOWER_CASE)); + $this->assertEquals("DEFabc", (string)wstr::from("abc")->prepend("dEf", wstr::UPPER_CASE)); } - public function testReverse() + /** + * @dataProvider insertDataProvider + */ + public function testInsert(string $str, string $add, int $offset, string $result, int $case = wstr::KEEP_CASE) { - $this->assertEquals("fedcba", (string) wstring::from("abcdef")->reverse()); + $this->assertEquals($result, (string)wstr::from($str)->insert($add, $offset, $case)); } - public function testRepeat() + public function insertDataProvider() { - $this->assertEquals("abcabc", (string) wstring::from("abc")->repeat()); - $this->assertEquals("abcabcabcabc", (string) wstring::from("abc")->repeat(3)); - $this->assertEquals("ăĂâÂîÎşŞţŢăĂâÂîÎşŞţŢăĂâÂîÎşŞţŢ", (string) wstring::from("ăĂâÂîÎşŞţŢ")->repeat(2)); + return [ + ["012345", "abc", 0, "abc012345"], + ["012345", "abc", 1, "0abc12345"], + ["012345", "abc", -2, "0123abc45"], + ["012345", "ABC", 0, "abc012345", wstr::LOWER_CASE], + ["012345", "abc", 0, "ABC012345", wstr::UPPER_CASE], + ]; } - public function testRepeatTimesShouldBeChangedIntoOne() + /** + * @dataProvider removeDataProvider + */ + public function testRemove(string $str, int $offset, $length, string $result) { - $this->assertEquals("abcabc", (string) wstring::from("abc")->repeat(-1)); + $this->assertEquals($result, (string)wstr::from($str)->remove($offset, $length)); } - public function testRemove() + public function removeDataProvider() { - $this->assertEquals("ÂîÎşŞţŢ", (string) wstring::from('ăĂâÂîÎşŞţŢ')->remove(0, 3)); - $this->assertEquals("ăĂâÂîÎşŞţ", (string) wstring::from('ăĂâÂîÎşŞţŢ')->remove(9, 3)); - $this->assertEquals("ăĂâÂŞţŢ", (string) wstring::from('ăĂâÂîÎşŞţŢ')->remove(4, 3)); + return [ + ["0123456789", 0, 3, "3456789"], + ["0123456789", 2, 1, "013456789"], + ["0123456789", 5, null, "01234"], + ["0123456789", -3, null, "0123456"], + ["0123456789", -3, 2, "01234569"], + ]; } - public function testRemoveIndexLengthShouldBeChangedIntoZero() + /** + * @dataProvider trimDataProvider + */ + public function testTrim(string $str, $chars, string $result) { - $this->assertEquals("ăĂâÂîÎşŞţŢ", (string) wstring::from('ăĂâÂîÎşŞţŢ')->remove(-1, -1)); + $this->assertEquals($result, (string)wstr::from($str)->trim($chars ?? " \t\n\r\0\x0B")); } - public function testPadLeft() + public function trimDataProvider() { - $this->assertEquals("xxabc", (string) wstring::from("abc")->padLeft(5, 'x')); - $this->assertEquals("xyabc", (string) wstring::from("abc")->padLeft(5, 'xyz')); - $this->assertEquals("xyzxabc", (string) wstring::from("abc")->padLeft(7, 'xyz')); - $this->assertEquals("", (string) wstring::from("abc")->padLeft(0, 'x')); - $this->assertEquals("", (string) wstring::from("abc")->padLeft(-1, 'x')); - $this->assertEquals("c", (string) wstring::from("abc")->padLeft(1, 'x')); + return array_map(function (array $v) { + return [$v[0], $v[1], $v[2]]; + }, $this->trimData()); } - public function testPadLeftEqualWithStringLength() + /** + * @dataProvider trimLeftDataProvider + */ + public function testTrimLeft(string $str, $chars, string $result) { - $this->assertInstanceOf("Opis\String\UnicodeString", wstring::from("xxabc")->padLeft(5, 'x')); + $this->assertEquals($result, (string)wstr::from($str)->trimLeft($chars ?? " \t\n\r\0\x0B")); } - public function testPadLeftWithEmptyPad() + public function trimLeftDataProvider() { - $this->assertEquals(" xxabc", (string) wstring::from("xxabc")->padLeft(6, '')); + return array_map(function (array $v) { + return [$v[0], $v[1], $v[3]]; + }, $this->trimData()); } - public function testRight() + /** + * @dataProvider trimRightDataProvider + */ + public function testTrimRight(string $str, $chars, string $result) { - $this->assertEquals("abcxx", (string) wstring::from("abc")->padRight(5, 'x')); - $this->assertEquals("abcxy", (string) wstring::from("abc")->padRight(5, 'xyz')); - $this->assertEquals("abcxyzx", (string) wstring::from("abc")->padRight(7, 'xyz')); - $this->assertEquals("", (string) wstring::from("abc")->padRight(0, 'x')); - $this->assertEquals("", (string) wstring::from("abc")->padRight(-1, 'x')); - $this->assertEquals("a", (string) wstring::from("abc")->padRight(1, 'x')); + $this->assertEquals($result, (string)wstr::from($str)->trimRight($chars ?? " \t\n\r\0\x0B")); } - public function testSplit() + public function trimRightDataProvider() { - $map = function($value){ - return (string) $value; - }; - $split = function($text, $char = '') use($map){ - return array_map($map, wstring::from($text)->split($char)); - }; - - $this->assertEquals(array('a', 'b', 'c'), $split('a|b|c', '|')); - $this->assertEquals(array('', 'a', 'b', 'c'), $split('|a|b|c', '|')); - $this->assertEquals(array('', 'a', 'b', 'c', '', ''), $split('|a|b|c||', '|')); - $this->assertEquals(array('|a|b|c', ''), $split('|a|b|c||', '||')); - $this->assertEquals(array('a|b|c'), $split('a|b|c', '#')); - $this->assertEquals(array('a', 'b', 'c'), $split('abc')); + return array_map(function (array $v) { + return [$v[0], $v[1], $v[4]]; + }, $this->trimData()); } - public function testSubstring() + public function trimData() { - $this->assertEquals('abc', wstring::from('abcdef')->substring(0, 3)); - $this->assertEquals('def', wstring::from('abcdef')->substring(3, 3)); - $this->assertEquals('def', wstring::from('abcdef')->substring(3)); - $this->assertEquals('abcdef', wstring::from('abcdef')->substring(0)); + return [ + //["str", "chars", "trim", "ltrim", "rtrim"] + [" abc ", null, "abc", "abc ", " abc"], + ["abcxd", "xy", "abcxd", "abcxd", "abcxd"], + ["yyabcxdxyxyxy", "xy", "abcxd", "abcxdxyxyxy", "yyabcxd"], + ["ĂAAAĂAAAĂ", "ĂA", "", "", ""], + ["ĂAAAxĂyAAAĂ", "ĂA", "xĂy", "xĂyAAAĂ", "ĂAAAxĂy"], + ]; } - public function testIsCase() + public function testReverse() { - $this->assertTrue(wstring::from('abcd')->isLowerCase()); - $this->assertFalse(wstring::from('abCd')->isLowerCase()); - $this->assertTrue(wstring::from('ABCD')->isUpperCase()); - $this->assertFalse(wstring::from('ABcD')->isUpperCase()); + $this->assertEquals("ZzȚțȘșÎîÂâĂă", (string)wstr::from("ăĂâÂîÎșȘțȚzZ")->reverse()); } - public function testToCase() + public function testRepeat() { - $this->assertEquals('ABC', wstring::from('abc')->toUpper()); - $this->assertEquals('ABC', wstring::from('aBc')->toUpper()); - $this->assertEquals('abc', wstring::from('ABC')->toLower()); - $this->assertEquals('abc', wstring::from('AbC')->toLower()); + $this->assertEquals("abcabcabc", (string)wstr::from("abc")->repeat(3)); } - public function testToLowerWithIsLowerCache() + /** + * @dataProvider replaceDataProvider + */ + public function testReplace(string $str, string $subject, string $replace, string $result, int $offset = 0, bool $ignoreCase = false) { - $wstr = new wstring(array('UTF-8'), array('abc')); - $wstr->isLowerCase(); - $this->assertInstanceOf("Opis\String\UnicodeString", $wstr->toLower()); + $this->assertEquals($result, (string)wstr::from($str)->replace($subject, $replace, $offset, $ignoreCase)); } - public function testToUpperWithIsUpperCache() + public function replaceDataProvider() { - $wstr = new wstring(array('UTF-8'), array('abc')); - $wstr->isUpperCase(); - $this->assertInstanceOf("Opis\String\UnicodeString", $wstr->toUpper()); + return [ + ["abcdabcd", "bc", "", "adabcd"], + ["abcdabcd", "bc", "x", "axdabcd"], + ["abcdabcd", "bc", "xy", "axydabcd"], + ["abcdabcd", "bc", "xyz", "axyzdabcd"], + ["abcdabcd", "bc", "XYZ", "abcdaXYZd", 3], + ["abcdabcd", "bc", "XYZ", "abcdaXYZd", -4], + ["abcdabcd", "bc", "XYZ", "abcdabcd", 6], + + ["aBcAbC", "bC", "XX", "aBcAXX"], + ["aBcAbC", "bC", "XX", "aXXAbC", 0, true], + ["aBcAbC", "bC", "XX", "aBcAXX", 2, true], + ["aBcAbC", "bC", "XX", "aBcAXX", -2, true], + ["aBcAbC", "bC", "XX", "aBcAbC", -1, true], + + ["ăĂâÂîÎșȘțȚzZ", "Î", "X", "ăĂâÂîXșȘțȚzZ"], + ["ăĂâÂîÎșȘțȚzZ", "Î", "X", "ăĂâÂXÎșȘțȚzZ", 0, true], + ]; } - public function testToAscii() + /** + * @dataProvider replaceAllDataProvider + */ + public function testReplaceAll(string $str, string $subject, string $replace, string $result, bool $ignoreCase = false, int $offset = 0) { - $this->assertEquals("aAaAiIsStT", wstring::from("ăĂâÂîÎşŞţŢ")->toAscii()); + $this->assertEquals($result, (string)wstr::from($str)->replaceAll($subject, $replace, $ignoreCase, $offset)); } - public function testToAsciiWithIsAsciiCache() + public function replaceAllDataProvider() { - $wstr = new wstring(array('UTF-8'), array('abc')); - $wstr->isAscii(); - $this->assertInstanceOf("Opis\String\UnicodeString", $wstr->toAscii()); + return [ + ["AabcaAa", "a", "X", "AXbcXAX"], + ["AabcaAa", "a", "X", "XXbcXXX", true], + ["aaa", "a", "X", "aXX", false, 1], + ["aaa", "a", "X", "aaX", false, -1], + ["Aaa", "a", "", "A"], + + ["ăĂâÂîÎșȘțȚzZ", "Î", "X", "ăĂâÂîXșȘțȚzZ"], + ["ăĂâÂîÎșȘțȚzZ", "Î", "X", "ăĂâÂXXșȘțȚzZ", true], + + ["aîÎb", "Îî", "X", "aîÎb"], + ["aîÎb", "Îî", "X", "aXb", true], + ["aîÎb", "Îî", "X", "aîÎb", true, 2], + ]; } - public function testIsAscii() + /** + * @dataProvider splitDataProvider + */ + public function testSplit(string $str, string $delimiter, array $result, bool $ignoreCase = false) { - $this->assertTrue(wstring::from('abcde')->isAscii()); - $this->assertFalse(wstring::from('abcîÎşa')->isAscii()); + $this->assertEquals($result, array_map('strval', wstr::from($str)->split($delimiter, $ignoreCase))); } - public function testIsAsciiWithCache() + public function splitDataProvider() { - $wstr = new wstring(array('UTF-8'), array('abc')); - $wstr->isAscii(); - $this->assertTrue($wstr->isAscii()); + return [ + ["ȚabcȘ", "", ["Ț", "a", "b", "c", "Ș"]], + ["a-b-c", "-", ["a", "b", "c"]], + ["aXbxcXd", "x", ["aXb", "cXd"]], + ["aXbxcXd", "x", ["a", "b", "c", "d"], true], + + ["a", "a", ["", ""]], + ["ab", "a", ["", "b"]], + ["ba", "a", ["b", ""]], + ["aba", "a", ["", "b", ""]], + ["aaa", "a", ["", "", "", ""]], + + ["xîÎx", "Îî", ["xîÎx"]], + ["xîÎx", "Îî", ["x", "x"], true], + ]; } - public function testStringWithExistedCharacter() + /** + * @dataProvider substringDataProvider + */ + public function testSubstring(string $str, int $offset, $length, string $result) { - $wstr = new wstring(array('abcd'), array('bcd')); - $this->assertTrue(isset($wstr[0])); + $this->assertEquals($result, (string)wstr::from($str)->substring($offset, $length)); } - public function testStringWithChars() + public function substringDataProvider() { - $wstr = new wstring(array('abcd'), array('bcd')); - $this->assertEquals(array('bcd'), $wstr->chars()); + return [ + ["0123456789", 0, null, "0123456789"], + ["0123456789", 4, null, "456789"], + ["0123456789", 4, 3, "456"], + ["abcdef", -1, null, "f"], + ["abcdef", -2, null, "ef"], + ["abcdef", -3, 1, "d"], + ["abcdef", 0, -1, "abcde"], + ["abcdef", 2, -1, "cde"], + ["abcdef", 4, -4, ""], + ["abcdef", -3, -1, "de"], + + ["ăĂâÂîÎșȘțȚ", 2, 4, "âÂîÎ"], + ]; } - public function testStringWithCodePoints() + /** + * @dataProvider padDataProvider + */ + public function testPad(string $str, int $size, $char, string $left, string $right) { - $wstr = new wstring(array('abcd'), array('bcd')); - $this->assertEquals(array('abcd'), $wstr->codePoints()); + $str = wstr::from($str); + + $this->assertEquals($left, (string)$str->pad(-$size, $char)); + $this->assertEquals($right, (string)$str->pad($size, $char)); + + $this->assertEquals($left, (string)$str->padLeft($size, $char)); + + $this->assertEquals($right, (string)$str->padRight($size, $char)); } - public function testStringOffsetChar() + public function padDataProvider() { - $wstr = new wstring(array('abcd'), array('bcd')); - $this->assertEquals('abcd', $wstr(0)); + return [ + ["abc", 6, "x", "xxxabc", "abcxxx"], + ["abc", 3, "x", "abc", "abc"], + ["abc", 5, "xy", "xxabc", "abcxx"], // only first char is taken + + ["123", 5, "0", "00123", "12300"], + ["", 3, "Ț", "ȚȚȚ", "ȚȚȚ"], + ]; } /** - * @expectedException \Exception - * @expectedExceptionMessage Invalid operation + * @dataProvider indexAccessDataProvider */ - public function testSetStringShouldReturnInvalidOperation() + public function testIndexAccess(string $str, int $index, int $codePoint, string $char) { - $wstr = new wstring(array('abcd'), array('bcd')); - $wstr[] = 'a'; + $str = wstr::from($str); + + $this->assertEquals($codePoint, $str->codePointAt($index)); + $this->assertEquals($char, $str->charAt($index)); + + if ($codePoint === -1) { + try { + $str($index); + $this->assertTrue(false, "Invalid code point index"); + } catch (OutOfBoundsException $e) { + $this->assertTrue(true); + } + } else { + $this->assertEquals($codePoint, $str($index)); + } + + if ($char === '') { + $this->assertFalse(isset($str[$index])); + try { + $str[$index]; + $this->assertTrue(false, "Invalid char index"); + } catch (OutOfBoundsException $e) { + $this->assertTrue(true); + } + } else { + $this->assertTrue(isset($str[$index])); + $this->assertEquals($char, $str[$index]); + } } - /** - * @expectedException \Exception - * @expectedExceptionMessage Invalid operation - */ - public function testUnsetStringShouldReturnInvalidOperation() + public function indexAccessDataProvider() { - $wstr = new wstring(array('abcd'), array('bcd')); - unset($wstr[0]); + return [ + ["abcd", 1, 0x62, "b"], + ["abcd", -2, 0x63, "c"], + ["abcd", 5, -1, ""], + ["abcd", -6, -1, ""], + + ["ăĂâÂîÎșȘțȚ", 0, 0x103, "ă"], + ["ăĂâÂîÎșȘțȚ", 4, 0xEE, "î"], + ["ăĂâÂîÎșȘțȚ", -4, 0x219, "ș"], + ["ăĂâÂîÎșȘțȚ", -1, 0x21A, "Ț"], + ]; } - /** - * @expectedException \Exception - * @expectedExceptionMessage Could not convert string from 'error_encoding' encoding to UTF-8 encoding - */ - public function testFromStringWithInvalidEncoding() + public function testArrayLike() + { + $str = wstr::from("abc"); + $this->assertEquals(3, count($str)); + + + $str->isLowerCase(); // just build cache + $str[1] = "Ș"; + + $this->assertEquals("aȘc", (string)$str); + $this->assertFalse($str->isLowerCase()); // check if cache is rebuild + + $str[-1] = "Ț"; + $this->assertEquals("aȘȚ", (string)$str); + + // only first char + $str[0] = "Îabc"; + $this->assertEquals("ÎȘȚ", (string)$str); + + // no change + $str[1] = ""; + $this->assertEquals("ÎȘȚ", (string)$str); + + // cannot unset + $this->expectException(RuntimeException::class); + unset($str[1]); + } + + + public function testIsCase() { - $wstr = wstring::from('abcd', 'error_encoding'); + $this->assertTrue(wstr::from('abcd')->isLowerCase()); + $this->assertFalse(wstr::from('abCd')->isLowerCase()); + $this->assertTrue(wstr::from('ABCD')->isUpperCase()); + $this->assertFalse(wstr::from('ABcD')->isUpperCase()); + + $this->assertTrue(wstr::from('țș@îâ#ă')->isLowerCase()); + $this->assertTrue(wstr::from('ȚȘ@ÎÂ#Ă')->isUpperCase()); + + $this->assertFalse(wstr::from('Țș@îâ#ă')->isLowerCase()); + $this->assertFalse(wstr::from('țȘ@ÎÂ#Ă')->isUpperCase()); + } - public function testFromStringWithE0Character() + public function testToCase() { - $this->assertEquals("\xE0\xE0\xE0", (string) wstring::from("\xE0\xE0\xE0")->replace("E", "x")); + $this->assertEquals('ABC', (string)wstr::from('abc')->toUpper()); + $this->assertEquals('ABC', (string)wstr::from('aBc')->toUpper()); + $this->assertEquals('ȚȘ@ÎÂ#Ă', (string)wstr::from('țș@îâ#ă')->toUpper()); + + $this->assertEquals('abc', (string)wstr::from('ABC')->toLower()); + $this->assertEquals('abc', (string)wstr::from('AbC')->toLower()); + $this->assertEquals('țș@îâ#ă', (string)wstr::from('ȚȘ@ÎÂ#Ă')->toLower()); } - public function testFromStringWithF0Character() + public function testIsAscii() { - $this->assertEquals("\xF0\xF0\xF0\xF0", (string) wstring::from("\xF0\xF0\xF0\xF0")->replace("F", "x")); + $this->assertTrue(wstr::from("abc")->isAscii()); + $this->assertFalse(wstr::from("abcț")->isAscii()); } /** - * @expectedException \Exception - * @expectedExceptionMessage Invalid UTF-8 string + * @dataProvider toAsciiDataProvider */ - public function testFromStringWithInvalidUtf8String() + public function testToAscii(string $str, string $result) { - wstring::from("\xA0\xA0\xA0\xA0"); + $this->assertEquals($result, (string)wstr::from($str)->toAscii()); } + public function toAsciiDataProvider() + { + return [ + ["ăĂâÂîÎșȘțȚ", "aAaAiIsStT"], + ]; + } } From 4ce3d26393a148eee0efc3944e2361eee2d56744 Mon Sep 17 00:00:00 2001 From: Sorin Sarca Date: Wed, 6 May 2020 21:38:10 +0300 Subject: [PATCH 02/20] Updated --- src/UnicodeString.php | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/src/UnicodeString.php b/src/UnicodeString.php index 8e679e4..15d3bfa 100644 --- a/src/UnicodeString.php +++ b/src/UnicodeString.php @@ -1380,6 +1380,10 @@ public static function isValidChar(string $char): bool $length = strlen($char); + if ($length > 4) { + return false; + } + if (self::getNextCodePoint($char, $length, 0, $used_len) >= 0) { return $length === $used_len; } From 1d65668d7beca543fe12834e5ae028fbb2c55fc2 Mon Sep 17 00:00:00 2001 From: Sorin Sarca Date: Wed, 6 May 2020 22:46:06 +0300 Subject: [PATCH 03/20] Updated --- phpunit.xml | 5 - src/Exception/InvalidCharException.php | 46 --- src/UnicodeString.php | 459 ++++++------------------- 3 files changed, 97 insertions(+), 413 deletions(-) delete mode 100644 src/Exception/InvalidCharException.php diff --git a/phpunit.xml b/phpunit.xml index da46aa0..c239f02 100644 --- a/phpunit.xml +++ b/phpunit.xml @@ -6,9 +6,4 @@ ./tests - - - src/ - - diff --git a/src/Exception/InvalidCharException.php b/src/Exception/InvalidCharException.php deleted file mode 100644 index 117dd4d..0000000 --- a/src/Exception/InvalidCharException.php +++ /dev/null @@ -1,46 +0,0 @@ -char = $char; - } - - /** - * @return mixed - */ - public function char() - { - return $this->char; - } -} diff --git a/src/UnicodeString.php b/src/UnicodeString.php index 15d3bfa..4467bc8 100644 --- a/src/UnicodeString.php +++ b/src/UnicodeString.php @@ -23,7 +23,6 @@ use Serializable, JsonSerializable; use Opis\String\Exception\{ UnicodeException, - InvalidCharException, InvalidStringException, InvalidCodePointException }; @@ -1124,27 +1123,6 @@ public static function fromCodePoints(array $codes, int $mode = self::KEEP_CASE) return new static(array_values($codes)); } - /** - * Creates an unicode string instance from chars - * @param string[] $chars - * @param int $mode - * @return static - */ - public static function fromChars(array $chars, int $mode = self::KEEP_CASE): self - { - return new static(self::getCodePointsFromChars($chars, $mode)); - } - - /** - * Converts the char to corresponding code point - * @param string $char - * @return int Code point or -1 if char is invalid - */ - public static function getCodePointFromChar(string $char): int - { - return self::getNextCodePoint($char, strlen($char)); - } - /** * Converts the code point to corresponding char * @param int $code @@ -1204,84 +1182,112 @@ public static function getCharFromCodePoint(int $code): string */ public static function getCodePointsFromString(string $str, int $mode = self::KEEP_CASE): array { - $i = 0; + // 0x00-0x7F + // 0xC2-0xDF 0x80-0xBF + // 0xE0-0xE0 0xA0-0xBF 0x80-0xBF + // 0xE1-0xEC 0x80-0xBF 0x80-0xBF + // 0xED-0xED 0x80-0x9F 0x80-0xBF + // 0xEE-0xEF 0x80-0xBF 0x80-0xBF + // 0xF0-0xF0 0x90-0xBF 0x80-0xBF 0x80-0xBF + // 0xF1-0xF3 0x80-0xBF 0x80-0xBF 0x80-0xBF + // 0xF4-0xF4 0x80-0x8F 0x80-0xBF 0x80-0xBF + $codes = []; - $used_len = 0; $length = strlen($str); + $mode = self::getMapByMode($mode); - if ($mode === self::KEEP_CASE) { - while ($i < $length) { - $code = self::getNextCodePoint($str, $length, $i, $used_len); - if ($code >= 0) { - $codes[] = $code; - $i += $used_len; - } else { - throw new InvalidStringException($str, $i + $used_len - 1); - } + $i = 0; + while ($i < $length) { + $ord0 = ord($str[$i++]); + + if ($ord0 < 0x80) { + $codes[] = $mode[$ord0] ?? $ord0; + continue; } - } else { - $mode = self::getMapByMode($mode); - while ($i < $length) { - $code = self::getNextCodePoint($str, $length, $i, $used_len); - if ($code >= 0) { - $codes[] = $mode[$code] ?? $code; - $i += $used_len; - } else { - throw new InvalidStringException($str, $i + $used_len - 1); + + if ($i === $length || $ord0 < 0xC2 || $ord0 > 0xF4) { + throw new InvalidStringException($str, $i - 1); + } + + $ord1 = ord($str[$i++]); + + if ($ord0 < 0xE0) { + if ($ord1 < 0x80 || $ord1 >= 0xC0) { + throw new InvalidStringException($str, $i - 1); } + + $ord1 = ($ord0 - 0xC0) * 64 + $ord1 - 0x80; + $codes[] = $mode[$ord1] ?? $ord1; + + continue; } - } - return $codes; - } + if ($i === $length) { + throw new InvalidStringException($str, $i - 1); + } - /** - * Convert string to a char array - * @param string $str - * @return array - * @throws InvalidStringException - */ - public static function getCharsFromString(string $str): array - { - $i = 0; - $chars = []; - $used_len = 0; - $length = strlen($str); + $ord2 = ord($str[$i++]); + + if ($ord0 < 0xF0) { + if ($ord0 === 0xE0) { + if ($ord1 < 0xA0 || $ord1 >= 0xC0) { + throw new InvalidStringException($str, $i - 2); + } + } elseif ($ord0 === 0xED) { + if ($ord1 < 0x80 || $ord1 >= 0xA0) { + throw new InvalidStringException($str, $i - 2); + } + } elseif ($ord1 < 0x80 || $ord1 >= 0xC0) { + throw new InvalidStringException($str, $i - 2); + } - while ($i < $length) { - $char = self::getNextChar($str, $length, $i, $used_len); - if ($char !== '') { - $chars[] = $char; - $i += $used_len; - } else { - throw new InvalidStringException($str, $i + $used_len - 1); + if ($ord2 < 0x80 || $ord2 >= 0xC0) { + throw new InvalidStringException($str, $i - 1); + } + + $ord2 = ($ord0 - 0xE0) * 0x1000 + ($ord1 - 0x80) * 64 + $ord2 - 0x80; + $codes[] = $mode[$ord2] ?? $ord2; + + continue; } - } - return $chars; - } + if ($i === $length) { + throw new InvalidStringException($str, $i - 1); + } - /** - * Converts each char to a code point - * @param array $chars - * @param int $mode - * @return array - * @throws InvalidCharException - */ - public static function getCodePointsFromChars(array $chars, int $mode = self::KEEP_CASE): array - { - $mode = self::getMapByMode($mode); + $ord3 = ord($str[$i++]); + + if ($ord0 < 0xF5) { + if ($ord0 === 0xF0) { + if ($ord1 < 0x90 || $ord1 >= 0xC0) { + throw new InvalidStringException($str, $i - 3); + } + } elseif ($ord0 === 0xF4) { + if ($ord1 < 0x80 || $ord1 >= 0x90) { + throw new InvalidStringException($str, $i - 3); + } + } elseif ($ord1 < 0x80 || $ord1 >= 0xC0) { + throw new InvalidStringException($str, $i - 3); + } - foreach ($chars as &$char) { - $code = self::getCodePointFromChar($char); - if ($code === -1) { - throw new InvalidCharException($char); - } else { - $char = $mode[$code] ?? $code; + if ($ord2 < 0x80 || $ord2 >= 0xC0) { + throw new InvalidStringException($str, $i - 2); + } + + if ($ord3 < 0x80 || $ord3 >= 0xC0) { + throw new InvalidStringException($str, $i - 1); + } + + $ord3 = ($ord0 - 0xF0) * 0x40000 + ($ord1 - 0x80) * 0x1000 + ($ord2 - 0x80) * 64 + $ord3 - 0x80; + $codes[] = $mode[$ord3] ?? $ord3; + + continue; } + + throw new InvalidStringException($str, $i - 1); } - return $chars; + return $codes; } /** @@ -1319,16 +1325,6 @@ public static function getStringFromCodePoints(array $codes, int $mode = self::K return implode('', self::getCharsFromCodePoints($codes, $mode)); } - /** - * Concatenates all chars - * @param array $chars - * @return string - */ - public static function getStringFromChars(array $chars): string - { - return implode('', $chars); - } - /** * @param array $codes * @param int $mode @@ -1367,268 +1363,6 @@ public static function isValidCodePoint(int $code): bool return $code < 0xD800 || $code > 0xDFFF; } - /** - * Checks if a char is valid - * @param string $char - * @return bool - */ - public static function isValidChar(string $char): bool - { - if ($char === '') { - return false; - } - - $length = strlen($char); - - if ($length > 4) { - return false; - } - - if (self::getNextCodePoint($char, $length, 0, $used_len) >= 0) { - return $length === $used_len; - } - - return false; - } - - /** - * Internal function used to get next code point from string - * @param string $char - * @param int $length - * @param int $offset - * @param int|null $used_len - * @return int - */ - protected static function getNextCodePoint(string &$char, int $length, int $offset = 0, int &$used_len = null): int - { - $used_len = 0; - $length -= $offset; - - if ($length < 1) { - return -1; - } - - // 0x00-0x7F - $used_len = 1; - $ord0 = ord($char[$offset]); - - if ($ord0 < 0x80) { - return $ord0; - } elseif ($length < 2) { - return -1; - } - - // 0xC2-0xDF 0x80-0xBF - - if ($ord0 < 0xC2) { - return -1; - } - - $used_len = 2; - $ord1 = ord($char[$offset + 1]); - - if ($ord0 < 0xE0) { - if ($ord1 < 0x80 || $ord1 >= 0xC0) { - return -1; - } - - return ($ord0 - 0xC0) * 64 + $ord1 - 0x80; - } elseif ($length < 3) { - return -1; - } - - // 0xE0-0xE0 0xA0-0xBF 0x80-0xBF - // 0xE1-0xEC 0x80-0xBF 0x80-0xBF - // 0xED-0xED 0x80-0x9F 0x80-0xBF - // 0xEE-0xEF 0x80-0xBF 0x80-0xBF - - $used_len = 3; - $ord2 = ord($char[$offset + 2]); - - if ($ord0 < 0xF0) { - if ($ord0 === 0xE0) { - if ($ord1 < 0xA0 || $ord1 >= 0xC0) { - $used_len = 2; - return -1; - } - } elseif ($ord0 === 0xED) { - if ($ord1 < 0x80 || $ord1 >= 0xA0) { - $used_len = 2; - return -1; - } - } elseif ($ord1 < 0x80 || $ord1 >= 0xC0) { - $used_len = 2; - return -1; - } - - if ($ord2 < 0x80 || $ord2 >= 0xC0) { - return -1; - } - - return ($ord0 - 0xE0) * 0x1000 + ($ord1 - 0x80) * 64 + $ord2 - 0x80; - } elseif ($length < 4) { - return -1; - } - - // 0xF0-0xF0 0x90-0xBF 0x80-0xBF 0x80-0xBF - // 0xF1-0xF3 0x80-0xBF 0x80-0xBF 0x80-0xBF - // 0xF4-0xF4 0x80-0x8F 0x80-0xBF 0x80-0xBF - - $used_len = 4; - $ord3 = ord($char[$offset + 3]); - - if ($ord0 < 0xF5) { - if ($ord0 === 0xF0) { - if ($ord1 < 0x90 || $ord1 >= 0xC0) { - $used_len = 2; - return -1; - } - } elseif ($ord0 === 0xF4) { - if ($ord1 < 0x80 || $ord1 >= 0x90) { - $used_len = 2; - return -1; - } - } elseif ($ord1 < 0x80 || $ord1 >= 0xC0) { - $used_len = 2; - return -1; - } - - if ($ord2 < 0x80 || $ord2 >= 0xC0) { - $used_len = 3; - return -1; - } - - if ($ord3 < 0x80 || $ord3 >= 0xC0) { - return -1; - } - - return ($ord0 - 0xF0) * 0x40000 + ($ord1 - 0x80) * 0x1000 + ($ord2 - 0x80) * 64 + $ord3 - 0x80; - } - - $used_len = 1; - - return -1; - } - - /** - * Internal function used to get next char from string - * @param string $char - * @param int $length - * @param int $offset - * @param int|null $used_len - * @return string - */ - protected static function getNextChar(string &$char, int $length, int $offset = 0, int &$used_len = null): string - { - $used_len = 0; - $length -= $offset; - - if ($length < 1) { - return ''; - } - - // 0x00-0x7F - $used_len = 1; - $ord0 = ord($char[$offset]); - - if ($ord0 < 0x80) { - return $char[$offset]; - } elseif ($length < 2) { - return ''; - } - - // 0xC2-0xDF 0x80-0xBF - - if ($ord0 < 0xC2) { - return ''; - } - - $used_len = 2; - $ord1 = ord($char[$offset + 1]); - - if ($ord0 < 0xE0) { - if ($ord1 < 0x80 || $ord1 >= 0xC0) { - return ''; - } - - return $char[$offset] . $char[$offset + 1]; - } elseif ($length < 3) { - return ''; - } - - // 0xE0-0xE0 0xA0-0xBF 0x80-0xBF - // 0xE1-0xEC 0x80-0xBF 0x80-0xBF - // 0xED-0xED 0x80-0x9F 0x80-0xBF - // 0xEE-0xEF 0x80-0xBF 0x80-0xBF - - $used_len = 3; - $ord2 = ord($char[$offset + 2]); - - if ($ord0 < 0xF0) { - if ($ord0 === 0xE0) { - if ($ord1 < 0xA0 || $ord1 >= 0xC0) { - $used_len = 2; - return ''; - } - } elseif ($ord0 === 0xED) { - if ($ord1 < 0x80 || $ord1 >= 0xA0) { - $used_len = 2; - return ''; - } - } elseif ($ord1 < 0x80 || $ord1 >= 0xC0) { - $used_len = 2; - return ''; - } - - if ($ord2 < 0x80 || $ord2 >= 0xC0) { - return ''; - } - - return $char[$offset] . $char[$offset + 1] . $char[$offset + 2]; - } elseif ($length < 4) { - return ''; - } - - // 0xF0-0xF0 0x90-0xBF 0x80-0xBF 0x80-0xBF - // 0xF1-0xF3 0x80-0xBF 0x80-0xBF 0x80-0xBF - // 0xF4-0xF4 0x80-0x8F 0x80-0xBF 0x80-0xBF - - $used_len = 4; - $ord3 = ord($char[$offset + 3]); - - if ($ord0 < 0xF5) { - if ($ord0 === 0xF0) { - if ($ord1 < 0x90 || $ord1 >= 0xC0) { - $used_len = 2; - return ''; - } - } elseif ($ord0 === 0xF4) { - if ($ord1 < 0x80 || $ord1 >= 0x90) { - $used_len = 2; - return ''; - } - } elseif ($ord1 < 0x80 || $ord1 >= 0xC0) { - $used_len = 2; - return ''; - } - - if ($ord2 < 0x80 || $ord2 >= 0xC0) { - $used_len = 3; - return ''; - } - - if ($ord3 < 0x80 || $ord3 >= 0xC0) { - return ''; - } - - return $char[$offset] . $char[$offset + 1] . $char[$offset + 2] . $char[$offset + 3]; - } - - $used_len = 1; - - return ''; - } - /** * @param string|self|int[]|string[] $text * @param int $mode @@ -1644,10 +1378,9 @@ protected static function resolveCodePoints($text, int $mode = self::KEEP_CASE): return self::getCodePointsFromString($text, $mode); } - if (is_array($text) && $text) { - return is_int($text[0]) - ? self::getMappedCodePoints($text, $mode) - : self::getCodePointsFromChars($text, $mode); + if ($text && is_array($text) && is_int($text[0])) { + // assume code point array + return self::getMappedCodePoints($text, $mode); } return []; @@ -1672,8 +1405,10 @@ protected static function resolveFirstCodePoint($text, int $invalid = -1): int } if (is_string($text)) { - $text = self::getNextCodePoint($text, strlen($text)); - return $text === -1 ? $invalid : $text; + if (isset($text[4])) { + $text = substr($text, 0, 4); + } + return self::getCodePointsFromString($text)[0] ?? $invalid; } if (is_int($text)) { From ba1edc970c6db6806fc6ab38a659814fd871c408 Mon Sep 17 00:00:00 2001 From: Sorin Sarca Date: Wed, 6 May 2020 23:58:31 +0300 Subject: [PATCH 04/20] Updated --- src/UnicodeString.php | 44 +++++++++++++++++++++++++++++++++++++++++-- 1 file changed, 42 insertions(+), 2 deletions(-) diff --git a/src/UnicodeString.php b/src/UnicodeString.php index 4467bc8..481d881 100644 --- a/src/UnicodeString.php +++ b/src/UnicodeString.php @@ -922,7 +922,7 @@ public function count() public function __toString(): string { if ($this->str === null) { - $this->str = implode('', $this->chars()); + $this->str = self::getStringFromCodePoints($this->codes); } return $this->str; @@ -1322,7 +1322,47 @@ public static function getCharsFromCodePoints(array $codes, int $mode = self::KE */ public static function getStringFromCodePoints(array $codes, int $mode = self::KEEP_CASE): string { - return implode('', self::getCharsFromCodePoints($codes, $mode)); + $str = ''; + + $mode = self::getMapByMode($mode); + + foreach ($codes as $code) { + if (isset($mode[$code])) { + $code = $mode[$code]; + } + + if ($code < 0x80) { + $str .= chr($code); + continue; + } + + if ($code < 0x800) { + $str .= chr(($code >> 6) + 0xC0) . chr(($code & 0x3F) + 0x80); + continue; + } + + if ($code >= 0xD800 && $code <= 0xDFFF) { + continue; + } + + if ($code <= 0xFFFF) { + $str .= + chr(($code >> 12) + 0xE0) . + chr((($code >> 6) & 0x3F) + 0x80) . + chr(($code & 0x3F) + 0x80); + continue; + } + + if ($code <= 0x10FFFF) { + $str .= + chr(($code >> 18) + 0xF0) . + chr((($code >> 12) & 0x3F) + 0x80) . + chr((($code >> 6) & 0x3F) + 0x80) . + chr(($code & 0x3F) + 0x80); + } + } + + return $str; } /** From 44fd49ab4157dee60c488bee2d3c96c276c73a52 Mon Sep 17 00:00:00 2001 From: Marius Sarca Date: Wed, 3 Jun 2020 19:02:52 +0300 Subject: [PATCH 05/20] Updated --- .gitattributes | 1 - .github/workflows/tests.yml | 40 +++++ .travis.yml | 18 --- CHANGELOG.md | 81 +--------- README.md | 22 +-- composer.json | 8 +- src/UnicodeString.php | 292 +++++++++++++++++------------------- 7 files changed, 197 insertions(+), 265 deletions(-) create mode 100644 .github/workflows/tests.yml delete mode 100644 .travis.yml diff --git a/.gitattributes b/.gitattributes index 349f6a0..cbfb7f2 100644 --- a/.gitattributes +++ b/.gitattributes @@ -2,4 +2,3 @@ tests/ export-ignore phpunit.xml export-ignore .gitattributes export-ignore .gitignore export-ignore -.travis.yml export-ignore diff --git a/.github/workflows/tests.yml b/.github/workflows/tests.yml new file mode 100644 index 0000000..884dfca --- /dev/null +++ b/.github/workflows/tests.yml @@ -0,0 +1,40 @@ +name: "Tests" +on: + push: + paths-ignore: + - '**.md' + pull_request: + paths-ignore: + - '**.md' +jobs: + tests: + runs-on: ubuntu-latest + strategy: + fail-fast: true + matrix: + php: [7.4] + + name: PHP ${{ matrix.php }} + + steps: + - name: Checkout code + uses: actions/checkout@v2 + + - name: Cache dependencies + uses: actions/cache@v1 + with: + path: ~/.composer/cache/files + key: dependencies-php-${{ matrix.php }}-composer-${{ hashFiles('composer.json') }} + + - name: Setup PHP + uses: shivammathur/setup-php@v2 + with: + php-version: ${{ matrix.php }} + extensions: json, iconv + coverage: none + + - name: Install dependencies + run: composer update --${{ matrix.stability }} --prefer-dist --no-interaction --no-progress + + - name: Execute tests + run: vendor/bin/phpunit --verbose diff --git a/.travis.yml b/.travis.yml deleted file mode 100644 index 6ce6f9c..0000000 --- a/.travis.yml +++ /dev/null @@ -1,18 +0,0 @@ -language: php - -matrix: - include: - - php: '7.0' - - php: '7.1' - - php: '7.2' - - php: '7.3' - - php: '7.4' - fast_finish: true - -sudo: false - -install: - - travis_retry composer self-update - - travis_wait composer install --no-interaction --prefer-source - -script: ./vendor/bin/phpunit diff --git a/CHANGELOG.md b/CHANGELOG.md index 80a92ce..d4fb672 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,79 +1,6 @@ -## v1.5.0 - 2018.09.04 -### Removed -- Support for PHP 5.x +CHANGELOG +------------- -### Added -- Type hints +### v2020, unreleased -### Changed --Targeted PHP version is ^7.0 - -## v1.4.0 - 2016.08.10 -### Added -- `ensurePrefix` and `ensureSuffix` methods - -### Removed -- Nothing - -### Changed -- Nothing - -### Fixed -- Nothing - -## v1.3.0 - 2016.08.10 -### Added -- `insert` method -- `remove` method -- `padLeft` and `padRight` methods - -### Removed -- Nothing - -### Changed -- Nothing - -### Fixed -- Nothing - -## v1.2.0 - 2016.08.08 -### Added -- `repeat` method - -### Removed -- Nothing - -### Changed -- Improved `equals` method -- Improved `indexOf` and `lastIndexOf` methods - -### Fixed -- Nothing - -## v1.1.1 - 2016.08.08 -### Added -- Nothing - -### Removed -- Nothing - -### Changed -- UTF-8 parsing algorithm inside `Opis\String\UnicodeString::from` method - -### Fixed -- Nothing - -## v1.1.0 - 2016.08.08 -### Added -- Support for multiple encodings. -- The `Opis\String\UnicodeString::from` method takes now an optional -`$encoding` argument. - -### Removed -- Nothing - -### Changed -- Nothing - -### Fixed -- Nothing +* The library was fully refactored diff --git a/README.md b/README.md index 4037993..11464fe 100644 --- a/README.md +++ b/README.md @@ -1,27 +1,29 @@ Opis String =========== -[![Build Status](https://travis-ci.org/opis/string.svg?branch=master)](https://travis-ci.org/opis/string) +[![Tests](https://github.com/opis/string/workflows/Tests/badge.svg)](https://github.com/opis/string/actions) [![Latest Stable Version](https://poser.pugx.org/opis/string/version.png)](https://packagist.org/packages/opis/string) [![Latest Unstable Version](https://poser.pugx.org/opis/string/v/unstable.png)](https://packagist.org/packages/opis/string) [![License](https://poser.pugx.org/opis/string/license.png)](https://packagist.org/packages/opis/string) -Manipulate multibyte strings +Multibyte strings ---------------------------- -Opis String is a tiny library that allows you to work with multibyte encoded strings in an object-oriented manner. +**Opis String** is a tiny library that allows you to work with multibyte encoded strings in an object-oriented manner. The library has no dependencies to *mb_string* or similar PHP extensions. -### Documentation +## Documentation The full documentation for this library can be found [here][documentation]. -### License +## License -**Opis String** is licensed under the [Apache License, Version 2.0][apache_license]. +**Opis String** is licensed under the [Apache License, Version 2.0][license]. -### Requirements +## Requirements -* PHP ^7.0 +* PHP ^7.4 +* ext-json +* ext-iconv ## Installation @@ -37,12 +39,12 @@ Or you could directly reference it into your `composer.json` file as a dependenc ```json { "require": { - "opis/string": "^2.0" + "opis/string": "^2020" } } ``` [documentation]: https://opis.io/string -[apache_license]: https://www.apache.org/licenses/LICENSE-2.0 "Apache License" +[license]: https://www.apache.org/licenses/LICENSE-2.0 "Apache License" [Packagist]: https://packagist.org/packages/opis/string "Packagist" [Composer]: https://getcomposer.org "Composer" diff --git a/composer.json b/composer.json index 36ed571..2108882 100644 --- a/composer.json +++ b/composer.json @@ -15,10 +15,12 @@ } ], "require": { - "php": ">=7.0.0" + "php": "^7.4", + "ext-json": "*", + "ext-iconv": "*" }, "require-dev": { - "phpunit/phpunit": "^6.5 || ^7.0" + "phpunit/phpunit": "^9.0" }, "autoload": { "psr-4": { @@ -32,7 +34,7 @@ }, "extra": { "branch-alias": { - "dev-master": "2.0.x-dev" + "dev-master": "2020.x-dev" } } } diff --git a/src/UnicodeString.php b/src/UnicodeString.php index 481d881..b3907ea 100644 --- a/src/UnicodeString.php +++ b/src/UnicodeString.php @@ -20,14 +20,15 @@ use RuntimeException; use OutOfBoundsException; use Countable, ArrayAccess; -use Serializable, JsonSerializable; +use JsonSerializable; use Opis\String\Exception\{ UnicodeException, InvalidStringException, InvalidCodePointException }; -class UnicodeString implements Countable, ArrayAccess, Serializable, JsonSerializable { +final class UnicodeString implements Countable, ArrayAccess, JsonSerializable +{ const KEEP_CASE = 0; const LOWER_CASE = 1; @@ -41,32 +42,25 @@ class UnicodeString implements Countable, ArrayAccess, Serializable, JsonSeriali /** * @var int[] */ - protected $codes; + private array $codes; /** * @var string[]|null */ - protected $chars; + private ?array $chars = null; + private int $length; + private ?string $str = null; + private ?array $cache = null; /** - * @var int - */ - protected $length = 0; - - /** - * @var string|null - */ - protected $str = null; - - /** - * @var null|array + * @var int[][] */ - protected $cache = null; + private static $maps = []; /** * @param int[] $codes */ - protected function __construct(array $codes = []) + private function __construct(array $codes = []) { $this->codes = $codes; $this->length = count($codes); @@ -936,148 +930,22 @@ public function jsonSerialize() return $this->__toString(); } - /** - * @inheritDoc - */ - public function serialize() - { - return $this->__toString(); - } - - /** - * @inheritDoc - */ - public function unserialize($serialized) - { - if (is_string($serialized)) { - $this->str = $serialized; - $this->codes = self::getCodePointsFromString($serialized); - $this->length = count($this->codes); - } else { - $this->codes = []; - } - } - - /** - * @param int $mode - * @return int[] - */ - protected function getMappedCodes(int $mode): array - { - if ($mode === self::KEEP_CASE || ($this->cache['i' . $mode] ?? false)) { - return $this->codes; - } - - $key = 'm' . $mode; - - if (!isset($this->cache[$key])) { - $this->cache[$key] = self::getMappedCodePoints($this->codes, $mode); - } - - return $this->cache[$key]; - } - - /** - * @param int $mode - * @return bool - */ - protected function isCase(int $mode): bool - { - $key = 'i' . $mode; - - if (!isset($this->cache[$key])) { - $list = self::getMapByMode($mode); - foreach ($this->codes as $code) { - if (isset($list[$code])) { - return $this->cache[$key] = false; - } - } - - return $this->cache[$key] = true; - } - - return $this->cache[$key]; - } - - /** - * @param int[] $codes - * @param int[] $text - * @param int $offset - * @return int - */ - protected function doIndexOf(array $codes, array $text, int $offset = 0): int + public function __serialize(): array { - $len = count($text); - - for ($i = $offset, $last = count($codes) - $len; $i <= $last; $i++) { - $match = true; - - for ($j = 0; $j < $len; $j++) { - if ($codes[$i + $j] !== $text[$j]) { - $match = false; - break; - } - } - - if ($match) { - return $i; - } - } - - return -1; + return [ + 'string' => $this->__toString(), + 'codes' => $this->codes, + 'length' => $this->length, + ]; } - /** - * @param string|self|int[]|string[] $mask - * @param bool $left - * @param bool $right - * @return static - */ - protected function doTrim($mask, bool $left, bool $right): self + public function __unserialize(array $data): void { - if ($this->length === 0) { - return clone $this; - } - - $mask = self::resolveCodePoints($mask); - - if (empty($mask)) { - return clone $this; - } - - $codes = $this->codes; - - if ($left) { - while (in_array($codes[0], $mask, true)) { - array_shift($codes); - if (empty($codes)) { - return new static(); - } - } - } - - if ($right) { - $last = count($codes) - 1; - while (in_array($codes[$last], $mask, true)) { - array_pop($codes); - if (--$last < 0) { - return new static(); - } - } - } - - return new static($codes); + $this->str =$data['string']; + $this->codes = $data['codes']; + $this->length = $data['length']; } - /***************************************** - ***** Static methods and properties ***** - *****************************************/ - - /** - * @var int[][] - */ - protected static $maps = []; - /** * Creates an unicode string instance from raw string * @param string $string @@ -1403,12 +1271,124 @@ public static function isValidCodePoint(int $code): bool return $code < 0xD800 || $code > 0xDFFF; } + /** + * @param int $mode + * @return int[] + */ + private function getMappedCodes(int $mode): array + { + if ($mode === self::KEEP_CASE || ($this->cache['i' . $mode] ?? false)) { + return $this->codes; + } + + $key = 'm' . $mode; + + if (!isset($this->cache[$key])) { + $this->cache[$key] = self::getMappedCodePoints($this->codes, $mode); + } + + return $this->cache[$key]; + } + + /** + * @param int $mode + * @return bool + */ + private function isCase(int $mode): bool + { + $key = 'i' . $mode; + + if (!isset($this->cache[$key])) { + $list = self::getMapByMode($mode); + foreach ($this->codes as $code) { + if (isset($list[$code])) { + return $this->cache[$key] = false; + } + } + + return $this->cache[$key] = true; + } + + return $this->cache[$key]; + } + + /** + * @param int[] $codes + * @param int[] $text + * @param int $offset + * @return int + */ + private function doIndexOf(array $codes, array $text, int $offset = 0): int + { + $len = count($text); + + for ($i = $offset, $last = count($codes) - $len; $i <= $last; $i++) { + $match = true; + + for ($j = 0; $j < $len; $j++) { + if ($codes[$i + $j] !== $text[$j]) { + $match = false; + break; + } + } + + if ($match) { + return $i; + } + } + + return -1; + } + + /** + * @param string|self|int[]|string[] $mask + * @param bool $left + * @param bool $right + * @return static + */ + private function doTrim($mask, bool $left, bool $right): self + { + if ($this->length === 0) { + return clone $this; + } + + $mask = self::resolveCodePoints($mask); + + if (empty($mask)) { + return clone $this; + } + + $codes = $this->codes; + + if ($left) { + while (in_array($codes[0], $mask, true)) { + array_shift($codes); + if (empty($codes)) { + return new static(); + } + } + } + + if ($right) { + $last = count($codes) - 1; + while (in_array($codes[$last], $mask, true)) { + array_pop($codes); + if (--$last < 0) { + return new static(); + } + } + } + + return new static($codes); + } + + /** * @param string|self|int[]|string[] $text * @param int $mode * @return array */ - protected static function resolveCodePoints($text, int $mode = self::KEEP_CASE): array + private static function resolveCodePoints($text, int $mode = self::KEEP_CASE): array { if ($text instanceof self) { return $text->getMappedCodes($mode); @@ -1431,7 +1411,7 @@ protected static function resolveCodePoints($text, int $mode = self::KEEP_CASE): * @param int $invalid * @return int */ - protected static function resolveFirstCodePoint($text, int $invalid = -1): int + private static function resolveFirstCodePoint($text, int $invalid = -1): int { if ($text instanceof self) { return $text->length === 0 ? $invalid : $text->codes[0]; @@ -1462,7 +1442,7 @@ protected static function resolveFirstCodePoint($text, int $invalid = -1): int * @param int $mode * @return int[] */ - protected static function getMapByMode(int $mode): array + private static function getMapByMode(int $mode): array { if (isset(self::$maps[$mode])) { return self::$maps[$mode]; From d93c02a856ea2c4793689f419354d3a36a36623f Mon Sep 17 00:00:00 2001 From: Sorin Sarca Date: Wed, 3 Jun 2020 19:22:21 +0300 Subject: [PATCH 06/20] Updated --- src/UnicodeString.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/UnicodeString.php b/src/UnicodeString.php index b3907ea..ad9a2cc 100644 --- a/src/UnicodeString.php +++ b/src/UnicodeString.php @@ -55,7 +55,7 @@ final class UnicodeString implements Countable, ArrayAccess, JsonSerializable /** * @var int[][] */ - private static $maps = []; + private static array $maps = []; /** * @param int[] $codes From 0ae75b00ecbe24ab2388e6082cb7095ca6ac2a66 Mon Sep 17 00:00:00 2001 From: Sorin Sarca Date: Thu, 4 Jun 2020 14:20:48 +0300 Subject: [PATCH 07/20] Updated serialization --- src/UnicodeString.php | 10 ++++------ 1 file changed, 4 insertions(+), 6 deletions(-) diff --git a/src/UnicodeString.php b/src/UnicodeString.php index ad9a2cc..ce0af57 100644 --- a/src/UnicodeString.php +++ b/src/UnicodeString.php @@ -933,17 +933,15 @@ public function jsonSerialize() public function __serialize(): array { return [ - 'string' => $this->__toString(), - 'codes' => $this->codes, - 'length' => $this->length, + 'value' => $this->__toString(), ]; } public function __unserialize(array $data): void { - $this->str =$data['string']; - $this->codes = $data['codes']; - $this->length = $data['length']; + $this->str = $data['value']; + $this->codes = self::getCodePointsFromString($this->str); + $this->length = count($this->codes); } /** From 7587552f85662f59651cf20a81c587b01786d3bb Mon Sep 17 00:00:00 2001 From: Sorin Sarca Date: Tue, 17 Nov 2020 09:41:09 +0200 Subject: [PATCH 08/20] Added PHP 8 support --- .gitattributes | 1 + .github/workflows/tests.yml | 11 +++-------- .gitignore | 1 + README.md | 2 +- composer.json | 2 +- 5 files changed, 7 insertions(+), 10 deletions(-) diff --git a/.gitattributes b/.gitattributes index cbfb7f2..030aa16 100644 --- a/.gitattributes +++ b/.gitattributes @@ -2,3 +2,4 @@ tests/ export-ignore phpunit.xml export-ignore .gitattributes export-ignore .gitignore export-ignore +.github export-ignore diff --git a/.github/workflows/tests.yml b/.github/workflows/tests.yml index 884dfca..7c67d4a 100644 --- a/.github/workflows/tests.yml +++ b/.github/workflows/tests.yml @@ -12,7 +12,7 @@ jobs: strategy: fail-fast: true matrix: - php: [7.4] + php: [7.4, 8.0] name: PHP ${{ matrix.php }} @@ -20,21 +20,16 @@ jobs: - name: Checkout code uses: actions/checkout@v2 - - name: Cache dependencies - uses: actions/cache@v1 - with: - path: ~/.composer/cache/files - key: dependencies-php-${{ matrix.php }}-composer-${{ hashFiles('composer.json') }} - - name: Setup PHP uses: shivammathur/setup-php@v2 with: php-version: ${{ matrix.php }} extensions: json, iconv + tools: composer:v2 coverage: none - name: Install dependencies - run: composer update --${{ matrix.stability }} --prefer-dist --no-interaction --no-progress + run: composer update --no-interaction --no-progress - name: Execute tests run: vendor/bin/phpunit --verbose diff --git a/.gitignore b/.gitignore index 8635faf..4188f39 100644 --- a/.gitignore +++ b/.gitignore @@ -4,3 +4,4 @@ _site/ shared/ Gemfile.lock composer.lock +.phpunit.result.cache diff --git a/README.md b/README.md index 11464fe..64ffb70 100644 --- a/README.md +++ b/README.md @@ -21,7 +21,7 @@ The full documentation for this library can be found [here][documentation]. ## Requirements -* PHP ^7.4 +* PHP ^7.4|^8.0 * ext-json * ext-iconv diff --git a/composer.json b/composer.json index 2108882..e2df7a9 100644 --- a/composer.json +++ b/composer.json @@ -15,7 +15,7 @@ } ], "require": { - "php": "^7.4", + "php": "^7.4|^8.0", "ext-json": "*", "ext-iconv": "*" }, From 54548f6423b06a1330b76a7935af6b0bb448ac4f Mon Sep 17 00:00:00 2001 From: Sorin Sarca Date: Wed, 18 Nov 2020 06:56:41 +0200 Subject: [PATCH 09/20] Updated --- composer.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/composer.json b/composer.json index e2df7a9..f9a00fa 100644 --- a/composer.json +++ b/composer.json @@ -15,7 +15,7 @@ } ], "require": { - "php": "^7.4|^8.0", + "php": "^7.4 || ^8.0", "ext-json": "*", "ext-iconv": "*" }, From d096d3312a11e207d601e358f297c9c89888db51 Mon Sep 17 00:00:00 2001 From: Marius Sarca Date: Wed, 6 Jan 2021 13:25:04 +0200 Subject: [PATCH 10/20] Update copyright --- src/Exception/InvalidCodePointException.php | 2 +- src/Exception/InvalidStringException.php | 2 +- src/Exception/UnicodeException.php | 2 +- src/UnicodeString.php | 2 +- tests/UnicodeStringTest.php | 2 +- 5 files changed, 5 insertions(+), 5 deletions(-) diff --git a/src/Exception/InvalidCodePointException.php b/src/Exception/InvalidCodePointException.php index 8b53e05..f1a3fe9 100644 --- a/src/Exception/InvalidCodePointException.php +++ b/src/Exception/InvalidCodePointException.php @@ -1,6 +1,6 @@ Date: Sat, 6 Mar 2021 04:58:29 +0200 Subject: [PATCH 11/20] Updated --- src/Exception/InvalidStringException.php | 4 +- src/UnicodeString.php | 137 ++++++++++++++++++++++- 2 files changed, 134 insertions(+), 7 deletions(-) diff --git a/src/Exception/InvalidStringException.php b/src/Exception/InvalidStringException.php index ede9d68..11e52dd 100644 --- a/src/Exception/InvalidStringException.php +++ b/src/Exception/InvalidStringException.php @@ -24,12 +24,12 @@ class InvalidStringException extends UnicodeException /** * @var string */ - protected $string; + protected string $string; /** * @var int */ - protected $offset; + protected int $offset; /** * @param string $string diff --git a/src/UnicodeString.php b/src/UnicodeString.php index 252b1d4..e59f5a0 100644 --- a/src/UnicodeString.php +++ b/src/UnicodeString.php @@ -27,7 +27,7 @@ InvalidCodePointException }; -final class UnicodeString implements Countable, ArrayAccess, JsonSerializable +class UnicodeString implements Countable, ArrayAccess, JsonSerializable { const KEEP_CASE = 0; @@ -832,7 +832,7 @@ public function __invoke(int $offset): int /** * @inheritDoc */ - public function offsetExists($offset) + public function offsetExists($offset): bool { // Allow negative index if ($offset < 0) { @@ -845,7 +845,7 @@ public function offsetExists($offset) /** * @inheritDoc */ - public function offsetGet($offset) + public function offsetGet($offset): string { if ($offset < 0) { if ($offset + $this->length < 0) { @@ -905,7 +905,7 @@ public function offsetUnset($offset) /** * @inheritDoc */ - public function count() + public function count(): int { return $this->length; } @@ -925,7 +925,7 @@ public function __toString(): string /** * @inheritDoc */ - public function jsonSerialize() + public function jsonSerialize(): string { return $this->__toString(); } @@ -1156,6 +1156,122 @@ public static function getCodePointsFromString(string $str, int $mode = self::KE return $codes; } + /** + * @param string $str + * @return iterable + * + * The key represents the current char index + * Value is a two element array + * - first element is an integer representing the code point + * - second element is an array of integers (length 1 to 4) representing bytes + */ + public static function walkString(string $str): iterable + { + $i = 0; + $length = strlen($str); + + while ($i < $length) { + $index = $i; + + $ord0 = ord($str[$i++]); + + if ($ord0 < 0x80) { + yield $index => [ + $ord0, + [$ord0] + ]; + continue; + } + + if ($i === $length || $ord0 < 0xC2 || $ord0 > 0xF4) { + throw new InvalidStringException($str, $i - 1); + } + + $ord1 = ord($str[$i++]); + + if ($ord0 < 0xE0) { + if ($ord1 < 0x80 || $ord1 >= 0xC0) { + throw new InvalidStringException($str, $i - 1); + } + + yield $index => [ + ($ord0 - 0xC0) * 64 + $ord1 - 0x80, + [$ord0, $ord1] + ]; + + continue; + } + + if ($i === $length) { + throw new InvalidStringException($str, $i - 1); + } + + $ord2 = ord($str[$i++]); + + if ($ord0 < 0xF0) { + if ($ord0 === 0xE0) { + if ($ord1 < 0xA0 || $ord1 >= 0xC0) { + throw new InvalidStringException($str, $i - 2); + } + } elseif ($ord0 === 0xED) { + if ($ord1 < 0x80 || $ord1 >= 0xA0) { + throw new InvalidStringException($str, $i - 2); + } + } elseif ($ord1 < 0x80 || $ord1 >= 0xC0) { + throw new InvalidStringException($str, $i - 2); + } + + if ($ord2 < 0x80 || $ord2 >= 0xC0) { + throw new InvalidStringException($str, $i - 1); + } + + yield $index => [ + ($ord0 - 0xE0) * 0x1000 + ($ord1 - 0x80) * 64 + $ord2 - 0x80, + [$ord0, $ord1, $ord2] + ]; + + continue; + } + + if ($i === $length) { + throw new InvalidStringException($str, $i - 1); + } + + $ord3 = ord($str[$i++]); + + if ($ord0 < 0xF5) { + if ($ord0 === 0xF0) { + if ($ord1 < 0x90 || $ord1 >= 0xC0) { + throw new InvalidStringException($str, $i - 3); + } + } elseif ($ord0 === 0xF4) { + if ($ord1 < 0x80 || $ord1 >= 0x90) { + throw new InvalidStringException($str, $i - 3); + } + } elseif ($ord1 < 0x80 || $ord1 >= 0xC0) { + throw new InvalidStringException($str, $i - 3); + } + + if ($ord2 < 0x80 || $ord2 >= 0xC0) { + throw new InvalidStringException($str, $i - 2); + } + + if ($ord3 < 0x80 || $ord3 >= 0xC0) { + throw new InvalidStringException($str, $i - 1); + } + + yield $index => [ + ($ord0 - 0xF0) * 0x40000 + ($ord1 - 0x80) * 0x1000 + ($ord2 - 0x80) * 64 + $ord3 - 0x80, + [$ord0, $ord1, $ord2, $ord3] + ]; + + continue; + } + + throw new InvalidStringException($str, $i - 1); + } + } + /** * Converts each code point to a char * @param array $codes @@ -1179,6 +1295,16 @@ public static function getCharsFromCodePoints(array $codes, int $mode = self::KE return $codes; } + /** + * @param string $str + * @param int $mode + * @return string[] + */ + public static function getCharsFromString(string $str, int $mode = self::KEEP_CASE): array + { + return self::getCharsFromCodePoints(self::getCodePointsFromString($str), $mode); + } + /** * Converts all code points to chars and returns the string * Invalid code points are ignored @@ -1463,6 +1589,7 @@ private static function getMapByMode(int $mode): array return []; } + /** @noinspection PhpIncludeInspection */ return self::$maps[$mode] = include(__DIR__ . "/../res/{$file}.php"); } } From 465153d78edb4864c449709303b7831112fdfa3e Mon Sep 17 00:00:00 2001 From: Sorin Sarca Date: Mon, 5 Apr 2021 22:06:13 +0300 Subject: [PATCH 12/20] Updated --- src/UnicodeString.php | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/src/UnicodeString.php b/src/UnicodeString.php index e59f5a0..7c941d0 100644 --- a/src/UnicodeString.php +++ b/src/UnicodeString.php @@ -468,7 +468,7 @@ public function insert($text, int $offset, int $mode = self::KEEP_CASE): self * @param int|null $length * @return static */ - public function remove(int $offset, int $length = null): self + public function remove(int $offset, ?int $length = null): self { $codes = $this->codes; @@ -657,7 +657,7 @@ public function split($delimiter = '', bool $ignoreCase = false): array * @param int|null $length * @return static */ - public function substring(int $start, int $length = null): self + public function substring(int $start, ?int $length = null): self { return new static(array_slice($this->codes, $start, $length)); } @@ -952,7 +952,7 @@ public function __unserialize(array $data): void * @return static * @throws InvalidStringException */ - public static function from(string $string, string $encoding = null, int $mode = self::KEEP_CASE): self + public static function from(string $string, ?string $encoding = null, int $mode = self::KEEP_CASE): self { if ($encoding !== null && strcasecmp($encoding, 'UTF-8') !== 0) { if (false === $string = @iconv($encoding, 'UTF-8', $string)) { From a653c95e761bf0dc345701796bc01add6fdcda55 Mon Sep 17 00:00:00 2001 From: Sorin Sarca Date: Tue, 6 Apr 2021 19:55:46 +0300 Subject: [PATCH 13/20] Updated replaceAll params --- src/UnicodeString.php | 2 +- tests/UnicodeStringTest.php | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/src/UnicodeString.php b/src/UnicodeString.php index 7c941d0..d615ad6 100644 --- a/src/UnicodeString.php +++ b/src/UnicodeString.php @@ -581,7 +581,7 @@ public function replace($subject, $replace, int $offset = 0, bool $ignoreCase = * @param int $offset * @return static */ - public function replaceAll($subject, $replace, bool $ignoreCase = false, int $offset = 0): self + public function replaceAll($subject, $replace, int $offset = 0, bool $ignoreCase = false): self { if ($offset < 0) { $offset += $this->length; diff --git a/tests/UnicodeStringTest.php b/tests/UnicodeStringTest.php index eebc6cb..4ff036d 100644 --- a/tests/UnicodeStringTest.php +++ b/tests/UnicodeStringTest.php @@ -507,7 +507,7 @@ public function replaceDataProvider() */ public function testReplaceAll(string $str, string $subject, string $replace, string $result, bool $ignoreCase = false, int $offset = 0) { - $this->assertEquals($result, (string)wstr::from($str)->replaceAll($subject, $replace, $ignoreCase, $offset)); + $this->assertEquals($result, (string)wstr::from($str)->replaceAll($subject, $replace, $offset, $ignoreCase)); } public function replaceAllDataProvider() From ace4b98b3e4ad4565d8bbc976d653f875d45728c Mon Sep 17 00:00:00 2001 From: Sorin Sarca Date: Tue, 13 Apr 2021 21:48:07 +0300 Subject: [PATCH 14/20] Updated changelog, readme --- CHANGELOG.md | 2 +- NOTICE | 2 +- README.md | 4 ++-- 3 files changed, 4 insertions(+), 4 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index d4fb672..32fc721 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,6 +1,6 @@ CHANGELOG ------------- -### v2020, unreleased +### v2.0.0, 2021.04.13 * The library was fully refactored diff --git a/NOTICE b/NOTICE index 4020c96..d63600e 100644 --- a/NOTICE +++ b/NOTICE @@ -1,5 +1,5 @@ Opis String -Copyright 2018 Zindex Software +Copyright 2018-2021 Zindex Software This product includes software developed at Zindex Software (http://zindex.software). diff --git a/README.md b/README.md index 64ffb70..8bca7c7 100644 --- a/README.md +++ b/README.md @@ -21,7 +21,7 @@ The full documentation for this library can be found [here][documentation]. ## Requirements -* PHP ^7.4|^8.0 +* PHP ^7.4 || ^8.0 * ext-json * ext-iconv @@ -39,7 +39,7 @@ Or you could directly reference it into your `composer.json` file as a dependenc ```json { "require": { - "opis/string": "^2020" + "opis/string": "^2.0" } } ``` From 5a82da2c29279087abf1c62088fa4d05ca728109 Mon Sep 17 00:00:00 2001 From: Sorin Sarca Date: Tue, 13 Apr 2021 21:48:54 +0300 Subject: [PATCH 15/20] Updated composer.json --- composer.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/composer.json b/composer.json index f9a00fa..0b96c63 100644 --- a/composer.json +++ b/composer.json @@ -34,7 +34,7 @@ }, "extra": { "branch-alias": { - "dev-master": "2020.x-dev" + "dev-master": "2.x-dev" } } } From 06aae8a8f45fd03336a7e8d35ce69cd9fd700134 Mon Sep 17 00:00:00 2001 From: Bastien Philippe Date: Thu, 9 Dec 2021 11:11:51 +0100 Subject: [PATCH 16/20] Fix php8.1 deprecations, run tests on php8.1 --- .github/workflows/tests.yml | 2 +- src/UnicodeString.php | 2 ++ 2 files changed, 3 insertions(+), 1 deletion(-) diff --git a/.github/workflows/tests.yml b/.github/workflows/tests.yml index 7c67d4a..dae67b0 100644 --- a/.github/workflows/tests.yml +++ b/.github/workflows/tests.yml @@ -12,7 +12,7 @@ jobs: strategy: fail-fast: true matrix: - php: [7.4, 8.0] + php: [7.4, 8.0, 8.1] name: PHP ${{ matrix.php }} diff --git a/src/UnicodeString.php b/src/UnicodeString.php index d615ad6..b9806ee 100644 --- a/src/UnicodeString.php +++ b/src/UnicodeString.php @@ -862,6 +862,7 @@ public function offsetGet($offset): string /** * @inheritDoc */ + #[\ReturnTypeWillChange] public function offsetSet($offset, $value) { // Allow negative index @@ -897,6 +898,7 @@ public function offsetSet($offset, $value) /** * @inheritDoc */ + #[\ReturnTypeWillChange] public function offsetUnset($offset) { throw new RuntimeException("Invalid operation"); From 221d5649da76856d89fb8e8c597c6c48eff9c8cd Mon Sep 17 00:00:00 2001 From: Sam Reed Date: Thu, 14 Nov 2024 02:55:16 +0000 Subject: [PATCH 17/20] PHP 8.4: Fix implictly nullable parameters https://wiki.php.net/rfc/deprecate-implicitly-nullable-types --- src/Exception/InvalidCodePointException.php | 2 +- src/Exception/InvalidStringException.php | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/src/Exception/InvalidCodePointException.php b/src/Exception/InvalidCodePointException.php index f1a3fe9..9494adc 100644 --- a/src/Exception/InvalidCodePointException.php +++ b/src/Exception/InvalidCodePointException.php @@ -30,7 +30,7 @@ class InvalidCodePointException extends UnicodeException * @param $codePoint * @param Throwable|null $previous */ - public function __construct($codePoint, Throwable $previous = null) + public function __construct($codePoint, ?Throwable $previous = null) { parent::__construct("Invalid code point", 0, $previous); $this->codePoint = $codePoint; diff --git a/src/Exception/InvalidStringException.php b/src/Exception/InvalidStringException.php index 11e52dd..50b22a1 100644 --- a/src/Exception/InvalidStringException.php +++ b/src/Exception/InvalidStringException.php @@ -36,7 +36,7 @@ class InvalidStringException extends UnicodeException * @param int $offset * @param Throwable|null $previous */ - public function __construct(string $string, int $offset = -1, Throwable $previous = null) + public function __construct(string $string, int $offset = -1, ?Throwable $previous = null) { parent::__construct("Invalid UTF-8 string at offset {$offset}", 0, $previous); $this->string = $string; From 70cdef8deda11a45ca91f1cd636dee545a4be8d7 Mon Sep 17 00:00:00 2001 From: Sam Reed Date: Thu, 12 Dec 2024 17:22:42 +0000 Subject: [PATCH 18/20] tests.yml: Test on PHP 8.2/8.3/8.4 Fixes https://github.com/opis/string/issues/5 --- .github/workflows/tests.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/tests.yml b/.github/workflows/tests.yml index dae67b0..f89014b 100644 --- a/.github/workflows/tests.yml +++ b/.github/workflows/tests.yml @@ -12,7 +12,7 @@ jobs: strategy: fail-fast: true matrix: - php: [7.4, 8.0, 8.1] + php: [7.4, 8.0, 8.1, 8.2, 8.3, 8.4] name: PHP ${{ matrix.php }} From 391130a366760f3ff6e19b023027d003c9d311ae Mon Sep 17 00:00:00 2001 From: Sorin Sarca Date: Mon, 30 Dec 2024 23:50:18 +0200 Subject: [PATCH 19/20] Update README.md Updated badges --- README.md | 7 ++++--- 1 file changed, 4 insertions(+), 3 deletions(-) diff --git a/README.md b/README.md index 8bca7c7..f6e97d5 100644 --- a/README.md +++ b/README.md @@ -1,9 +1,10 @@ Opis String =========== [![Tests](https://github.com/opis/string/workflows/Tests/badge.svg)](https://github.com/opis/string/actions) -[![Latest Stable Version](https://poser.pugx.org/opis/string/version.png)](https://packagist.org/packages/opis/string) -[![Latest Unstable Version](https://poser.pugx.org/opis/string/v/unstable.png)](https://packagist.org/packages/opis/string) -[![License](https://poser.pugx.org/opis/string/license.png)](https://packagist.org/packages/opis/string) +[![Packagist Version](https://img.shields.io/packagist/v/opis/string?label=Version)](https://packagist.org/packages/opis/string) +[![Packagist Downloads](https://img.shields.io/packagist/dt/opis/string?label=Downloads)](https://packagist.org/packages/opis/string) +[![Packagist License](https://img.shields.io/packagist/l/opis/string?color=teal&label=License)](https://packagist.org/packages/opis/string) + Multibyte strings ---------------------------- From b290a364f1bd5e1cf18c56ef6bd64bb788638d74 Mon Sep 17 00:00:00 2001 From: Sorin Sarca Date: Fri, 17 Oct 2025 15:37:20 +0300 Subject: [PATCH 20/20] Added static getStringLength --- .github/workflows/tests.yml | 4 +- CHANGELOG.md | 4 ++ README.md | 4 +- composer.json | 3 ++ src/UnicodeString.php | 105 ++++++++++++++++++++++++++++++++++++ tests/UnicodeStringTest.php | 11 ++++ 6 files changed, 127 insertions(+), 4 deletions(-) diff --git a/.github/workflows/tests.yml b/.github/workflows/tests.yml index f89014b..a7c1473 100644 --- a/.github/workflows/tests.yml +++ b/.github/workflows/tests.yml @@ -12,7 +12,7 @@ jobs: strategy: fail-fast: true matrix: - php: [7.4, 8.0, 8.1, 8.2, 8.3, 8.4] + php: [7.4, 8.0, 8.1, 8.2, 8.3, 8.4, 8.5] name: PHP ${{ matrix.php }} @@ -32,4 +32,4 @@ jobs: run: composer update --no-interaction --no-progress - name: Execute tests - run: vendor/bin/phpunit --verbose + run: composer run tests diff --git a/CHANGELOG.md b/CHANGELOG.md index 32fc721..88a33dc 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,6 +1,10 @@ CHANGELOG ------------- +### v2.1.0, 2025.10.17 + +* Added static `getStringLength()` + ### v2.0.0, 2021.04.13 * The library was fully refactored diff --git a/README.md b/README.md index f6e97d5..4059919 100644 --- a/README.md +++ b/README.md @@ -28,7 +28,7 @@ The full documentation for this library can be found [here][documentation]. ## Installation -**Opis String** is available on [Packagist] and it can be installed from a +**Opis String** is available on [Packagist], and it can be installed from a command line interface by using [Composer]. ```bash @@ -40,7 +40,7 @@ Or you could directly reference it into your `composer.json` file as a dependenc ```json { "require": { - "opis/string": "^2.0" + "opis/string": "^2.1" } } ``` diff --git a/composer.json b/composer.json index 0b96c63..e5040ab 100644 --- a/composer.json +++ b/composer.json @@ -32,6 +32,9 @@ "Opis\\String\\Test\\": "tests/" } }, + "scripts": { + "tests": "./vendor/bin/phpunit --verbose --color" + }, "extra": { "branch-alias": { "dev-master": "2.x-dev" diff --git a/src/UnicodeString.php b/src/UnicodeString.php index b9806ee..d8947a2 100644 --- a/src/UnicodeString.php +++ b/src/UnicodeString.php @@ -1274,6 +1274,111 @@ public static function walkString(string $str): iterable } } + /** + * Compute string length + * @param string $str + * @return int + * @throws InvalidStringException + */ + public static function getStringLength(string $str): int + { + $count = 0; + $length = strlen($str); + + $i = 0; + while ($i < $length) { + $ord0 = ord($str[$i++]); + + if ($ord0 < 0x80) { + $count++; + continue; + } + + if ($i === $length || $ord0 < 0xC2 || $ord0 > 0xF4) { + throw new InvalidStringException($str, $i - 1); + } + + $ord1 = ord($str[$i++]); + + if ($ord0 < 0xE0) { + if ($ord1 < 0x80 || $ord1 >= 0xC0) { + throw new InvalidStringException($str, $i - 1); + } + + // $ord1 = ($ord0 - 0xC0) * 64 + $ord1 - 0x80; + $count++; + + continue; + } + + if ($i === $length) { + throw new InvalidStringException($str, $i - 1); + } + + $ord2 = ord($str[$i++]); + + if ($ord0 < 0xF0) { + if ($ord0 === 0xE0) { + if ($ord1 < 0xA0 || $ord1 >= 0xC0) { + throw new InvalidStringException($str, $i - 2); + } + } elseif ($ord0 === 0xED) { + if ($ord1 < 0x80 || $ord1 >= 0xA0) { + throw new InvalidStringException($str, $i - 2); + } + } elseif ($ord1 < 0x80 || $ord1 >= 0xC0) { + throw new InvalidStringException($str, $i - 2); + } + + if ($ord2 < 0x80 || $ord2 >= 0xC0) { + throw new InvalidStringException($str, $i - 1); + } + + // $ord2 = ($ord0 - 0xE0) * 0x1000 + ($ord1 - 0x80) * 64 + $ord2 - 0x80; + $count++; + + continue; + } + + if ($i === $length) { + throw new InvalidStringException($str, $i - 1); + } + + $ord3 = ord($str[$i++]); + + if ($ord0 < 0xF5) { + if ($ord0 === 0xF0) { + if ($ord1 < 0x90 || $ord1 >= 0xC0) { + throw new InvalidStringException($str, $i - 3); + } + } elseif ($ord0 === 0xF4) { + if ($ord1 < 0x80 || $ord1 >= 0x90) { + throw new InvalidStringException($str, $i - 3); + } + } elseif ($ord1 < 0x80 || $ord1 >= 0xC0) { + throw new InvalidStringException($str, $i - 3); + } + + if ($ord2 < 0x80 || $ord2 >= 0xC0) { + throw new InvalidStringException($str, $i - 2); + } + + if ($ord3 < 0x80 || $ord3 >= 0xC0) { + throw new InvalidStringException($str, $i - 1); + } + + // $ord3 = ($ord0 - 0xF0) * 0x40000 + ($ord1 - 0x80) * 0x1000 + ($ord2 - 0x80) * 64 + $ord3 - 0x80; + $count++; + + continue; + } + + throw new InvalidStringException($str, $i - 1); + } + + return $count; + } + /** * Converts each code point to a char * @param array $codes diff --git a/tests/UnicodeStringTest.php b/tests/UnicodeStringTest.php index 4ff036d..9785976 100644 --- a/tests/UnicodeStringTest.php +++ b/tests/UnicodeStringTest.php @@ -106,11 +106,22 @@ public function testLength() { $this->assertEquals(0, wstr::from('')->length()); $this->assertEquals(1, wstr::from(' ')->length()); + $this->assertEquals(1, wstr::from("\x00")->length()); $this->assertEquals(5, wstr::from('abcde')->length()); $this->assertEquals(10, wstr::from('ăĂâÂîÎșȘțȚ')->length()); $this->assertEquals(15, wstr::from('abcdeăĂâÂîÎșȘțȚ')->length()); } + public function testStaticLength() + { + $this->assertEquals(0, wstr::getStringLength('')); + $this->assertEquals(1, wstr::getStringLength(' ')); + $this->assertEquals(1, wstr::getStringLength("\x00")); + $this->assertEquals(5, wstr::getStringLength('abcde')); + $this->assertEquals(10, wstr::getStringLength('ăĂâÂîÎșȘțȚ')); + $this->assertEquals(15, wstr::getStringLength('abcdeăĂâÂîÎșȘțȚ')); + } + public function testIsEmpty() { $this->assertTrue(wstr::from('')->isEmpty());