php - 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
据我了解,您需要在规则中的某处进行配置,但我无法在文档中弄清楚如何做到这一点。
或者也许还有其他选择?
解决方案
您所要做的就是为特定情况编写规则:
$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
) 之前。
推荐阅读
- c# - EF Core “Group By 无法翻译,将在本地进行评估。”
- spring-boot - 达到限制后日志文件不翻转
- json - 我的 React 应用程序将我的 JSON 数据视为数据集合
- v8 - V8 隔离 - 实例数量是否有限制?在 4.7k 实例时崩溃
- java - Java中纳秒时间精度的数据类型
- android - 如何在 Jetpack Compose 中从可组合导航到活动或片段?
- r - 如何在R中提取重复字符
- javascript - ASP.NET Core MVC Ajax 无法正常工作
- spring-cloud-sleuth - Spring Cloud Sleuth 增加了启动时间
- c++ - 我什么时候应该传递“对指针的引用”或“指向指针的指针”,而不仅仅是一个指向函数的指针?