PHP:用UTF-8字符串中最接近的7位ASCII等效替换变音符号

时间:2008-10-01 15:32:41

标签: php utf-8 diacritics strtr

我想要做的是从字符串中删除所有重音符号和变音符号,将“lärm”变为“larm”或将“andré”变为“andre”。我试图做的是utf8_decode字符串,然后使用strtr,但由于我的源文件保存为UTF-8文件,我不能输入所有变音符号的ISO-8859-15字符 - 编辑器插入UTF-8字符。

显然,对此的解决方案是拥有一个ISO-8859-15文件的包含,但必须有一个更好的方法,而不是另一个必需的包含?

echo strtr(utf8_decode($input), 
           'ŠŒŽšœžŸ¥µÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖØÙÚÛÜÝßàáâãäåæçèéêëìíîïðñòóôõöøùúûüýÿ',
           'SOZsozYYuAAAAAAACEEEEIIIIDNOOOOOOUUUUYsaaaaaaaceeeeiiiionoooooouuuuyy');

更新:也许我尝试做的事情有点不准确:我实际上并不想删除变音符号,而是用最接近的“一个字符ASCII”等效替换它们。 / p>

7 个答案:

答案 0 :(得分:53)

iconv("utf-8","ascii//TRANSLIT",$input);

延长example

答案 1 :(得分:26)

一个小技巧,不需要设置区域设置或拥有巨大的转换表:

function Unaccent($string)
{
    if (strpos($string = htmlentities($string, ENT_QUOTES, 'UTF-8'), '&') !== false)
    {
        $string = html_entity_decode(preg_replace('~&([a-z]{1,2})(?:acute|cedil|circ|grave|lig|orn|ring|slash|tilde|uml);~i', '$1', $string), ENT_QUOTES, 'UTF-8');
    }

    return $string;
}

正常工作的唯一要求是将文件保存为UTF-8(就像你应该的那样)。

答案 2 :(得分:5)

你也可以试试这个

$string = "Fóø Bår";
$transliterator = Transliterator::createFromRules(':: Any-Latin; :: Latin-ASCII; :: NFD; :: [:Nonspacing Mark:] Remove; :: Lower(); :: NFC;', Transliterator::FORWARD);
echo $normalized = $transliterator->transliterate($string);

但您需要http://php.net/manual/en/book.intl.php可用

答案 3 :(得分:0)

好的,我自己找到了一个明显的解决方案,但这并不是关于性能的最佳解决方案......

echo strtr(utf8_decode($input), 
           utf8_decode('ŠŒŽšœžŸ¥µÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖØÙÚÛÜÝßàáâãäåæçèéêëìíîïðñòóôõöøùúûüýÿ'),
           'SOZsozYYuAAAAAAACEEEEIIIIDNOOOOOOUUUUYsaaaaaaaceeeeiiiionoooooouuuuyy');

答案 4 :(得分:0)

对于阿拉伯语和波斯语用户,我建议使用这种方法删除变音符号:

    $diacritics = array('َ','ِ','ً','ٌ','ٍ','ّ','ْ','ـ');
    $search_txt = str_replace($diacritics, '', $diacritics);

要在阿拉伯语键盘中键入变音符号,您可以在Windows编辑器中使用此Asci(这些代码是Asci而不是Unicode)代码 直接键入变音符号或按住Alt +(键入变音字符的代码) 这是代码

(0243)(0246)(0245)(0240)(0242)(0241)(0250)(0248) (0220)

答案 5 :(得分:0)

我发现这个用法语和德语给出了最一致的结果。 将元标记设置为utf-8,我将它放在一个函数中,从一个单词数组中返回一行,并且它完美无缺。

htmlentities (  $line, ENT_SUBSTITUTE   , 'utf-8' ) 

答案 6 :(得分:0)

如果您使用的是WordPress,则可以使用内置函数remove_accents( $string )

https://codex.wordpress.org/Function_Reference/remove_accents

但是我发现了一个错误:它不适用于包含单个字符的字符串。