48

我想要做的是从字符串中删除所有重音和变音符号,将“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”等价物替换它们。

4

7 回答 7

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

扩展示例

于 2008-10-01T15:38:45.407 回答
32

一个不需要设置语言环境或拥有巨大翻译表的小技巧:

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 中(您应该已经这样做了)。

于 2011-05-10T13:14:15.273 回答
9

你也可以试试这个

$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可用

于 2016-02-03T13:12:13.483 回答
1

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

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

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

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

但是我注意到一个错误:它不适用于具有单个字符的字符串。

于 2018-06-01T14:15:27.957 回答
0

对于阿拉伯语和波斯语用户,我推荐这种方式来删除变音符号:

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

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

ـَ(0243) ـِ(0246) ـُ(0245) ـً(0240) ـٍ(0242) ـٌ(0241) ـْ(0250) ـّ(0248) ـ ـ(0220)

于 2014-11-08T11:55:29.880 回答
0

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

htmlentities (  $line, ENT_SUBSTITUTE   , 'utf-8' ) 
于 2016-08-24T00:18:50.433 回答