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

时间:2018-02-02 18:21:54

标签: php mysql utf-8

我需要在PHP中复制MySQL utf8_general_ci排序规则的行为。严格来说,我需要发现什么被认为是不同的,什么被认为是相同的。案例独立部分很容易。问题是utf_general_ci认为带有变音符号的字符和没有变音符号的字符是相等的:e =è=état。要复制这种比较,我需要有一种方法来替换è - > e,é - >即

我想到的方法是:

echo iconv("utf-8", "ascii//TRANSLIT", "é");

一个问题是iconv的行为有所不同,具体取决于当前的语言环境,而且这是一个问题。

另一个问题是输入也可能包含Cirillic字母,不应该被删除或导致PHP通知。

echo iconv("utf-8", "ascii//TRANSLIT", "дом");

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

2 个答案:

答案 0 :(得分:4)

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

{
  "technical": {
    "topic": "my topic",
    "nature": "my nature",
    "event_id": "1010101"
  },
  "payload": {
    "__type": "AuthorizationRequest:#Question48583688"
  }
}

输出:

$tests = [ "é", "дом" ];

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

答案 1 :(得分:0)

目标是防止表格中已存在的碰撞价值&#39 ;?有重音字母应该允许与不同的口音和非口音共存?然后更改导致冲突的PRIMARY(或UNIQUE)键的排序规则。

任何..._bin COLLATION都允许eé共存(在插入过程中不会发生碰撞),因为它会将它们视为不同。

出于其他原因,您是否需要...general_ci?如果是,请说明原因。如果没有,请ALTER TABLE更改COLLATION。我认为不需要PHP代码。