8

フランス語の単語を含む配列があります: ['États-Unis'、'Espagne' など] ロケール (fr_FR) に従ってアルファベット順に並べ替えたい

私は次のコードを使用しています:

$collator = new Collator('fr-FR');
echo $collator->getErrorMessage();
$collator->asort($array);

しかし、英語または他のロケールが使用されていると思われるエラー U_USING_DEFAULT_WARNING が発生しています。さらに重要なことは、配列が正しくソートされていないことです (米国がスペインより先に表示されます。

intl パッケージがインストールされており、システムには対応するロケール (Ubuntu) があります。

$locale -a
C
C.UTF-8
en_US.utf8
es_ES.utf8
fr_FR
fr_FR.iso88591
fr_FR.utf8
POSIX

Collat​​ion オブジェクトを構築するときに、「fr-FR」、「fr-FR.UTF8」などのさまざまな組み合わせを試しましたが、良い結果は得られませんでした。

私が見逃しているものは他にありますか?

4

3 に答える 3

6

このブログ投稿によると、単語cotecotécôte、およびcôté (英語では既にソートされています) について、フランス語でのソート順はcotecôtecotéおよびcôtéです。以下のコードは、フランス語の照合順序で単語を並べ替えます。

$words = array('cote', 'coté', 'côte',  'côté');
print_r($words);

$collator = new Collator('fr_FR');

// print info about locale
echo 'French Collation ' . (($collator->getAttribute(Collator::FRENCH_COLLATION) ==    Collator::ON) ? 'On' : 'Off') . "\n";
echo $collator->getLocale(Locale::VALID_LOCALE) . "\n";
echo $collator->getLocale(Locale::ACTUAL_LOCALE) . "\n";

$collator->asort($words);

print_r($words);

そして、印刷された結果は次のとおりです。

Array
(
    [0] => cote
    [1] => coté
    [2] => côte
    [3] => côté
)
French Collation On
fr_FR
fr
Array
(
    [0] => cote
    [2] => côte
    [1] => coté
    [3] => côté
)

同じブログ投稿で、著者は次のように述べています。

[...] 分音記号は、左から右ではなく、右から左に評価されます。したがって、左から右に評価する英語のような言語のように、côteは coté の後に来るのではなく、 cotéの前に来ます。côteという単語は単語の末尾の「e」に ACUTE がないのに対し、cotéは ACUTE を持っていないためです。英語および他のほとんどの言語では、評価は左側から開始されるため、CIRCUMFLEX または "o" の欠如が順序付けの制御要因になります。

したがって、SpainUSという単語を含む配列がある場合、それらは英語とフランス語で同じ順序になります。

asortメソッドが配列のインデックスの関連付けを維持することにも注意してください。違いを見ます:

asort:
Array
(
    [0] => cote
    [2] => côte
    [1] => coté
    [3] => côté
)

sort:
Array
(
    [0] => cote
    [1] => côte
    [2] => coté
    [3] => côté
)

U_USING_DEFAULT_WARNINGについて

このAPIドキュメントによると:

U_USING_DEFAULT_WARNING は、デフォルトのロケール データが使用されたことを示します。要求されたロケールも、その代替ロケールも見つかりませんでした。

たとえば、 fr_FRロケールを使用すると、 U_USING_FALLBACK_WARNINGが表示されます。これは、フォールバック ロケール (この場合はロケールfr ) が使用されたことを示しています。

ロケール

locale -aコマンドがフランス語のパッケージを表示しても、お使いのコンピューターはフランス語をサポートしていないようです (または、サポートしているが、どういうわけか PHP がフランス語を使用できず、デフォルトの言語にフォールバックします) 。試してみることができるいくつかの提案があります。

最初に、サポートされているすべてのロケールをリストします。

cat /usr/share/i18n/SUPPORTED 

次に、必要な言語を生成します。

sudo locale-gen fr_FR.UTF-8
sudo locale-gen fr_FR.ISO-8859-1
sudo dpkg-reconfigure locales

うまくいかない場合は、パッケージlanguage-pack-frおよびlanguage-support-frをインストールして、言語を再度生成してみてください。

この問題は奇妙です。Ubuntu 11.04 と PHP 5.3.8 を搭載した VM があり、Debian 6 でも問題なく動作します。パッケージをインストールしたり、何も構成したりしていません。

于 2012-11-30T14:05:09.593 に答える
0

私はcygwinを使用しています:

$ locale -a | grep fr_FR
fr_FR
fr_FR.utf8
fr_FR@euro

fr_FR.iso88591(出力にないことに注意してください)

コード (ファイルのエンコードは UTF-8):

$collator = new Collator('fr_FR');
var_dump($collator->getErrorMessage());

// FRENCH_COLLATION is OFF

$arr = array('États-Unis', 'Espagne');

var_dump($collator->getAttribute(Collator::FRENCH_COLLATION) == Collator::ON);
var_dump($collator->getLocale(Locale::VALID_LOCALE));
var_dump($collator->getLocale(Locale::ACTUAL_LOCALE));
$collator->asort($arr);
var_dump($arr);

// FRENCH_COLLATION is ON

$collator->setAttribute(Collator::FRENCH_COLLATION, Collator::ON);

$arr = array('États-Unis', 'Espagne');

var_dump($collator->getAttribute(Collator::FRENCH_COLLATION) == Collator::ON);
var_dump($collator->getLocale(Locale::VALID_LOCALE));
var_dump($collator->getLocale(Locale::ACTUAL_LOCALE));
$collator->asort($arr);
var_dump($arr);

出力:

string(23) "U_USING_DEFAULT_WARNING"
bool(false)
string(5) "fr_FR"
string(4) "root"
array(2) {
  [1]=>
  string(7) "Espagne"
  [0]=>
  string(11) "États-Unis"
}
bool(true)
string(5) "fr_FR"
string(4) "root"
array(2) {
  [1]=>
  string(7) "Espagne"
  [0]=>
  string(11) "États-Unis"
}

そして、ここにトリックがあります:ファイルエンコーディングを ISO 8859-1 に変換し(vim では、私はそうします:set fileencoding=iso-8859-1)、もう一度やり直します:

string(23) "U_USING_DEFAULT_WARNING"
bool(false)
string(5) "fr_FR"
string(4) "root"
array(2) {
  [0]=>
  string(10) "▒tats-Unis"
  [1]=>
  string(7) "Espagne"
}
bool(true)
string(5) "fr_FR"
string(4) "root"
array(2) {
  [0]=>
  string(10) "▒tats-Unis"
  [1]=>
  string(7) "Espagne"
}

一部のシンボルが壊れていますが、端末が特定のコードページをサポートしていないためだと思います。主なことは、文字列の順序がまさにあなたが説明したとおりになったことです。「Espagne」は「États-Unis」の後に来ます。

だから、それはファイルエンコーディングだと思います。

于 2012-12-01T14:20:08.743 に答える
0

「FR」だけを試してみてください。あなたのシステムでうまくいくはずです:

$collator = new Collator('FR');
于 2012-12-06T17:40:22.170 に答える