Правила транслитерации Transliterator

#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: вы можете найти документацию здесь .