Исходя из этого релиза , оказалось, что это оказалось проще, чем я думал — перенести Text :: Unidecode на PHP — код доступен здесь или отследить пакет utf8_to_ascii с главной страницы — выпустил его отдельно, чтобы сохранить оригинал (Perl ) лицензия, в то время как остальные вещи находятся под LGPL.
Теперь я должен отметить, что то, что я сделал, легко, по сравнению с потрясающей работой, которую Шон М. Берк проделал с Text :: Unidecode . Вам действительно нужно прочитать документацию, чтобы понять, что она делает и каковы ее ограничения, но, вкратце, она хранит «базу данных» символов Unicode и соответствующих разумных эквивалентов US-ASCII. Например, простым преобразованием будет «Zürich» в «Zuerich», где «ue» является обычной заменой «ü» в германских языках.
На самом деле я только понял, как хорошо Шон проделал работу по прохождению этого сэмплера UTF-8 через версию PHP — по приблизительным предположениям, он «что-то» сделал для 85% + не-ASCII символов в этом документе. Вот некоторые фрагменты, чтобы дать вам ощущение до и после;
До: * санскрит * / (стандартная транскрипция): / k? Ca? ? Aknomyattum; нопахинасти м? м. После: * санскрит * / (стандартная транскрипция): / kaca- saknomyattum; нопахинасти мам. До: * Греческий *: ????? ?? ??? ???????? ?????? ????? ?? ???? ??????. После: * греческий *: Mporo na phao spasmena gualia khoris na patho tipota. До: * англосаксонский * / (латиница): / Ic mæg glæs eotan ond ударил меня. После: * англосаксонский * / (лат.): / Ic maeg glaes eotan ond ударил меня. До: * Soenderjysk *: glass ka glasse стекло, когда в det go mæ naue. После: * Soenderjysk *: AE ka aee glass uhen at det go mae naue. До: * украинский *:? ???? ???? ????,? ???? ???? ?? ?????????. После: * Украинский *: я могу йсти шкло, и вони нии пошкодить. До: * фарси / персидский *:. ?? ?? ????? ????? ????? ??? ???? ????? После: * фарси / персидский *: .mn my twnm bdwni Hss drd shyshh bkhwrm
Все ли это имеет смысл для носителей языка, я не могу сказать (обратная связь приветствуется). Я полагаю, что это отчасти зависит от языка, например, это проще сделать с греческим, чем с фарси. Следует также отметить, что база данных Text :: Unidecode (которую я портировал с 1 на 1 — фактически есть скрипт для ее автоматизации) не является полностью полной — для некоторых символов и языков у нее нет данных.
Тем не менее, если эти языки не относятся к вашему сайту, это может быть очень полезно, когда вам нужен ASCII, а не UTF-8. Вы можете использовать это для имен файлов или критических «идентификаторов», таких как идентификатор пользователя, например, когда вы не хотите никакого риска «фишинга» или накладных расходов при обработке символов UTF-8. Вы могли бы также рассмотреть это для дружественных для поисковых систем URL-адресов — хотя современные браузеры в значительной степени поддерживают UTF-8 в URL-адресах, фишинг снова является проблемой, и он может быть умнее не делать этого.
В любом случае — первая версия PHP «работает», хотя, без сомнения, она может стать быстрее (хотя я очень сомневаюсь, что она будет работать так же быстро, как версия Perl). Это также может быть легко перенесено на другие языки, такие как Python и Ruby.