【问题标题】:Where can I find a list of IDs or rules for the PHP transliterator (Intl)?在哪里可以找到 PHP 音译器 (Intl) 的 ID 或规则列表?
【发布时间】:2026-01-30 03:00:01
【问题描述】:

Transliterator::listIDs() 会列出 ID,但显然这不是一个完整的列表。

example from this page 中,ID 如下所示:

Any-Latin; NFD; [:Nonspacing Mark:] Remove; NFC; [:Punctuation:] Remove; Lower();

这有点奇怪,因为 ID 应该是唯一的。这看起来更像是一条规则,但如果我将它传递给 createFromRules 方法,它就不起作用了 :)

无论如何,我正在尝试从字符串中删除任何标点符号,但破折号 (-) 或特定列表中的字符除外。

你知道这是否可能吗?还是有一些文档可以更好地解释音译的语法?

【问题讨论】:

    标签: php transliteration intl


    【解决方案1】:

    Transliterator::listIDs() 的 id 是“基本 id”。您给出的示例是“复合 ID”。你可以看到ICU docs on this

    您还可以使用Transliterator::createFromRules() 创建自己的规则。

    你可以看看预定义的规则:

    <?php
    $a = new ResourceBundle(NULL, sprintf('icudt%dl-translit', INTL_ICU_VERSION), true);
    
    foreach ($a['RuleBasedTransliteratorIDs'] as $name => $v) {
        $file = @$v['file'];
        if (!$file) {
            $file = $v['internal'];
            echo $name, " (direction $file[direction]; internal)\n";
        } else { 
            echo $name, " (direction: $file[direction])\n";
            echo $file['resource'];
        }
        echo "\n--------------\n";
    }
    

    格式化后,结果类似于this

    【讨论】:

    • 友情提示:对于内存不足的机器来说,这是一个非常密集的 .txt 文件,chrome 和 sublime 文本可能会停止响应处理它...
    【解决方案2】:

    以防万一有人想要一个工作示例。提到的示例(来自 php 手册)使用程序样式。要使其适用于面向对象的风格,请使用 create() 而不是 createFromRules()

    removePunctuation($string) {
        $transliterator = Transliterator::create("Any-Latin; NFD; [:Nonspacing Mark:] Remove; NFC; [:Punctuation:] Remove;", \Transliterator::FORWARD);
    
        return $transliterator->transliterate($string);
    }
    

    【讨论】:

      最近更新 更多