web-dev-qa-db-ja.com

PHP:ウムラウトを最も近い7ビットで置き換えますASCII UTF-8文字列で同等

私がやりたいのは、文字列からすべてのアクセントとウムラウトを削除し、「lärm」を「larm」に、または「andré」を「andre」に変換することです。文字列をutf8_decodeしてstrtrを使用しようとしましたが、ソースファイルがUTF-8ファイルとして保存されているため、すべてのウムラウトにISO-8859-15文字を入力できません-エディターはUTF-8文字。

明らかにこれに対する解決策は、ISO-8859-15ファイルであるインクルードを持つことですが、別の必要なインクルードを持つより良い方法がなければなりませんか?

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

PDATE:何をしようとしているのか少し不正確だったかもしれません。ウムラウトを実際に削除したくないのですが、ウムラウトを最も近い「1文字のASCII」に置き換えたいと思っています。

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

拡張

53
Vinko Vrsalovic

ロケールの設定や巨大な変換テーブルを必要としない小さなトリック:

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で保存することです(既にそうなっているはずです)。

27
Alix Axel

あなたもこれを試すことができます

$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 が必要です

6
gabo

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

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

アラビア語とペルシャ語のユーザーの場合、発音区別符号を削除するには、次の方法をお勧めします。

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

アラビア語のキーボードで発音区別符号を入力する場合、WindowsエディタでこのAsci(これらのコードはUnicodeではなくAsci)コードを使用できます。発音区別符号を直接入力するか、Alt +(発音区別符号のコードを入力)を押します

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

0
ganji

これはフランス語とドイツ語で最も一貫した結果を与えることがわかりました。メタタグをutf-8に設定して、単語の配列から行を返す関数に配置しましたが、完全に機能します。

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

WordPressを使用している場合は、組み込み関数remove_accents( $string )を使用できます

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

しかし、バグに気づきました。単一の文字を含む文字列では機能しません。

0
youtag