首页 > 解决方案 > Transliterator 音译规则

问题描述

我使用这个函数将西里尔语单词音译成拉丁语:

$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 

据我了解,您需要在规则中的某处进行配置,但我无法在文档中弄清楚如何做到这一点。

或者也许还有其他选择?

标签: phpunicodetransliteration

解决方案


您所要做的就是为特定情况编写规则:

$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) 之前。


推荐阅读