web-dev-qa-db-ja.com

UTF-8文字列の比較

私は2つの文字列を比較しようとしています。たとえば、ÉmilieとZoeyです。 「E」は「Z」の前にありますが、ASCIIチャートではZはÉの前にあるため、通常のif ( str1 > str2 )は機能しません。

if (strcmp(str1,str2) > 0)で試しましたがまだ機能しません。そのため、文字列をUTF-8文字と比較するネイティブな方法を検討しています。

15
PL Audet

[〜#〜]重要[〜#〜]

この回答は、「intl」拡張機能を実行/インストールすることができず、文字列をアクセント付き文字をアクセントなし文字に置き換えるでのみソートする状況を対象としています。 特定のロケールに従ってアクセント付き文字を並べ替えるには、 Collat​​or を使用する方が適切です- -詳細については、この質問に対する他の回答を参照してください。

PHP 5.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 
// )
13
thaJeztah

これを行うネイティブの方法はありませんが、PECL拡張機能: http://php.net/manual/de/class.collat​​or.php

$c = new Collator('fr_FR');
if ($c->compare('Émily', 'Zoey') < 0) { echo 'Émily < Zoey'; }
11