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');

更新:たぶん、私がやろうとしていることは少し不正確でした: 実際にはウムラウトを削除したくはありませんが、それらを最も近い "1 文字の 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 に答える
1

さて、自分で明らかな解決策を見つけましたが、パフォーマンスに関しては最善ではありません...

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

アラビア語とペルシャ語のユーザーには、次の方法で分音記号を削除することをお勧めします。

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

アラビア語キーボードで分音記号を入力するには、Windows エディターでこの Asci (これらのコードは Unicode ではなく Asci) コードを使用できます。分音記号を直接入力するか、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 に答える