如何从PHP中的UTF8字符“删除变音符号”?

Kal*_*mar 3 php mysql utf-8

我需要utf8_general_ci在PHP中复制MySQL 排序规则的行为。严格来说,我需要发现哪些人应该被认为是不同的,哪些将被认为是相同的。大小写无关的部分很容易。问题是utf_general_ci认为带有变音符号的字符和没有变音符号的字符是相等的:e =è=é等。要复制该比较,我需要有一种方法来替换è-> e,é-> e。

我想到的方法是:

echo iconv("utf-8", "ascii//TRANSLIT", "é");
Run Code Online (Sandbox Code Playgroud)

一个问题是iconv行为的变化取决于当前的语言环境,这就是问题所在。

另一个问题是输入中可能还包含不应被剥离或导致PHP通知的Cirillic字母。

echo iconv("utf-8", "ascii//TRANSLIT", "???");
Run Code Online (Sandbox Code Playgroud)

是否有解决方案,或者我必须手动创建每个带有变音符号的字符到没有变音符号的字符的映射?

Sam*_*tch 5

intl的Transliterator可让您定义更深入的音译规则。有关音译规则的完整文档可以在icu-project.org找到

$tests = [ "é", "???" ];

$tl = Transliterator::create('Latin-ASCII;');
foreach($tests as $str) {
    var_dump(
        $tl->transliterate($str)
    );
}
Run Code Online (Sandbox Code Playgroud)

输出:

string(1) "e"
string(6) "???"
Run Code Online (Sandbox Code Playgroud)