代码之家  ›  专栏  ›  技术社区  ›  Vladislav Rastrusny

ICU:翻译并删除所有非字母数字字符

  •  7
  • Vladislav Rastrusny  · 技术社区  · 10 年前

    是否可以在ICU中完成而不回到正则表达式?

    目前,我规范文件名如下:

    protected function normalizeFilename($filename)
    {
        $transliterator = Transliterator::createFromRules(
            'Any-Latin; Latin-ASCII; [:Punctuation:] Remove;'
        );
        $filename = $transliterator->transliterate($filename);
        $filename = preg_replace('/[^A-Za-z0-9_]/', '', $filename);
        return $filename;
    
    }
    

    我能在这里去掉正则表达式,并处理ICU呼叫吗?

    1 回复  |  直到 10 年前
        1
  •  7
  •   KIKO Software    10 年前

    使用正确的工具进行作业

    我看不出你现在做的事有什么不妥。

    ICU音译首先是面向语言的。它试图保留意义。

    另一方面,正则表达式可以详细操作字符,从而确保文件名仅限于选定的字符。

    在这种情况下,组合是完美的。

    当然,我一直在寻找解决你问题的方法。但老实说,我找不到能在所有可能的输入上发挥作用的东西。

    例如,并非所有字符(我们认为是标点符号)都被删除 [:Punctuation:] Remove; .尝试俄语名称: Корнильев, Кирилл 。在应用 id 它变成: Kornilʹev Kirill 。很明显,这不是标点符号,但您不希望在文件名中使用它。

    因此,我建议您使用正确的工具:

    1. 使用ICU获取最佳ASCII查询。仅使用 Latin-ASCII; 作为 身份证件 很好,很简单。
    2. 然后使用正则表达式,就像您所做的那样,确保只剩下所需的字符。

    这真的没有错。

    PS:就我个人而言,我认为撰写ICU用户指南的人不应该因为工作出色而受到赞扬。真是一团糟。

    推荐文章