#php #unicode #transliteration
#php #Юникод #транслитерация
Вопрос:
Я использую эту функцию для транслитерации кириллических слов на латиницу:
$string = transliterator_transliterate('Any-Latin; NFD; [:Nonspacing Mark:] Remove; NFC;', $name);
Однако я получаю однобуквенные совпадения вместо составных.
То есть я получаю слово «Финиш» после обработки «Finis», и оно должно быть «Finish»
Например (в скобках написано, что должно быть в соответствии со стандартом)
ш -> s (sh)
щ -> s (shch)
ч -> c (ch)
.... and other
Например, полная правильная таблица:
а-a б-b в-v г-g д-d е-e ё-e ж-zh з-z и-i й-i к-k л-l м-m н-n о-o п-p р-r
с-s т-t у-u ф-f х-kh ц-ts ч-ch ш-sh щ-shch ы-y ъ-ie э-e ю-iu я-ia
Насколько я понимаю, вам нужно настроить это где-то в правилах, но я не могу понять, как это сделать в документации.
Или, возможно, есть какой-то другой вариант?
Комментарии:
1. даже в руководстве есть пара комментариев с однобуквенной транслитерацией русского языка. Не имеет никакого смысла 🙁
2. @WalterTross Так вы думаете, что проще написать свою собственную функцию?
3. На вашем месте я бы внимательно прочитал документацию, а также дождался ответа здесь. Если оба выйдут из строя через пару дней, я бы, вероятно, пошел
str_replace()
.4. @WalterTross
preg_replace()
может быть лучше, чемstr_replace()
для этого?
Ответ №1:
Все, что вам нужно сделать, это написать правила для конкретных случаев:
$str = 'а-a б-b в-v г-g д-d е-e ё-e ж-zh з-z и-i й-i к-k л-l м-m н-n о-o п-p р-r
с-s т-t у-u ф-f х-kh ц-ts ч-ch ш-sh щ-shch ы-y ъ-ie э-e ю-iu я-ia Финиш';
$rules = <<<'RULES'
:: NFC ;
ё > e; ж > zh; й > i; х > kh; ц > ts; ч > ch; ш > sh; щ > shch; ъ > ie;
э > e; ю > iu; я > ia;
:: Cyrillic-Latin ;
RULES;
$tls = Transliterator::createFromRules($rules);
echo $tls->transliterate($str), PHP_EOL;
Обратите внимание, что «конкретные правила» должны быть перед общим правилом ( Cyrillic-Latin
).
Комментарии:
1. Да, это оно. Я обновил свой пост в блоге , посвященный проблеме, спасибо. ПРИМЕЧАНИЕ: В официальной документации о Transliterator::createFromRules отсутствует пример кода правил.
This function is currently not documented; only its argument list is available.
(но где список аргументов?)2. @JasomDotnet: вы можете найти документацию здесь .