私は2つの文字列を比較しようとしています。たとえば、ÉmilieとZoeyです。「E」は「Z」の前にありますが、ASCIIチャートではZはÉの前にあるため、通常は機能しif ( str1 > str2 )
ません。
if (strcmp(str1,str2) > 0)
私はまだ動作しないで試しました。そこで、文字列をUTF-8文字と比較するネイティブな方法を検討しています。
私は2つの文字列を比較しようとしています。たとえば、ÉmilieとZoeyです。「E」は「Z」の前にありますが、ASCIIチャートではZはÉの前にあるため、通常は機能しif ( str1 > str2 )
ません。
if (strcmp(str1,str2) > 0)
私はまだ動作しないで試しました。そこで、文字列をUTF-8文字と比較するネイティブな方法を検討しています。
重要
この回答は、「intl」拡張機能を実行/インストールすることができず、アクセント付き文字をアクセントなし文字に置き換えることによってのみ文字列をソートする状況を対象としています。特定のロケールに従ってアクセント付きの文字を並べ替えるには、 Collatorを使用する方が適切な方法です。詳細については、この質問に対する他の回答を参照してください。
PHP5.2でのアクセントのない文字による並べ替え
iconv()と// TRANSLITオプションを使用して両方の文字列をASCIIに変換し、アクセント付き文字を削除してみてください。
$str1 = iconv('utf-8', 'ascii//TRANSLIT', $str1);
次に、比較を行います
こちらのドキュメントを参照してください。
http://www.php.net/manual/en/function.iconv.php
[@Esailijaの発言に応じて更新]//TRANSLITがアクセント付き文字を予期しない方法で変換する問題を見落としました。この問題はこの質問で言及されています:アクセントを削除するためのphp iconv音訳:例外として機能していませんか?
'iconv()'アプローチを機能させるために、preg_replace()を使用して、結果の文字列からすべての非単語文字を削除するコードサンプルを以下に追加しました。
<?php
setLocale(LC_ALL, 'fr_FR');
$names = array(
'Zoey and another (word) ',
'Émilie and another word',
'Amber',
);
$converted = array();
foreach($names as $name) {
$converted[] = preg_replace('#[^\w\s]+#', '', iconv('UTF-8', 'ASCII//TRANSLIT', $name));
}
sort($converted);
echo '<pre>'; print_r($converted);
// Array
// (
// [0] => Amber
// [1] => Emilie and another word
// [2] => Zoey and another word
// )
これを行うネイティブな方法はありませんが、PECL 拡張: http://php.net/manual/de/class.collator.php
$c = new Collator('fr_FR');
if ($c->compare('Émily', 'Zoey') < 0) { echo 'Émily < Zoey'; }
usort
値を変更せずに正しく比較するために、関数を使用することをお勧めします。
例:
<?php
setLocale(LC_ALL, 'fr_FR');
$names = [
'Zoey and another (word) ',
'Émilie and another word',
'Amber'
];
function compare(string $a, string $b) {
$a = preg_replace('#[^\w\s]+#', '', iconv('utf-8', 'ascii//TRANSLIT', $a));
$b = preg_replace('#[^\w\s]+#', '', iconv('utf-8', 'ascii//TRANSLIT', $b));
return strcmp($a, $b);
}
usort($names, 'compare');
echo '<pre>';
print_r($names);
echo '</pre>';
結果:
Array
(
[0] => Amber
[1] => Émilie and another word
[2] => Zoey and another (word)
)
他の言語が持っている特殊文字を比較する目的に役立つかどうかはわかりませんが、私にとってはうまくいくものがあります。
mb_strpos
関数を使用して結果を見ているだけです。UTF8文字列のネイティブ比較にできるだけ近いと思います:
if (mb_strpos(mb_strtolower($search_in), $search_for) !== false) {
//do stuff
}