PageRenderTime 46ms CodeModel.GetById 14ms RepoModel.GetById 0ms app.codeStats 1ms

/FSN/mediatheque/zp-core/lib-utf8.php

https://gitlab.com/r.collas/site_central
PHP | 864 lines | 694 code | 67 blank | 103 comment | 81 complexity | ba38741e6cfc7b96aee23feeb23e6937 MD5 | raw file
  1. <?php
  2. /**
  3. * UTF-8 friendly replacement functions - v0.2
  4. * Copyright (C) 2004-2006 Niels Leenheer & Andy Matsubara
  5. *
  6. * This program is free software; you can redistribute it and/or
  7. * modify it under the terms of the GNU General Public License
  8. * as published by the Free Software Foundation; either version 2
  9. * of the License, or (at your option) any later version.
  10. *
  11. * Supported functions:
  12. * - utf8::convert()
  13. * - utf8::detect()
  14. * - utf8::strtolower()
  15. * - utf8::strtoupper()
  16. * - utf8::strlen()
  17. * - utf8::strwidth()
  18. * - utf8::substr()
  19. * - utf8::strimwidth()
  20. * - utf8::strcut()
  21. * - utf8::strrpos()
  22. * - utf8::strpos()
  23. * - utf8::substr_count()
  24. * - utf8::encode_mimeheader()
  25. * - utf8::send_mail()
  26. * - utf8::encode_javascript()
  27. * - utf8::encode_numericentity()
  28. *
  29. * @package core
  30. */
  31. // force UTF-8 Ø
  32. global $_zp_UTF8;
  33. $_zp_UTF8 = new utf8();
  34. class utf8 {
  35. /**
  36. * Character set translation support
  37. *
  38. * @return utf8
  39. */
  40. var $charsets;
  41. var $mb_sets;
  42. var $iconv_sets;
  43. function utf8() {
  44. $this->charsets = array("ASMO-708" => gettext("Arabic"),
  45. "BIG5" => gettext("Chinese Traditional"),
  46. "CP1026" => gettext("IBM EBCDIC (Turkish Latin-5)"),
  47. "cp866" => gettext("Cyrillic (DOS)"),
  48. "CP870" => gettext("IBM EBCDIC (Multilingual Latin-2)"),
  49. "CISO2022JP" => gettext("Japanese (JIS-Allow 1 byte Kana)"),
  50. "DOS-720" => gettext("Arabic (DOS)"),
  51. "DOS-862" => gettext("Hebrew (DOS)"),
  52. "EBCDIC-CP-US" => gettext("IBM EBCDIC (US-Canada)"),
  53. "EUC-CN" => gettext("Chinese Simplified (EUC)"),
  54. "EUC-JP" => gettext("Japanese (EUC)"),
  55. "EUC-KR" => gettext("Korean (EUC)"),
  56. "GB2312" => gettext("Chinese Simplified (GB2312)"),
  57. "HZ-GB-2312" => gettext("Chinese Simplified (HZ)"),
  58. "IBM437" => gettext("OEM United States"),
  59. "IBM737" => gettext("Greek (DOS)"),
  60. "IBM775" => gettext("Baltic (DOS)"),
  61. "IBM850" => gettext("Western European (DOS)"),
  62. "IBM852" => gettext("Central European (DOS)"),
  63. "IBM857" => gettext("Turkish (DOS)"),
  64. "IBM861" => gettext("Icelandic (DOS)"),
  65. "IBM869" => gettext("Greek, Modern (DOS)"),
  66. "ISO-2022-JP" => gettext("Japanese (JIS)"),
  67. "ISO-2022-JP" => gettext("Japanese (JIS-Allow 1 byte Kana - SO/SI)"),
  68. "ISO-2022-KR" => gettext("Korean (ISO)"),
  69. "ISO-8859-1" => gettext("Western European (ISO)"),
  70. "ISO-8859-15" => gettext("Latin 9 (ISO)"),
  71. "ISO-8859-2" => gettext("Central European (ISO)"),
  72. "ISO-8859-3" => gettext("Latin 3 (ISO)"),
  73. "ISO-8859-4" => gettext("Baltic (ISO)"),
  74. "ISO-8859-5" => gettext("Cyrillic (ISO)"),
  75. "ISO-8859-6" => gettext("Arabic (ISO)"),
  76. "ISO-8859-7" => gettext("Greek (ISO)"),
  77. "ISO-8859-8" => gettext("Hebrew (ISO-Visual)"),
  78. "ISO-8859-8-i" => gettext("Hebrew (ISO-Logical)"),
  79. "ISO-8859-9" => gettext("Turkish (ISO)"),
  80. "JOHAB" => gettext("Korean (Johab)"),
  81. "KOi8-R" => gettext("Cyrillic (KOI8-R)"),
  82. "KOi8-U" => gettext("Cyrillic (KOI8-U)"),
  83. "KS_C_5601-1987" => gettext("Korean"),
  84. "MACINTOSH" => gettext("Western European (MAC)"),
  85. "SHIFT_JIS" => gettext("Japanese (Shift-JIS)"),
  86. "UNICODE" => gettext("Unicode"),
  87. "UNICODEFFFE" => gettext("Unicode (Big-Endian)"),
  88. "US-ASCII" => gettext("US-ASCII"),
  89. "UTF-7" => gettext("Unicode (UTF-7)"),
  90. "UTF-8" => gettext("Unicode (UTF-8)"),
  91. "WINDOWS-1250" => gettext("Central European (Windows)"),
  92. "WINDOWS-1251" => gettext("Cyrillic (Windows)"),
  93. "WINDOWS-1252" => gettext("Western European (Windows)"),
  94. "WINDOWS-1253" => gettext("Greek (Windows)"),
  95. "WINDOWS-1254" => gettext("Turkish (Windows)"),
  96. "WINDOWS-1255" => gettext("Hebrew (Windows)"),
  97. "WINDOWS-1256" => gettext("Arabic (Windows)"),
  98. "WINDOWS-1257" => gettext("Baltic (Windows)"),
  99. "WINDOWS-1258" => gettext("Vietnamese (Windows)"),
  100. "WINDOWS-874" => gettext("Thai (Windows)")
  101. );
  102. // prune the list to supported character sets
  103. $this->iconv_sets = array();
  104. $this->mb_sets = array();
  105. if (function_exists('mb_convert_encoding')) {
  106. if (function_exists('mb_list_encodings')) {
  107. $list = mb_list_encodings();
  108. } else {
  109. $list = array("pass", // from my PHP 5 mb_list_encodings list....
  110. "auto",
  111. "byte2be",
  112. "byte2le",
  113. "byte4be",
  114. "byte4le",
  115. "BASE64",
  116. "UUENCODE",
  117. "HTML-ENTITIES",
  118. "Quoted-Printable",
  119. "7bit",
  120. "8bit",
  121. "UCS-4",
  122. "UCS-4BE",
  123. "UCS-4LE",
  124. "UCS-2",
  125. "UCS-2BE",
  126. "UCS-2LE",
  127. "UTF-32",
  128. "UTF-32BE",
  129. "UTF-32LE",
  130. "UTF-16",
  131. "UTF-16BE",
  132. "UTF-16LE",
  133. "UTF-8",
  134. "UTF-7",
  135. "UTF7-IMAP",
  136. "ASCII",
  137. "EUC-JP",
  138. "SJIS",
  139. "eucJP-win",
  140. "SJIS-win",
  141. "CP51932",
  142. "JIS",
  143. "ISO-2022-JP",
  144. "ISO-2022-JP-MS",
  145. "Windows-1252",
  146. "ISO-8859-1",
  147. "ISO-8859-2",
  148. "ISO-8859-3",
  149. "ISO-8859-4",
  150. "ISO-8859-5",
  151. "ISO-8859-6",
  152. "ISO-8859-7",
  153. "ISO-8859-8",
  154. "ISO-8859-9",
  155. "ISO-8859-10",
  156. "ISO-8859-13",
  157. "ISO-8859-14",
  158. "ISO-8859-15",
  159. "ISO-8859-16",
  160. "EUC-CN",
  161. "CP936",
  162. "HZ",
  163. "EUC-TW",
  164. "BIG-5",
  165. "EUC-KR",
  166. "UHC",
  167. "ISO-2022-KR",
  168. "Windows-1251",
  169. "CP866",
  170. "KOI8-R",
  171. "ArmSCII-8");
  172. }
  173. foreach ($this->charsets as $key => $encoding) {
  174. if (in_array($key, $list)) {
  175. $this->mb_sets[$key] = $encoding;
  176. }
  177. }
  178. }
  179. if (function_exists('iconv')) {
  180. foreach ($this->charsets as $key => $encoding) {
  181. if (@iconv("UTF-8", $key, "UTF-8") !== false) {
  182. $this->iconv_sets[$key] = $encoding;
  183. }
  184. }
  185. }
  186. }
  187. /**
  188. *
  189. * replaces invalid UTF-8 characters with blanks
  190. *
  191. */
  192. static function sanitize($text) {
  193. if (function_exists('iconv')) {
  194. return iconv("UTF-8", "UTF-8//IGNORE", $text);
  195. } else if (function_exists('mb_convert_encoding')) {
  196. mb_convert_encoding($text, 'UTF-8', 'UTF-8');
  197. }
  198. return $text;
  199. }
  200. /**
  201. * Convert a foreign charset encoding from or to UTF-8
  202. */
  203. function convert($string, $encoding = NULL, $destination = 'UTF-8') {
  204. if (!$encoding)
  205. $encoding = utf8::detect($string);
  206. if ($encoding == $destination)
  207. return $string;
  208. if (!empty($this->mb_sets)) {
  209. $encode_mb = array_key_exists($encoding, $this->mb_sets);
  210. $dest_mb = array_key_exists($destination, $this->mb_sets);
  211. if ($encode_mb && $dest_mb) {
  212. @mb_substitute_character('none');
  213. return mb_convert_encoding($string, $destination, $encoding);
  214. }
  215. } else {
  216. $encode_mb = $dest_mb = false;
  217. }
  218. $encode_iconv = array_key_exists($encoding, $this->iconv_sets);
  219. $dest_iconv = array_key_exists($destination, $this->iconv_sets);
  220. if ($encode_iconv && $dest_iconv) {
  221. return @iconv($encoding, $destination . '//IGNORE', $string);
  222. }
  223. // must use mixed conversion
  224. @mb_substitute_character('none');
  225. if ($encode_mb) {
  226. $instring = mb_convert_encoding($string, 'UTF-8', $encoding);
  227. } else if ($encode_iconv) {
  228. $instring = @iconv($encoding, 'UTF-8' . '//IGNORE', $string);
  229. } else {
  230. $instring = $string;
  231. }
  232. if ($dest_mb) {
  233. $outstring = mb_convert_encoding($string, $destination, 'UTF-8');
  234. } else if ($dest_iconv) {
  235. $outstring = @iconv('UTF-8', $destination . '//IGNORE', $string);
  236. } else {
  237. $outstring = $string;
  238. }
  239. return $outstring;
  240. }
  241. /**
  242. * Detect the encoding of the string
  243. */
  244. static function detect($string) {
  245. if (function_exists('mb_detect_encoding')) {
  246. $encoding = mb_detect_encoding($string);
  247. if ($encoding) {
  248. return $encoding;
  249. }
  250. }
  251. if (!preg_match("/[\x80-\xFF]/", $string) && !preg_match("/\x1B/", $string))
  252. return 'US-ASCII';
  253. if (!preg_match("/[\x80-\xFF]/", $string) && preg_match("/\x1B/", $string))
  254. return 'ISO-2022-JP';
  255. if (preg_match("/^([\x01-\x7F]|[\xC0-\xDF][\x80-\xBF]|[\xE0-\xEF][\x80-\xBF][\x80-\xBF])+$/", $string) == 1)
  256. return 'UTF-8';
  257. if (preg_match("/^([\x01-\x7F]|\x8E[\xA0-\xDF]|\x8F[xA1-\xFE][\xA1-\xFE]|[\xA1-\xFE][\xA1-\xFE])+$/", $string) == 1)
  258. return 'EUC-JP';
  259. if (preg_match("/^([\x01-\x7F]|[\xA0-\xDF]|[\x81-\xFC][\x40-\xFC])+$/", $string) == 1)
  260. return 'Shift_JIS';
  261. return 'ISO-8859-1';
  262. }
  263. /**
  264. * Determine the number of characters of a string
  265. * Compatible with mb_strlen(), an UTF-8 friendly replacement for strlen()
  266. */
  267. static function strlen($str) {
  268. return preg_match_all('/[\x01-\x7F]|[\xC0-\xDF][\x80-\xBF]|[\xE0-\xEF][\x80-\xBF][\x80-\xBF]/', $str, $arr);
  269. }
  270. /**
  271. * Count the number of substring occurances
  272. * Compatible with mb_substr_count(), an UTF-8 friendly replacement for substr_count()
  273. */
  274. static function substr_count($haystack, $needle) {
  275. return substr_count($haystack, $needle);
  276. }
  277. /**
  278. * Return part of a string, length and offset in characters
  279. * Compatible with mb_substr(), an UTF-8 friendly replacement for substr()
  280. */
  281. static function substr($str, $start, $length = NULL) {
  282. preg_match_all('/[\x01-\x7F]|[\xC0-\xDF][\x80-\xBF]|[\xE0-\xEF][\x80-\xBF][\x80-\xBF]/', $str, $arr);
  283. if (is_null($length)) {
  284. $arr = array_slice($arr[0], $start);
  285. } else {
  286. $arr = array_slice($arr[0], $start, $length);
  287. }
  288. $result = implode('', $arr);
  289. return $result;
  290. }
  291. /**
  292. * Return part of a string, length and offset in bytes
  293. * Compatible with mb_strcut()
  294. */
  295. static function strcut($str, $start, $length = NULL) {
  296. if ($start < 0)
  297. $start += strlen($str);
  298. $original = $start;
  299. while ($start > 0 && intval(ord($str[$start]) & 0xC0) == 0x80)
  300. $start--;
  301. $start = max($start, 0);
  302. $original = max($original, 0);
  303. if ($start < strlen($str)) {
  304. if (is_null($length)) {
  305. return substr($str, $start);
  306. } elseif ($length > 0) {
  307. $end = $start + $length;
  308. while ($end > 0 && intval(ord($str[$end]) & 0xC0) == 0x80)
  309. $end--;
  310. return substr($str, $start, $end - $start);
  311. } elseif ($length < 0) {
  312. $end = strlen($str) + $length - ($original - $start);
  313. while ($end > 0 && intval(ord($str[$end]) & 0xC0) == 0x80)
  314. $end--;
  315. if ($end > 0)
  316. return substr($str, $start, $end - $start);
  317. }
  318. }
  319. return '';
  320. }
  321. /**
  322. * Determine the width of a string
  323. * Compatible with mb_strwidth()
  324. */
  325. static function strwidth($str) {
  326. $double = preg_match_all('/[\xE2-\xEF][\x80-\xBF][\x80-\xBF]/', $str, $arr) - // U+2000 - U+FFFF = double width
  327. preg_match_all('/\xEF\xBD[\xA1-\xBF]|\xEF\xBE[\x80-\x9F]/', $str, $arr); // U+FF61 - U+FF9F = single width
  328. $null = preg_match_all('/[\x00-\x19]/', $str, $arr); // U+0000 - U+0019 = no width
  329. return UTF8::strlen($str) - $null + $double;
  330. }
  331. /**
  332. * Get truncated string with specified width
  333. * Compatible with mb_strimwidth()
  334. */
  335. static function strimwidth($str, $start, $width, $trimmarker = '') {
  336. $str = UTF8::substr($str, $start);
  337. $width = $width - UTF8::strwidth($trimmarker);
  338. $c = 0;
  339. for ($i = 0; $i < strlen($str); $i++) {
  340. $b1 = (int) ord($str[$i]);
  341. if ($b1 < 0x80 || $b1 > 0xBF) {
  342. $c++;
  343. if ($b1 > 0xE2) {
  344. $b2 = (int) ord($str[$i + 1]);
  345. $b3 = (int) ord($str[$i + 2]);
  346. if (($b2 == 0xBD && $b3 >= 0xA1) || ($b2 == 0xBE && $b3 <= 0x9F))
  347. $count++;
  348. else
  349. $count = $count + 2;
  350. }
  351. else
  352. $count++;
  353. }
  354. if ($count > $width) {
  355. return UTF8::substr($str, 0, $c - 1) . $trimmarker;
  356. }
  357. }
  358. }
  359. /**
  360. * Find position of last occurance of a string in another string
  361. * Compatible with mb_strrpos(), an UTF-8 friendly replacement for strrpos()
  362. */
  363. static function strrpos($haystack, $needle) {
  364. $pos = strrpos($haystack, $needle);
  365. if ($pos === false)
  366. return false;
  367. else
  368. return UTF8::strlen(substr($haystack, 0, $pos));
  369. }
  370. /**
  371. * Find position of first occurance of a string in another string
  372. * Compatible with mb_strpos(), an UTF-8 friendly replacement for strpos()
  373. */
  374. static function strpos($haystack, $needle, $offset = 0) {
  375. $comp = 0;
  376. while (!isset($length) || $length < $offset) {
  377. $pos = strpos($haystack, $needle, $offset + $comp);
  378. if ($pos === false)
  379. return false;
  380. $length = UTF8::strlen(substr($haystack, 0, $pos));
  381. if ($length < $offset)
  382. $comp = $pos - $length;
  383. }
  384. return $length;
  385. }
  386. /**
  387. * Convert a string to lower case
  388. * Compatible with mb_strtolower(), an UTF-8 friendly replacement for strtolower()
  389. */
  390. static function strtolower($str) {
  391. global $UTF8_TABLES;
  392. return strtr($str, $UTF8_TABLES['strtolower']);
  393. }
  394. /**
  395. * Convert a string to upper case
  396. * Compatible with mb_strtoupper(), an UTF-8 friendly replacement for strtoupper()
  397. */
  398. static function strtoupper($str) {
  399. global $UTF8_TABLES;
  400. return strtr($str, $UTF8_TABLES['strtoupper']);
  401. }
  402. /**
  403. * Encode a string for use in a MIME header
  404. * Simplied replacement for mb_encode_mimeheader()
  405. */
  406. static function encode_mimeheader($str) {
  407. $length = 45;
  408. $pos = 0;
  409. $max = strlen($str);
  410. $buffer = '';
  411. while ($pos < $max) {
  412. if ($pos + $length < $max) {
  413. $adjust = 0;
  414. while (intval(ord($str[$pos + $length + $adjust]) & 0xC0) == 0x80)
  415. $adjust--;
  416. $buffer .= ($buffer == '' ? '' : "?=\n =?UTF-8?B?") . base64_encode(substr($str, $pos, $length + $adjust));
  417. $pos = $pos + $length + $adjust;
  418. } else {
  419. $buffer .= ($buffer == '' ? '' : "?=\n =?UTF-8?B?") . base64_encode(substr($str, $pos));
  420. $pos = $max;
  421. }
  422. }
  423. return '=?UTF-8?B?' . $buffer . '?=';
  424. }
  425. /**
  426. * Send mail
  427. * Replacement for mb_send_mail(), an UTF-8 friendly replacement for mail()
  428. */
  429. static function send_mail($to, $subject, $message, $additional_headers = '', $additional_parameter = '') {
  430. $subject = UTF8::encode_mimeheader($subject);
  431. $message = chunk_split(base64_encode($message));
  432. $additional_headers = trim($additional_headers);
  433. if ($additional_headers != '')
  434. $additional_headers .= "\n";
  435. $additional_headers .=
  436. "Mime-Version: 1.0\n" .
  437. "Content-Type: text/plain; charset=UTF-8\n" .
  438. "Content-Transfer-Encoding: base64";
  439. if (SAFE_MODE) {
  440. return @mail($to, $subject, $message, $additional_headers);
  441. } else {
  442. return @mail($to, $subject, $message, $additional_headers, $additional_parameter);
  443. }
  444. }
  445. /**
  446. * Prepare an UTF-8 string for use in JavaScript
  447. */
  448. static function encode_javascript($string) {
  449. $string = str_replace('\\', '\\\\', $string);
  450. $string = str_replace('"', '\\"', $string);
  451. $string = str_replace("'", "\\'", $string);
  452. $string = str_replace("\n", "\\n", $string);
  453. $string = str_replace("\r", "\\r", $string);
  454. $string = str_replace("\t", "\\t", $string);
  455. $len = strlen($string);
  456. $pos = 0;
  457. $out = '';
  458. while ($pos < $len) {
  459. $ascii = ord(substr($string, $pos, 1));
  460. if ($ascii >= 0xF0) {
  461. $byte[1] = ord(substr($string, $pos, 1)) - 0xF0;
  462. $byte[2] = ord(substr($string, $pos + 1, 1)) - 0x80;
  463. $byte[3] = ord(substr($string, $pos + 2, 1)) - 0x80;
  464. $byte[4] = ord(substr($string, $pos + 3, 1)) - 0x80;
  465. $char_code = ($byte[1] << 18) + ($byte[2] << 12) + ($byte[3] << 6) + $byte[4];
  466. $pos += 4;
  467. } elseif (($ascii >= 0xE0) && ($ascii < 0xF0)) {
  468. $byte[1] = ord(substr($string, $pos, 1)) - 0xE0;
  469. $byte[2] = ord(substr($string, $pos + 1, 1)) - 0x80;
  470. $byte[3] = ord(substr($string, $pos + 2, 1)) - 0x80;
  471. $char_code = ($byte[1] << 12) + ($byte[2] << 6) + $byte[3];
  472. $pos += 3;
  473. } elseif (($ascii >= 0xC0) && ($ascii < 0xE0)) {
  474. $byte[1] = ord(substr($string, $pos, 1)) - 0xC0;
  475. $byte[2] = ord(substr($string, $pos + 1, 1)) - 0x80;
  476. $char_code = ($byte[1] << 6) + $byte[2];
  477. $pos += 2;
  478. } else {
  479. $char_code = ord(substr($string, $pos, 1));
  480. $pos += 1;
  481. }
  482. if ($char_code < 0x80)
  483. $out .= chr($char_code);
  484. else
  485. $out .= '\\u' . str_pad(dechex($char_code), 4, '0', STR_PAD_LEFT);
  486. }
  487. return $out;
  488. }
  489. /**
  490. * Encode an UTF-8 string with numeric entities
  491. * Simplied replacement for mb_encode_numericentity()
  492. */
  493. static function encode_numericentity($string) {
  494. $len = strlen($string);
  495. $pos = 0;
  496. $out = '';
  497. while ($pos < $len) {
  498. $ascii = ord(substr($string, $pos, 1));
  499. if ($ascii >= 0xF0) {
  500. $byte[1] = ord(substr($string, $pos, 1)) - 0xF0;
  501. $byte[2] = ord(substr($string, $pos + 1, 1)) - 0x80;
  502. $byte[3] = ord(substr($string, $pos + 2, 1)) - 0x80;
  503. $byte[4] = ord(substr($string, $pos + 3, 1)) - 0x80;
  504. $char_code = ($byte[1] << 18) + ($byte[2] << 12) + ($byte[3] << 6) + $byte[4];
  505. $pos += 4;
  506. } elseif (($ascii >= 0xE0) && ($ascii < 0xF0)) {
  507. $byte[1] = ord(substr($string, $pos, 1)) - 0xE0;
  508. $byte[2] = ord(substr($string, $pos + 1, 1)) - 0x80;
  509. $byte[3] = ord(substr($string, $pos + 2, 1)) - 0x80;
  510. $char_code = ($byte[1] << 12) + ($byte[2] << 6) + $byte[3];
  511. $pos += 3;
  512. } elseif (($ascii >= 0xC0) && ($ascii < 0xE0)) {
  513. $byte[1] = ord(substr($string, $pos, 1)) - 0xC0;
  514. $byte[2] = ord(substr($string, $pos + 1, 1)) - 0x80;
  515. $char_code = ($byte[1] << 6) + $byte[2];
  516. $pos += 2;
  517. } else {
  518. $char_code = ord(substr($string, $pos, 1));
  519. $pos += 1;
  520. }
  521. if ($char_code < 0x80)
  522. $out .= chr($char_code);
  523. else
  524. $out .= '&#' . str_pad($char_code, 5, '0', STR_PAD_LEFT) . ';';
  525. }
  526. return $out;
  527. }
  528. }
  529. /* * **************************************************************************************************** */
  530. global $UTF8_TABLES;
  531. $UTF8_TABLES['strtolower'] = array(
  532. "Z" => "z", "Y" => "y", "X" => "x", "W" => "w", "V" => "v", "U" => "u",
  533. "T" => "t", "S" => "s", "R" => "r", "Q" => "q", "P" => "p", "O" => "o",
  534. "N" => "n", "M" => "m", "L" => "l", "K" => "k", "J" => "j", "I" => "i",
  535. "H" => "h", "G" => "g", "F" => "f", "E" => "e", "D" => "d", "C" => "c",
  536. "B" => "b", "A" => "a", "Å" => "å", "K" => "k", "Ω" => "ω", "Ώ" => "ώ",
  537. "Ὼ" => "ὼ", "Ό" => "ό", "Ὸ" => "ὸ", "Ῥ" => "ῥ", "Ύ" => "ύ", "Ὺ" => "ὺ",
  538. "Ῡ" => "ῡ", "Ῠ" => "� ", "Ί" => "ί", "Ὶ" => "ὶ", "Ῑ" => "ῑ", "Ῐ" => "ῐ",
  539. "Ή" => "ή", "Ὴ" => "ὴ", "Έ" => "έ", "Ὲ" => "ὲ", "Ά" => "ά", "Ὰ" => "ὰ",
  540. "Ᾱ" => "ᾱ", "Ᾰ" => "ᾰ", "Ὧ" => "ὧ", "Ὦ" => "ὦ", "Ὥ" => "ὥ", "Ὤ" => "ὤ",
  541. "Ὣ" => "ὣ", "Ὢ" => "ὢ", "Ὡ" => "ὡ", "Ὠ" => "� ", "Ὗ" => "ὗ", "Ὕ" => "ὕ",
  542. "Ὓ" => "ὓ", "Ὑ" => "ὑ", "Ὅ" => "ὅ", "Ὄ" => "ὄ", "Ὃ" => "ὃ", "Ὂ" => "ὂ",
  543. "Ὁ" => "ὁ", "Ὀ" => "ὀ", "Ἷ" => "ἷ", "Ἶ" => "ἶ", "Ἵ" => "ἵ", "Ἴ" => "ἴ",
  544. "Ἳ" => "ἳ", "Ἲ" => "ἲ", "Ἱ" => "ἱ", "Ἰ" => "ἰ", "Ἧ" => "ἧ", "Ἦ" => "ἦ",
  545. "Ἥ" => "ἥ", "Ἤ" => "ἤ", "Ἣ" => "ἣ", "Ἢ" => "ἢ", "Ἡ" => "ἡ", "Ἠ" => "� ",
  546. "Ἕ" => "ἕ", "Ἔ" => "ἔ", "Ἓ" => "ἓ", "Ἒ" => "ἒ", "Ἑ" => "ἑ", "Ἐ" => "ἐ",
  547. "Ἇ" => "ἇ", "Ἆ" => "ἆ", "Ἅ" => "ἅ", "Ἄ" => "ἄ", "Ἃ" => "ἃ", "Ἂ" => "ἂ",
  548. "Ἁ" => "ἁ", "Ἀ" => "ἀ", "Ỹ" => "ỹ", "Ỷ" => "ỷ", "Ỵ" => "ỵ", "Ỳ" => "ỳ",
  549. "Ự" => "ự", "Ữ" => "ữ", "Ử" => "ử", "Ừ" => "ừ", "Ứ" => "ứ", "Ủ" => "ủ",
  550. "Ụ" => "ụ", "Ợ" => "ợ", "� " => "ỡ", "Ở" => "ở", "Ờ" => "ờ", "Ớ" => "ớ",
  551. "Ộ" => "ộ", "Ỗ" => "ỗ", "Ổ" => "ổ", "Ồ" => "ồ", "Ố" => "ố", "Ỏ" => "ỏ",
  552. "Ọ" => "ọ", "Ị" => "ị", "Ỉ" => "ỉ", "Ệ" => "ệ", "Ễ" => "ễ", "Ể" => "ể",
  553. "Ề" => "ề", "Ế" => "ế", "Ẽ" => "ẽ", "Ẻ" => "ẻ", "Ẹ" => "ẹ", "Ặ" => "ặ",
  554. "Ẵ" => "ẵ", "Ẳ" => "ẳ", "Ằ" => "ằ", "Ắ" => "ắ", "Ậ" => "ậ", "Ẫ" => "ẫ",
  555. "Ẩ" => "ẩ", "Ầ" => "ầ", "Ấ" => "ấ", "Ả" => "ả", "� " => "ạ", "Ẕ" => "ẕ",
  556. "Ẓ" => "ẓ", "Ẑ" => "ẑ", "Ẏ" => "ẏ", "Ẍ" => "ẍ", "Ẋ" => "ẋ", "Ẉ" => "ẉ",
  557. "Ẇ" => "ẇ", "Ẅ" => "ẅ", "Ẃ" => "ẃ", "Ẁ" => "ẁ", "Ṿ" => "ṿ", "Ṽ" => "ṽ",
  558. "Ṻ" => "ṻ", "Ṹ" => "ṹ", "Ṷ" => "ṷ", "Ṵ" => "ṵ", "Ṳ" => "ṳ", "Ṱ" => "ṱ",
  559. "Ṯ" => "ṯ", "Ṭ" => "ṭ", "Ṫ" => "ṫ", "Ṩ" => "ṩ", "Ṧ" => "ṧ", "Ṥ" => "ṥ",
  560. "Ṣ" => "ṣ", "� " => "ṡ", "Ṟ" => "ṟ", "Ṝ" => "ṝ", "Ṛ" => "ṛ", "Ṙ" => "ṙ",
  561. "Ṗ" => "ṗ", "Ṕ" => "ṕ", "Ṓ" => "ṓ", "Ṑ" => "ṑ", "Ṏ" => "ṏ", "Ṍ" => "ṍ",
  562. "Ṋ" => "ṋ", "Ṉ" => "ṉ", "Ṇ" => "ṇ", "Ṅ" => "ṅ", "Ṃ" => "ṃ", "Ṁ" => "ṁ",
  563. "Ḿ" => "ḿ", "Ḽ" => "ḽ", "Ḻ" => "ḻ", "Ḹ" => "ḹ", "Ḷ" => "ḷ", "Ḵ" => "ḵ",
  564. "Ḳ" => "ḳ", "Ḱ" => "ḱ", "Ḯ" => "ḯ", "Ḭ" => "ḭ", "Ḫ" => "ḫ", "Ḩ" => "ḩ",
  565. "Ḧ" => "ḧ", "Ḥ" => "ḥ", "Ḣ" => "ḣ", "� " => "ḡ", "Ḟ" => "ḟ", "Ḝ" => "ḝ",
  566. "Ḛ" => "ḛ", "Ḙ" => "ḙ", "Ḗ" => "ḗ", "Ḕ" => "ḕ", "Ḓ" => "ḓ", "Ḑ" => "ḑ",
  567. "Ḏ" => "ḏ", "Ḍ" => "ḍ", "Ḋ" => "ḋ", "Ḉ" => "ḉ", "Ḇ" => "ḇ", "Ḅ" => "ḅ",
  568. "Ḃ" => "ḃ", "Ḁ" => "ḁ", "Ֆ" => "ֆ", "Օ" => "օ", "Ք" => "ք", "Փ" => "փ",
  569. "Ւ" => "ւ", "Ց" => "ց", "Ր" => "ր", "Տ" => "տ", "Վ" => "վ", "Ս" => "ս",
  570. "Ռ" => "ռ", "Ջ" => "ջ", "Պ" => "պ", "Չ" => "չ", "Ո" => "ո", "Շ" => "շ",
  571. "Ն" => "ն", "Յ" => "յ", "Մ" => "մ", "Ճ" => "ճ", "Ղ" => "ղ", "Ձ" => "ձ",
  572. "Հ" => "հ", "Կ" => "կ", "Ծ" => "ծ", "Խ" => "խ", "Լ" => "լ", "Ի" => "ի",
  573. "Ժ" => "ժ", "Թ" => "թ", "Ը" => "ը", "Է" => "է", "Զ" => "զ", "Ե" => "ե",
  574. "Դ" => "դ", "Գ" => "գ", "Բ" => "բ", "Ա" => "ա", "Ԏ" => "ԏ", "Ԍ" => "ԍ",
  575. "Ԋ" => "ԋ", "Ԉ" => "ԉ", "Ԇ" => "ԇ", "Ԅ" => "ԅ", "Ԃ" => "ԃ", "Ԁ" => "ԁ",
  576. "Ӹ" => "ӹ", "Ӵ" => "ӵ", "Ӳ" => "ӳ", "Ӱ" => "ӱ", "Ӯ" => "ӯ", "Ӭ" => "ӭ",
  577. "Ӫ" => "ӫ", "Ө" => "ө", "Ӧ" => "ӧ", "Ӥ" => "ӥ", "Ӣ" => "ӣ", "� " => "ӡ",
  578. "Ӟ" => "ӟ", "Ӝ" => "ӝ", "Ӛ" => "ӛ", "Ә" => "ә", "Ӗ" => "ӗ", "Ӕ" => "ӕ",
  579. "Ӓ" => "ӓ", "Ӑ" => "ӑ", "Ӎ" => "ӎ", "Ӌ" => "ӌ", "Ӊ" => "ӊ", "Ӈ" => "ӈ",
  580. "Ӆ" => "ӆ", "Ӄ" => "ӄ", "Ӂ" => "ӂ", "Ҿ" => "ҿ", "Ҽ" => "ҽ", "Һ" => "һ",
  581. "Ҹ" => "ҹ", "Ҷ" => "ҷ", "Ҵ" => "ҵ", "Ҳ" => "ҳ", "Ұ" => "ұ", "Ү" => "ү",
  582. "Ҭ" => "ҭ", "Ҫ" => "ҫ", "Ҩ" => "ҩ", "Ҧ" => "ҧ", "Ҥ" => "ҥ", "Ң" => "ң",
  583. "� " => "ҡ", "Ҟ" => "ҟ", "Ҝ" => "ҝ", "Қ" => "қ", "Ҙ" => "ҙ", "Җ" => "җ",
  584. "Ҕ" => "ҕ", "Ғ" => "ғ", "Ґ" => "ґ", "Ҏ" => "ҏ", "Ҍ" => "ҍ", "Ҋ" => "ҋ",
  585. "Ҁ" => "ҁ", "Ѿ" => "ѿ", "Ѽ" => "ѽ", "Ѻ" => "ѻ", "Ѹ" => "ѹ", "Ѷ" => "ѷ",
  586. "Ѵ" => "ѵ", "Ѳ" => "ѳ", "Ѱ" => "ѱ", "Ѯ" => "ѯ", "Ѭ" => "ѭ", "Ѫ" => "ѫ",
  587. "Ѩ" => "ѩ", "Ѧ" => "ѧ", "Ѥ" => "ѥ", "Ѣ" => "ѣ", "� " => "ѡ", "Я" => "я",
  588. "Ю" => "ю", "Э" => "э", "Ь" => "ь", "Ы" => "ы", "Ъ" => "ъ", "Щ" => "щ",
  589. "Ш" => "ш", "Ч" => "ч", "Ц" => "ц", "Х" => "х", "Ф" => "ф", "У" => "у",
  590. "Т" => "т", "С" => "с", "� " => "р", "П" => "п", "О" => "о", "Н" => "н",
  591. "М" => "м", "Л" => "л", "К" => "к", "Й" => "й", "И" => "и", "З" => "з",
  592. "Ж" => "ж", "Е" => "е", "Д" => "д", "Г" => "г", "В" => "в", "Б" => "б",
  593. "А" => "а", "Џ" => "џ", "Ў" => "ў", "Ѝ" => "ѝ", "Ќ" => "ќ", "Ћ" => "ћ",
  594. "Њ" => "њ", "Љ" => "љ", "Ј" => "ј", "Ї" => "ї", "І" => "і", "Ѕ" => "ѕ",
  595. "Є" => "є", "Ѓ" => "ѓ", "Ђ" => "ђ", "Ё" => "ё", "Ѐ" => "ѐ", "ϴ" => "θ",
  596. "Ϯ" => "ϯ", "Ϭ" => "ϭ", "Ϫ" => "ϫ", "Ϩ" => "ϩ", "Ϧ" => "ϧ", "Ϥ" => "ϥ",
  597. "Ϣ" => "ϣ", "� " => "ϡ", "Ϟ" => "ϟ", "Ϝ" => "ϝ", "Ϛ" => "ϛ", "Ϙ" => "ϙ",
  598. "Ϋ" => "ϋ", "Ϊ" => "ϊ", "Ω" => "ω", "Ψ" => "ψ", "Χ" => "χ", "Φ" => "φ",
  599. "Υ" => "υ", "Τ" => "τ", "Σ" => "σ", "Ρ" => "ρ", "� " => "π", "Ο" => "ο",
  600. "Ξ" => "ξ", "Ν" => "ν", "Μ" => "μ", "Λ" => "λ", "Κ" => "κ", "Ι" => "ι",
  601. "Θ" => "θ", "Η" => "η", "Ζ" => "ζ", "Ε" => "ε", "Δ" => "δ", "Γ" => "γ",
  602. "Β" => "β", "Α" => "α", "Ώ" => "ώ", "Ύ" => "ύ", "Ό" => "ό", "Ί" => "ί",
  603. "Ή" => "ή", "Έ" => "έ", "Ά" => "ά", "Ȳ" => "ȳ", "Ȱ" => "ȱ", "Ȯ" => "ȯ",
  604. "Ȭ" => "ȭ", "Ȫ" => "ȫ", "Ȩ" => "ȩ", "Ȧ" => "ȧ", "Ȥ" => "ȥ", "Ȣ" => "ȣ",
  605. "� " => "ƞ", "Ȟ" => "ȟ", "Ȝ" => "ȝ", "Ț" => "ț", "Ș" => "ș", "Ȗ" => "ȗ",
  606. "Ȕ" => "ȕ", "Ȓ" => "ȓ", "Ȑ" => "ȑ", "Ȏ" => "ȏ", "Ȍ" => "ȍ", "Ȋ" => "ȋ",
  607. "Ȉ" => "ȉ", "Ȇ" => "ȇ", "Ȅ" => "ȅ", "Ȃ" => "ȃ", "Ȁ" => "ȁ", "Ǿ" => "ǿ",
  608. "Ǽ" => "ǽ", "Ǻ" => "ǻ", "Ǹ" => "ǹ", "Ƿ" => "ƿ", "Ƕ" => "ƕ", "Ǵ" => "ǵ",
  609. "DZ" => "dz", "Ǯ" => "ǯ", "Ǭ" => "ǭ", "Ǫ" => "ǫ", "Ǩ" => "ǩ", "Ǧ" => "ǧ",
  610. "Ǥ" => "ǥ", "Ǣ" => "ǣ", "� " => "ǡ", "Ǟ" => "ǟ", "Ǜ" => "ǜ", "Ǚ" => "ǚ",
  611. "Ǘ" => "ǘ", "Ǖ" => "ǖ", "Ǔ" => "ǔ", "Ǒ" => "ǒ", "Ǐ" => "ǐ", "Ǎ" => "ǎ",
  612. "NJ" => "nj", "LJ" => "lj", "DŽ" => "dž", "Ƽ" => "ƽ", "Ƹ" => "ƹ", "Ʒ" => "ʒ",
  613. "Ƶ" => "ƶ", "Ƴ" => "ƴ", "Ʋ" => "ʋ", "Ʊ" => "ʊ", "Ư" => "ư", "Ʈ" => "ʈ",
  614. "Ƭ" => "ƭ", "Ʃ" => "ʃ", "Ƨ" => "ƨ", "Ʀ" => "ʀ", "Ƥ" => "ƥ", "Ƣ" => "ƣ",
  615. "� " => "ơ", "Ɵ" => "ɵ", "Ɲ" => "ɲ", "Ɯ" => "ɯ", "Ƙ" => "ƙ", "Ɨ" => "ɨ",
  616. "Ɩ" => "ɩ", "Ɣ" => "ɣ", "Ɠ" => "� ", "Ƒ" => "ƒ", "Ɛ" => "ɛ", "Ə" => "ə",
  617. "Ǝ" => "ǝ", "Ƌ" => "ƌ", "Ɗ" => "ɗ", "Ɖ" => "ɖ", "Ƈ" => "ƈ", "Ɔ" => "ɔ",
  618. "Ƅ" => "ƅ", "Ƃ" => "ƃ", "Ɓ" => "ɓ", "Ž" => "ž", "Ż" => "ż", "Ź" => "ź",
  619. "Ÿ" => "ÿ", "Ŷ" => "ŷ", "Ŵ" => "ŵ", "Ų" => "ų", "Ű" => "ű", "Ů" => "ů",
  620. "Ŭ" => "ŭ", "Ū" => "ū", "Ũ" => "ũ", "Ŧ" => "ŧ", "Ť" => "ť", "Ţ" => "ţ",
  621. "� " => "š", "Ş" => "ş", "Ŝ" => "ŝ", "Ś" => "ś", "Ř" => "ř", "Ŗ" => "ŗ",
  622. "Ŕ" => "ŕ", "Œ" => "œ", "Ő" => "ő", "Ŏ" => "ŏ", "Ō" => "ō", "Ŋ" => "ŋ",
  623. "Ň" => "ň", "Ņ" => "ņ", "Ń" => "ń", "Ł" => "ł", "Ŀ" => "ŀ", "Ľ" => "ľ",
  624. "Ļ" => "ļ", "Ĺ" => "ĺ", "Ķ" => "ķ", "Ĵ" => "ĵ", "IJ" => "ij", "İ" => "i",
  625. "Į" => "į", "Ĭ" => "ĭ", "Ī" => "ī", "Ĩ" => "ĩ", "Ħ" => "ħ", "Ĥ" => "ĥ",
  626. "Ģ" => "ģ", "� " => "ġ", "Ğ" => "ğ", "Ĝ" => "ĝ", "Ě" => "ě", "Ę" => "ę",
  627. "Ė" => "ė", "Ĕ" => "ĕ", "Ē" => "ē", "Đ" => "đ", "Ď" => "ď", "Č" => "č",
  628. "Ċ" => "ċ", "Ĉ" => "ĉ", "Ć" => "ć", "Ą" => "ą", "Ă" => "ă", "Ā" => "ā",
  629. "Þ" => "þ", "Ý" => "ý", "Ü" => "ü", "Û" => "û", "Ú" => "ú", "Ù" => "ù",
  630. "Ø" => "ø", "Ö" => "ö", "Õ" => "õ", "Ô" => "ô", "Ó" => "ó", "Ò" => "ò",
  631. "Ñ" => "ñ", "Ð" => "ð", "Ï" => "ï", "Î" => "î", "Í" => "í", "Ì" => "ì",
  632. "Ë" => "ë", "Ê" => "ê", "É" => "é", "È" => "è", "Ç" => "ç", "Æ" => "æ",
  633. "Å" => "å", "Ä" => "ä", "Ã" => "ã", "Â" => "â", "Á" => "á", "À" => "� ",
  634. "Z" => "z", "Y" => "y", "X" => "x", "W" => "w", "V" => "v", "U" => "u",
  635. "T" => "t", "S" => "s", "R" => "r", "Q" => "q", "P" => "p", "O" => "o",
  636. "N" => "n", "M" => "m", "L" => "l", "K" => "k", "J" => "j", "I" => "i",
  637. "H" => "h", "G" => "g", "F" => "f", "E" => "e", "D" => "d", "C" => "c",
  638. "B" => "b", "A" => "a"
  639. );
  640. $UTF8_TABLES['strtoupper'] = array(
  641. "z" => "Z", "y" => "Y", "x" => "X", "w" => "W", "v" => "V", "u" => "U",
  642. "t" => "T", "s" => "S", "r" => "R", "q" => "Q", "p" => "P", "o" => "O",
  643. "n" => "N", "m" => "M", "l" => "L", "k" => "K", "j" => "J", "i" => "I",
  644. "h" => "H", "g" => "G", "f" => "F", "e" => "E", "d" => "D", "c" => "C",
  645. "b" => "B", "a" => "A", "ῳ" => "ῼ", "ῥ" => "Ῥ", "ῡ" => "Ῡ", "� " => "Ῠ",
  646. "ῑ" => "Ῑ", "ῐ" => "Ῐ", "ῃ" => "ῌ", "ι" => "Ι", "ᾳ" => "ᾼ", "ᾱ" => "Ᾱ",
  647. "ᾰ" => "Ᾰ", "ᾧ" => "ᾯ", "ᾦ" => "ᾮ", "ᾥ" => "ᾭ", "ᾤ" => "ᾬ", "ᾣ" => "ᾫ",
  648. "ᾢ" => "ᾪ", "ᾡ" => "ᾩ", "� " => "ᾨ", "ᾗ" => "ᾟ", "ᾖ" => "ᾞ", "ᾕ" => "ᾝ",
  649. "ᾔ" => "ᾜ", "ᾓ" => "ᾛ", "ᾒ" => "ᾚ", "ᾑ" => "ᾙ", "ᾐ" => "ᾘ", "ᾇ" => "ᾏ",
  650. "ᾆ" => "ᾎ", "ᾅ" => "ᾍ", "ᾄ" => "ᾌ", "ᾃ" => "ᾋ", "ᾂ" => "ᾊ", "ᾁ" => "ᾉ",
  651. "ᾀ" => "ᾈ", "ώ" => "Ώ", "ὼ" => "Ὼ", "ύ" => "Ύ", "ὺ" => "Ὺ", "ό" => "Ό",
  652. "ὸ" => "Ὸ", "ί" => "Ί", "ὶ" => "Ὶ", "ή" => "Ή", "ὴ" => "Ὴ", "έ" => "Έ",
  653. "ὲ" => "Ὲ", "ά" => "Ά", "ὰ" => "Ὰ", "ὧ" => "Ὧ", "ὦ" => "Ὦ", "ὥ" => "Ὥ",
  654. "ὤ" => "Ὤ", "ὣ" => "Ὣ", "ὢ" => "Ὢ", "ὡ" => "Ὡ", "� " => "Ὠ", "ὗ" => "Ὗ",
  655. "ὕ" => "Ὕ", "ὓ" => "Ὓ", "ὑ" => "Ὑ", "ὅ" => "Ὅ", "ὄ" => "Ὄ", "ὃ" => "Ὃ",
  656. "ὂ" => "Ὂ", "ὁ" => "Ὁ", "ὀ" => "Ὀ", "ἷ" => "Ἷ", "ἶ" => "Ἶ", "ἵ" => "Ἵ",
  657. "ἴ" => "Ἴ", "ἳ" => "Ἳ", "ἲ" => "Ἲ", "ἱ" => "Ἱ", "ἰ" => "Ἰ", "ἧ" => "Ἧ",
  658. "ἦ" => "Ἦ", "ἥ" => "Ἥ", "ἤ" => "Ἤ", "ἣ" => "Ἣ", "ἢ" => "Ἢ", "ἡ" => "Ἡ",
  659. "� " => "Ἠ", "ἕ" => "Ἕ", "ἔ" => "Ἔ", "ἓ" => "Ἓ", "ἒ" => "Ἒ", "ἑ" => "Ἑ",
  660. "ἐ" => "Ἐ", "ἇ" => "Ἇ", "ἆ" => "Ἆ", "ἅ" => "Ἅ", "ἄ" => "Ἄ", "ἃ" => "Ἃ",
  661. "ἂ" => "Ἂ", "ἁ" => "Ἁ", "ἀ" => "Ἀ", "ỹ" => "Ỹ", "ỷ" => "Ỷ", "ỵ" => "Ỵ",
  662. "ỳ" => "Ỳ", "ự" => "Ự", "ữ" => "Ữ", "ử" => "Ử", "ừ" => "Ừ", "ứ" => "Ứ",
  663. "ủ" => "Ủ", "ụ" => "Ụ", "ợ" => "Ợ", "ỡ" => "� ", "ở" => "Ở", "ờ" => "Ờ",
  664. "ớ" => "Ớ", "ộ" => "Ộ", "ỗ" => "Ỗ", "ổ" => "Ổ", "ồ" => "Ồ", "ố" => "Ố",
  665. "ỏ" => "Ỏ", "ọ" => "Ọ", "ị" => "Ị", "ỉ" => "Ỉ", "ệ" => "Ệ", "ễ" => "Ễ",
  666. "ể" => "Ể", "ề" => "Ề", "ế" => "Ế", "ẽ" => "Ẽ", "ẻ" => "Ẻ", "ẹ" => "Ẹ",
  667. "ặ" => "Ặ", "ẵ" => "Ẵ", "ẳ" => "Ẳ", "ằ" => "Ằ", "ắ" => "Ắ", "ậ" => "Ậ",
  668. "ẫ" => "Ẫ", "ẩ" => "Ẩ", "ầ" => "Ầ", "ấ" => "Ấ", "ả" => "Ả", "ạ" => "� ",
  669. "ẛ" => "� ", "ẕ" => "Ẕ", "ẓ" => "Ẓ", "ẑ" => "Ẑ", "ẏ" => "Ẏ", "ẍ" => "Ẍ",
  670. "ẋ" => "Ẋ", "ẉ" => "Ẉ", "ẇ" => "Ẇ", "ẅ" => "Ẅ", "ẃ" => "Ẃ", "ẁ" => "Ẁ",
  671. "ṿ" => "Ṿ", "ṽ" => "Ṽ", "ṻ" => "Ṻ", "ṹ" => "Ṹ", "ṷ" => "Ṷ", "ṵ" => "Ṵ",
  672. "ṳ" => "Ṳ", "ṱ" => "Ṱ", "ṯ" => "Ṯ", "ṭ" => "Ṭ", "ṫ" => "Ṫ", "ṩ" => "Ṩ",
  673. "ṧ" => "Ṧ", "ṥ" => "Ṥ", "ṣ" => "Ṣ", "ṡ" => "� ", "ṟ" => "Ṟ", "ṝ" => "Ṝ",
  674. "ṛ" => "Ṛ", "ṙ" => "Ṙ", "ṗ" => "Ṗ", "ṕ" => "Ṕ", "ṓ" => "Ṓ", "ṑ" => "Ṑ",
  675. "ṏ" => "Ṏ", "ṍ" => "Ṍ", "ṋ" => "Ṋ", "ṉ" => "Ṉ", "ṇ" => "Ṇ", "ṅ" => "Ṅ",
  676. "ṃ" => "Ṃ", "ṁ" => "Ṁ", "ḿ" => "Ḿ", "ḽ" => "Ḽ", "ḻ" => "Ḻ", "ḹ" => "Ḹ",
  677. "ḷ" => "Ḷ", "ḵ" => "Ḵ", "ḳ" => "Ḳ", "ḱ" => "Ḱ", "ḯ" => "Ḯ", "ḭ" => "Ḭ",
  678. "ḫ" => "Ḫ", "ḩ" => "Ḩ", "ḧ" => "Ḧ", "ḥ" => "Ḥ", "ḣ" => "Ḣ", "ḡ" => "� ",
  679. "ḟ" => "Ḟ", "ḝ" => "Ḝ", "ḛ" => "Ḛ", "ḙ" => "Ḙ", "ḗ" => "Ḗ", "ḕ" => "Ḕ",
  680. "ḓ" => "Ḓ", "ḑ" => "Ḑ", "ḏ" => "Ḏ", "ḍ" => "Ḍ", "ḋ" => "Ḋ", "ḉ" => "Ḉ",
  681. "ḇ" => "Ḇ", "ḅ" => "Ḅ", "ḃ" => "Ḃ", "ḁ" => "Ḁ", "ֆ" => "Ֆ", "օ" => "Օ",
  682. "ք" => "Ք", "փ" => "Փ", "ւ" => "Ւ", "ց" => "Ց", "ր" => "Ր", "տ" => "Տ",
  683. "վ" => "Վ", "ս" => "Ս", "ռ" => "Ռ", "ջ" => "Ջ", "պ" => "Պ", "չ" => "Չ",
  684. "ո" => "Ո", "շ" => "Շ", "ն" => "Ն", "յ" => "Յ", "մ" => "Մ", "ճ" => "Ճ",
  685. "ղ" => "Ղ", "ձ" => "Ձ", "հ" => "Հ", "կ" => "Կ", "ծ" => "Ծ", "խ" => "Խ",
  686. "լ" => "Լ", "ի" => "Ի", "ժ" => "Ժ", "թ" => "Թ", "ը" => "Ը", "է" => "Է",
  687. "զ" => "Զ", "ե" => "Ե", "դ" => "Դ", "գ" => "Գ", "բ" => "Բ", "ա" => "Ա",
  688. "ԏ" => "Ԏ", "ԍ" => "Ԍ", "ԋ" => "Ԋ", "ԉ" => "Ԉ", "ԇ" => "Ԇ", "ԅ" => "Ԅ",
  689. "ԃ" => "Ԃ", "ԁ" => "Ԁ", "ӹ" => "Ӹ", "ӵ" => "Ӵ", "ӳ" => "Ӳ", "ӱ" => "Ӱ",
  690. "ӯ" => "Ӯ", "ӭ" => "Ӭ", "ӫ" => "Ӫ", "ө" => "Ө", "ӧ" => "Ӧ", "ӥ" => "Ӥ",
  691. "ӣ" => "Ӣ", "ӡ" => "� ", "ӟ" => "Ӟ", "ӝ" => "Ӝ", "ӛ" => "Ӛ", "ә" => "Ә",
  692. "ӗ" => "Ӗ", "ӕ" => "Ӕ", "ӓ" => "Ӓ", "ӑ" => "Ӑ", "ӎ" => "Ӎ", "ӌ" => "Ӌ",
  693. "ӊ" => "Ӊ", "ӈ" => "Ӈ", "ӆ" => "Ӆ", "ӄ" => "Ӄ", "ӂ" => "Ӂ", "ҿ" => "Ҿ",
  694. "ҽ" => "Ҽ", "һ" => "Һ", "ҹ" => "Ҹ", "ҷ" => "Ҷ", "ҵ" => "Ҵ", "ҳ" => "Ҳ",
  695. "ұ" => "Ұ", "ү" => "Ү", "ҭ" => "Ҭ", "ҫ" => "Ҫ", "ҩ" => "Ҩ", "ҧ" => "Ҧ",
  696. "ҥ" => "Ҥ", "ң" => "Ң", "ҡ" => "� ", "ҟ" => "Ҟ", "ҝ" => "Ҝ", "қ" => "Қ",
  697. "ҙ" => "Ҙ", "җ" => "Җ", "ҕ" => "Ҕ", "ғ" => "Ғ", "ґ" => "Ґ", "ҏ" => "Ҏ",
  698. "ҍ" => "Ҍ", "ҋ" => "Ҋ", "ҁ" => "Ҁ", "ѿ" => "Ѿ", "ѽ" => "Ѽ", "ѻ" => "Ѻ",
  699. "ѹ" => "Ѹ", "ѷ" => "Ѷ", "ѵ" => "Ѵ", "ѳ" => "Ѳ", "ѱ" => "Ѱ", "ѯ" => "Ѯ",
  700. "ѭ" => "Ѭ", "ѫ" => "Ѫ", "ѩ" => "Ѩ", "ѧ" => "Ѧ", "ѥ" => "Ѥ", "ѣ" => "Ѣ",
  701. "ѡ" => "� ", "џ" => "Џ", "ў" => "Ў", "ѝ" => "Ѝ", "ќ" => "Ќ", "ћ" => "Ћ",
  702. "њ" => "Њ", "љ" => "Љ", "ј" => "Ј", "ї" => "Ї", "і" => "І", "ѕ" => "Ѕ",
  703. "є" => "Є", "ѓ" => "Ѓ", "ђ" => "Ђ", "ё" => "Ё", "ѐ" => "Ѐ", "я" => "Я",
  704. "ю" => "Ю", "э" => "Э", "ь" => "Ь", "ы" => "Ы", "ъ" => "Ъ", "щ" => "Щ",
  705. "ш" => "Ш", "ч" => "Ч", "ц" => "Ц", "х" => "Х", "ф" => "Ф", "у" => "У",
  706. "т" => "Т", "с" => "С", "р" => "� ", "п" => "П", "о" => "О", "н" => "Н",
  707. "м" => "М", "л" => "Л", "к" => "К", "й" => "Й", "и" => "И", "з" => "З",
  708. "ж" => "Ж", "е" => "Е", "д" => "Д", "г" => "Г", "в" => "В", "б" => "Б",
  709. "а" => "А", "ϵ" => "Ε", "ϲ" => "Σ", "ϱ" => "Ρ", "ϰ" => "Κ", "ϯ" => "Ϯ",
  710. "ϭ" => "Ϭ", "ϫ" => "Ϫ", "ϩ" => "Ϩ", "ϧ" => "Ϧ", "ϥ" => "Ϥ", "ϣ" => "Ϣ",
  711. "ϡ" => "� ", "ϟ" => "Ϟ", "ϝ" => "Ϝ", "ϛ" => "Ϛ", "ϙ" => "Ϙ", "ϖ" => "� ",
  712. "ϕ" => "Φ", "ϑ" => "Θ", "ϐ" => "Β", "ώ" => "Ώ", "ύ" => "Ύ", "ό" => "Ό",
  713. "ϋ" => "Ϋ", "ϊ" => "Ϊ", "ω" => "Ω", "ψ" => "Ψ", "χ" => "Χ", "φ" => "Φ",
  714. "υ" => "Υ", "τ" => "Τ", "σ" => "Σ", "ς" => "Σ", "ρ" => "Ρ", "π" => "� ",
  715. "ο" => "Ο", "ξ" => "Ξ", "ν" => "Ν", "μ" => "Μ", "λ" => "Λ", "κ" => "Κ",
  716. "ι" => "Ι", "θ" => "Θ", "η" => "Η", "ζ" => "Ζ", "ε" => "Ε", "δ" => "Δ",
  717. "γ" => "Γ", "β" => "Β", "α" => "Α", "ί" => "Ί", "ή" => "Ή", "έ" => "Έ",
  718. "ά" => "Ά", "ʒ" => "Ʒ", "ʋ" => "Ʋ", "ʊ" => "Ʊ", "ʈ" => "Ʈ", "ʃ" => "Ʃ",
  719. "ʀ" => "Ʀ", "ɵ" => "Ɵ", "ɲ" => "Ɲ", "ɯ" => "Ɯ", "ɩ" => "Ɩ", "ɨ" => "Ɨ",
  720. "ɣ" => "Ɣ", "� " => "Ɠ", "ɛ" => "Ɛ", "ə" => "Ə", "ɗ" => "Ɗ", "ɖ" => "Ɖ",
  721. "ɔ" => "Ɔ", "ɓ" => "Ɓ", "ȳ" => "Ȳ", "ȱ" => "Ȱ", "ȯ" => "Ȯ", "ȭ" => "Ȭ",
  722. "ȫ" => "Ȫ", "ȩ" => "Ȩ", "ȧ" => "Ȧ", "ȥ" => "Ȥ", "ȣ" => "Ȣ", "ȟ" => "Ȟ",
  723. "ȝ" => "Ȝ", "ț" => "Ț", "ș" => "Ș", "ȗ" => "Ȗ", "ȕ" => "Ȕ", "ȓ" => "Ȓ",
  724. "ȑ" => "Ȑ", "ȏ" => "Ȏ", "ȍ" => "Ȍ", "ȋ" => "Ȋ", "ȉ" => "Ȉ", "ȇ" => "Ȇ",
  725. "ȅ" => "Ȅ", "ȃ" => "Ȃ", "ȁ" => "Ȁ", "ǿ" => "Ǿ", "ǽ" => "Ǽ", "ǻ" => "Ǻ",
  726. "ǹ" => "Ǹ", "ǵ" => "Ǵ", "dz" => "Dz", "ǯ" => "Ǯ", "ǭ" => "Ǭ", "ǫ" => "Ǫ",
  727. "ǩ" => "Ǩ", "ǧ" => "Ǧ", "ǥ" => "Ǥ", "ǣ" => "Ǣ", "ǡ" => "� ", "ǟ" => "Ǟ",
  728. "ǝ" => "Ǝ", "ǜ" => "Ǜ", "ǚ" => "Ǚ", "ǘ" => "Ǘ", "ǖ" => "Ǖ", "ǔ" => "Ǔ",
  729. "ǒ" => "Ǒ", "ǐ" => "Ǐ", "ǎ" => "Ǎ", "nj" => "Nj", "lj" => "Lj", "dž" => "Dž",
  730. "ƿ" => "Ƿ", "ƽ" => "Ƽ", "ƹ" => "Ƹ", "ƶ" => "Ƶ", "ƴ" => "Ƴ", "ư" => "Ư",
  731. "ƭ" => "Ƭ", "ƨ" => "Ƨ", "ƥ" => "Ƥ", "ƣ" => "Ƣ", "ơ" => "� ", "ƞ" => "� ",
  732. "ƙ" => "Ƙ", "ƕ" => "Ƕ", "ƒ" => "Ƒ", "ƌ" => "Ƌ", "ƈ" => "Ƈ", "ƅ" => "Ƅ",
  733. "ƃ" => "Ƃ", "ſ" => "S", "ž" => "Ž", "ż" => "Ż", "ź" => "Ź", "ŷ" => "Ŷ",
  734. "ŵ" => "Ŵ", "ų" => "Ų", "ű" => "Ű", "ů" => "Ů", "ŭ" => "Ŭ", "ū" => "Ū",
  735. "ũ" => "Ũ", "ŧ" => "Ŧ", "ť" => "Ť", "ţ" => "Ţ", "š" => "� ", "ş" => "Ş",
  736. "ŝ" => "Ŝ", "ś" => "Ś", "ř" => "Ř", "ŗ" => "Ŗ", "ŕ" => "Ŕ", "œ" => "Œ",
  737. "ő" => "Ő", "ŏ" => "Ŏ", "ō" => "Ō", "ŋ" => "Ŋ", "ň" => "Ň", "ņ" => "Ņ",
  738. "ń" => "Ń", "ł" => "Ł", "ŀ" => "Ŀ", "ľ" => "Ľ", "ļ" => "Ļ", "ĺ" => "Ĺ",
  739. "ķ" => "Ķ", "ĵ" => "Ĵ", "ij" => "IJ", "ı" => "I", "į" => "Į", "ĭ" => "Ĭ",
  740. "ī" => "Ī", "ĩ" => "Ĩ", "ħ" => "Ħ", "ĥ" => "Ĥ", "ģ" => "Ģ", "ġ" => "� ",
  741. "ğ" => "Ğ", "ĝ" => "Ĝ", "ě" => "Ě", "ę" => "Ę", "ė" => "Ė", "ĕ" => "Ĕ",
  742. "ē" => "Ē", "đ" => "Đ", "ď" => "Ď", "č" => "Č", "ċ" => "Ċ", "ĉ" => "Ĉ",
  743. "ć" => "Ć", "ą" => "Ą", "ă" => "Ă", "ā" => "Ā", "ÿ" => "Ÿ", "þ" => "Þ",
  744. "ý" => "Ý", "ü" => "Ü", "û" => "Û", "ú" => "Ú", "ù" => "Ù", "ø" => "Ø",
  745. "ö" => "Ö", "õ" => "Õ", "ô" => "Ô", "ó" => "Ó", "ò" => "Ò", "ñ" => "Ñ",
  746. "ð" => "Ð", "ï" => "Ï", "î" => "Î", "í" => "Í", "ì" => "Ì", "ë" => "Ë",
  747. "ê" => "Ê", "é" => "É", "è" => "È", "ç" => "Ç", "æ" => "Æ", "å" => "Å",
  748. "ä" => "Ä", "ã" => "Ã", "â" => "Â", "á" => "Á", "� " => "À", "µ" => "Μ",
  749. "z" => "Z", "y" => "Y", "x" => "X", "w" => "W", "v" => "V", "u" => "U",
  750. "t" => "T", "s" => "S", "r" => "R", "q" => "Q", "p" => "P", "o" => "O",
  751. "n" => "N", "m" => "M", "l" => "L", "k" => "K", "j" => "J", "i" => "I",
  752. "h" => "H", "g" => "G", "f" => "F", "e" => "E", "d" => "D", "c" => "C",
  753. "b" => "B", "a" => "A"
  754. );
  755. /**
  756. * Multi-byte string support
  757. */
  758. if (!function_exists('mb_internal_encoding')) {
  759. function mb_strtolower($str) {
  760. return utf8::strtolower($str);
  761. }
  762. function mb_strtoupper($str) {
  763. return utf8::strtoupper($str);
  764. }
  765. function mb_strlen($str) {
  766. return utf8::strlen($str);
  767. }
  768. function mb_substr($str, $start, $length = NULL) {
  769. return utf8::substr($str, $start, $length);
  770. }
  771. function mb_strrpos($haystack, $needle) {
  772. return utf8::strrpos($haystack, $needle);
  773. }
  774. function mb_strpos($haystack, $needle, $offset = 0) {
  775. return utf8::strpos($haystack, $needle, $offset);
  776. }
  777. function mb_substr_count($haystack, $needle) {
  778. return utf8::substr_count($haystack, $needle);
  779. }
  780. }
  781. ?>