Статьи

US-ASCII транслитерация текста Unicode

Исходя из этого релиза , оказалось, что это оказалось проще, чем я думал — перенести 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.