当サイトには広告が含まれております

MySQLやPHPのカタカナのUTF-8のソート順をカスタマイズした

この記事は最終更新日から9年経過しています。内容が古い可能性があります。

Image [6]

先日、カタカナのソート順について要望をうけました。よく分かっていないのですが、通常は「アアト」よりも「アート」の方が先に表示される感じ、らしいのです。しかしMySQLでもPHPでも文字コードがUTF-8だと「アート」の方が後になってしまいます。そんなとき、「アート」が先に来るような方法について書きます。

記事をざっと見る

ソートはどの順番で行われているのか

文字コードっていうのはコンピュータが理解できる形での文字をバイトで表現しているもの、です。日本語だとローカルではShift-JISがよく使われていますが、WebサイトではEUC-JPやUTF-8が主に使われてます。特に最近ではUTF-8という文字コードを使うことが主流となっています。

ソート順を考えるときにその UTF-8 での文字コードがどのように並んでいるのか一覧表をググって見つけてみました。

UTF-8コード表(1) – 弘前学院聖愛中学高等学校

こちらの文字コード表が見やすかったのでこちらを参照させていただきました。

Image

これを見るとカタカナだと  と  の順番は  の方が後になっています。ですのでソートをすると、アア より アー の方が順番として後になってしまいます。

MySQLとPHPでデフォルトのソートはどうなっているか

具体的にMySQLで

Image [2]

このようなテーブルがあったとして、

SELECT * FROM testkana ORDER BY kana

と kana の昇順に並べ替えてみます

Image [3]

結果はこのように アアト の方が、 アート よりも先に表示されてしまいます。

PHPでは

<?php
$kanaArray = array();

$kanaArray[] = 'コート';
$kanaArray[] = 'コォト';
$kanaArray[] = 'アート';
$kanaArray[] = 'アアト';
$kanaArray[] = 'イート';
$kanaArray[] = 'イイト';

echo "<pre>";var_dump($kanaArray);echo "</pre>";

sort($kanaArray);

echo "<pre>";var_dump($kanaArray);echo "</pre>";

このように配列を作ってソートして表示してみると、

array(6) {
  [0]=>
  string(9) "コート"
  [1]=>
  string(9) "コォト"
  [2]=>
  string(9) "アート"
  [3]=>
  string(9) "アアト"
  [4]=>
  string(9) "イート"
  [5]=>
  string(9) "イイト"
}
array(6) {
  [0]=>
  string(9) "アアト"
  [1]=>
  string(9) "アート"
  [2]=>
  string(9) "イイト"
  [3]=>
  string(9) "イート"
  [4]=>
  string(9) "コォト"
  [5]=>
  string(9) "コート"
}

このような結果になります。やはり、MySQLと同じような順番になっています。

MySQLの対応方法

さきほどの文字コード表を見ると  はカタカナ全部の最後の方のコードとなっのテーブルの項目kanaはすべて全角カタカナではいっているとします。ということは  を カタカナ全てよりも小さいコードを持つ文字に置き換えて、それをソートすれば大丈夫そうです。

Image [1]

この表を見ると分かるのですが、カタカナ全部より前に ひらがな のコードがあるようです。そこで、  を  に置き換えた状態でソートすれば大丈夫そうです。

SELECT * FROM `testkana` order by replace(kana, 'ー', 'あ');

このコードを実行します。これは kanaの中にある ー を あ に置き換えた状態で昇順にソートする命令です。

これを実行してみると、

Image [4]

このように アート が アアト より先に来て、思ったようにソートすることができました。

PHPの対応方法

ちょっとですねー、冗長な方法しか思いつきませんでした(もっといい方法あるよ!という場合教えてくださいm(_ _)m)

<?php
$kanaArray = array();

$kanaArray[] = 'コート';
$kanaArray[] = 'コォト';
$kanaArray[] = 'アート';
$kanaArray[] = 'アアト';
$kanaArray[] = 'イート';
$kanaArray[] = 'イイト';

echo "<pre>";var_dump($kanaArray);echo "</pre>";

$kanaArraySort = array();

foreach($kanaArray as $key=>$kana){
    $kanaArraySort[$key] = str_replace('ー', 'あ', $kana);
}

asort($kanaArraySort);
foreach($kanaArray as $key=>$kana){
    $kanaArraySort[$key] = str_replace('あ', 'ー', $kana);
}
echo "<pre>";var_dump($kanaArraySort);echo "</pre>";

さっきのコードをこのようにしてみました。

内容は  $kanaArraySortという配列に $kanaArray から1項目ずつコピーしていきます。その際に ー を あ に置き換えます。
そして、$kanaArraySortという配列を asort します。

結果は

array(6) {
  [0]=>
  string(9) "コート"
  [1]=>
  string(9) "コォト"
  [2]=>
  string(9) "アート"
  [3]=>
  string(9) "アアト"
  [4]=>
  string(9) "イート"
  [5]=>
  string(9) "イイト"
}
array(6) {
  [2]=>
  string(9) "アート"
  [3]=>
  string(9) "アアト"
  [4]=>
  string(9) "イート"
  [5]=>
  string(9) "イイト"
  [0]=>
  string(9) "コート"
  [1]=>
  string(9) "コォト"
}

このように意図したとおりにソートされました。

まとめ:UTF-8のコード表をじっくり見て考えましょう

今回は全てがカタカナの場合の対応でした。もしも全てがひらがなだったら、

Image [5]

このへんの記号を使いますかね。気をつけたいのは置き換える文字は「その項目で絶対に使っていない文字にする」ということです。

案外簡単だったので、ソートに困ったらおためしください(^^)/

この記事が気に入ったら
いいね または フォローしてね!

あなたのシェアが励みになります!
  • URLをコピーしました!
  • URLをコピーしました!

コメント

コメントを残す

記事をざっと見る