PHP:umlautsをUTF-8文字列で最も近い7ビットASCIIに置き換えます
-
03-07-2019 - |
質問
やりたいことは、文字列からすべてのアクセントとウムラウトを削除し、「lä rm」を回すことです。 「larm」にまたは" andré" 「アンドレ」に。私がやろうとしたことは、文字列をutf8_decodeしてからstrtrを使用することでしたが、ソースファイルはUTF-8ファイルとして保存されているため、すべてのウムラウトにISO-8859-15文字を入力できません-エディタが挿入しますUTF-8文字。
これに対する解決策は明らかに、ISO-8859-15ファイルであるインクルードを持つことですが、別の必須インクルードを持つよりも良い方法があるはずです
echo strtr(utf8_decode($input),
'ŠŒŽšœžŸ¥µÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖØÙÚÛÜÝßàáâãäåæçèéêëìíîïðñòóôõöøùúûüýÿ',
'SOZsozYYuAAAAAAACEEEEIIIIDNOOOOOOUUUUYsaaaaaaaceeeeiiiionoooooouuuuyy');
更新:私がやろうとしていることに少し不正確だったのかもしれません。実際にウムラウトを削除したいのではなく、最も近い「1文字のASCII」に置き換えます。同等。
解決
iconv("utf-8","ascii//TRANSLIT",$input);
拡張例
他のヒント
ロケールの設定や巨大な変換テーブルを必要としない小さなトリック:
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で保存することです(既にあるはずです)。
これも試すことができます
$string = "Fóø Bår";
$transliterator = Transliterator::createFromRules(':: Any-Latin; :: Latin-ASCII; :: NFD; :: [:Nonspacing Mark:] Remove; :: Lower(); :: NFC;', Transliterator::FORWARD);
echo $normalized = $transliterator->transliterate($string);
わかりました、明らかな解決策を自分で見つけましたが、パフォーマンスに関しては最善ではありません...
echo strtr(utf8_decode($input),
utf8_decode('ŠŒŽšœžŸ¥µÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖØÙÚÛÜÝßàáâãäåæçèéêëìíîïðñòóôõöøùúûüýÿ'),
'SOZsozYYuAAAAAAACEEEEIIIIDNOOOOOOUUUUYsaaaaaaaceeeeiiiionoooooouuuuyy');
アラビア語およびペルシャ語のユーザーの場合、発音区別記号を削除するにはこの方法をお勧めします:
$diacritics = array('َ','ِ','ً','ٌ','ٍ','ّ','ْ','ـ');
$search_txt = str_replace($diacritics, '', $diacritics);
アラビア語キーボードで発音区別記号を入力する場合、WindowsエディターでこのAsci(UnicodeではなくAsci)コードを使用できます。 発音区別記号を直接入力するか、Alt +を押します(発音区別記号のコードを入力します) これはコードです
ـَ(0243)ـِ(0246)ـُ(0245)ـً(0240)&#1600 ;ٍ(0242)ـٌ(0241)ـْ(0250)ـّ(0248)ـ ـ(0220)
これはフランス語とドイツ語で最も一貫した結果をもたらすことがわかりました。
メタタグを utf-8
に設定して、単語の配列から行を返す関数に配置しました。完璧に機能します。
htmlentities ( $line, ENT_SUBSTITUTE , 'utf-8' )
WordPressを使用している場合は、組み込み関数 remove_accents($ string)
https://codex.wordpress.org/Function_Reference/remove_accents
ただし、バグに気付きました。1文字の文字列では機能しません。