多言語アプリケーションを開発する際には、多くの場合、文字列比較の問題が含まれます。 PHPは文字列を比較する複数の方法を提供し、 Strcoll()関数は、現在のロケールに基づいて比較の結果を決定するため、特に興味深いものです。この記事では、さまざまなロケール設定でのstrcoll()のパフォーマンスの違いを調べ、特定のコードの例を使用して説明します。
strcoll()は、ロケール設定に基づいて2つの文字列を比較するPHPの組み込み関数です。 strcmp()と同様の結果を返します。
0を返して、2つの文字列が現在のロケールで等しいことを示します。
0未満の返品は、最初の文字列が並べ替えの前にランク付けされることを意味します。
0を超えると、最初の文字列が並べ替えの2番目の文字列の後であることを示します。
strcmp()とは異なり、 strcoll()は、キャラクターのソートメソッド、ケース感度、一部の特殊文字の処理などのロケールルールを検討します。
PHPでは、 setlocale()関数を使用して、現在のロケール設定を設定できます。例えば:
setlocale(LC_COLLATE, 'en_US.UTF-8');
LC_Collateは、文字列の比較とソートに影響を与えるために特別に使用されるカテゴリです。 LC_TIME 、 LC_MONETARYなどのその他のカテゴリは、時間、通貨、その他の形式に影響します。
ドイツ語と英語の2つのロケールを例として取り、 Strcoll()のパフォーマンスの違いを見てみましょう。
setlocale(LC_COLLATE, 'en_US.UTF-8');
echo strcoll("z", "?"); // 出力結果 A
setlocale(LC_COLLATE, 'de_DE.UTF-8');
echo strcoll("z", "?"); // 出力結果 B
英語では、「z」は「前」であり、ドイツ語で、それ以来ドイツ語ではありませんか?フォニック文字と見なされており、「z」または「A」の近くにさえ後になる可能性があります。したがって、出力結果AとBは異なる場合があります。
ユーザーの言語の好みに従ってソートしたいアクセントのある名前のセットがあるとします。コードは次のとおりです。
$names = ["Zoe", "?nne", "Anna", "émile"];
setlocale(LC_COLLATE, 'en_US.UTF-8');
usort($names, function($a, $b) {
return strcoll($a, $b);
});
print_r($names);
en_us.utf-8の下で、ソートは次のとおりです。
Array
(
[0] => Anna
[1] => émile
[2] => Zoe
[3] => ?nne
)
de_de.utf-8に置き換えられた場合:
setlocale(LC_COLLATE, 'de_DE.UTF-8');
その後、あなたは得るかもしれません:
Array
(
[0] => Anna
[1] => ?nne
[2] => émile
[3] => Zoe
)
一部のシステムでは、利用可能なロケールが制限される場合があります。次のコマンドをコマンドラインで実行して表示できます。
locale -a
または、PHPでロケールを設定し、 SetLocale()の返品値を使用して、成功しているかどうかを判断してみてください。
setlocale()の返品値を常に確認して、ロケールが正しく設定されていることを確認してください。
ユーザー入力言語を敏感に並べ替える必要がある場合は、 strcmp()の代わりにstrcoll()を使用してください。
クロスプラットフォームの一貫性については、アプリケーションで必要なロケールを明確に指定し、これらの設定がサーバー構成でサポートされていることを確認することをお勧めします。
Strcoll()のソート結果がフロントエンドディスプレイ(連絡先リスト、国名など)に使用されている場合は、テスト内のさまざまなロケールをシミュレートして、ソートロジックが期待を満たしていることを確認してください。
次のアドレスを使用して、さまざまなロケールの並べ替え効果を試すことができます。
https://gitbox.net/locale-strcoll-demo.php
このページは、異なるロケールの選択と弦のペアを入力してそれらを比較することをサポートしているため、さまざまなロケールでstrcoll()のパフォーマンスを直感的に理解できます。
strcoll()は非常に便利ですが、しばしば見過ごされがちな機能です。ロケールを合理的に設定することにより、ユーザー言語習慣に沿った文字列比較ロジックを実装するのに役立ちます。多言語プロジェクトでstrcoll()を適切に使用すると、ユーザーエクスペリエンスが大幅に向上する可能性があります。