ICU:转换拼音并删除所有非数字字母字符

7

不使用正则表达式,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调用来完成所有操作吗?

只有50?这个问题让人难以置信,只有50?把它变成200吧..... - UltraDEVV
1
@UltraDEVV 我怀疑提高赏金并不会增加知道答案的程序员数量 ;) - Vladislav Rastrusny
2
不知道这是否仍然相关,但您可以在规则集本身中指定字符类:'Any-Latin; Latin-ASCII; [^A-Za-z0-9_] Remove;' - Rohit
1个回答

8

使用正确的工具完成工作

我认为你现在所做的一切都没有问题。

ICU转译首先是以语言为导向的,它试图保留意义。

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

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

当然,我已经寻找了解决方案来回答你的问题。但说实话,我找不到适用于所有可能输入的东西。

例如,并非所有我们认为是标点符号的字符都会被[:Punctuation:] Remove;移除。请尝试输入俄语姓名:Корнильев, Кирилл。应用你的id之后,它变成了:Kornilʹev Kirill。显然这不是标点符号,但你不希望它出现在文件名中。

因此,我建议使用正确的工具完成工作:

  1. 使用ICU获取最佳的ASCII等效项。只使用Latin-ASCII;作为id即可。简单易懂。
  2. 然后像你之前做的那样使用正则表达式,确保你只留下所需的字符。

这样做完全没有问题。

附:个人认为编写ICU用户指南的人应该不会因工作得好而受到赞扬。真是一团糟。


1
你能解释一下为什么[:Punctation:]在标点符号类别中不包括引号和撇号吗? - wtorsi
@wtorsi 这是对该答案的评论还是一个新问题?在我看来似乎是后者。如果是这样,最好提出一个新的问题。如果您这样做,请不要忘记记录您的声明。 - KIKO Software

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接