先日、カタカナのソート順について要望をうけました。よく分かっていないのですが、通常は「アアト」よりも「アート」の方が先に表示される感じ、らしいのです。しかしMySQLでもPHPでも文字コードがUTF-8だと「アート」の方が後になってしまいます。そんなとき、「アート」が先に来るような方法について書きます。
ソートはどの順番で行われているのか
文字コードっていうのはコンピュータが理解できる形での文字をバイトで表現しているもの、です。日本語だとローカルではShift-JISがよく使われていますが、WebサイトではEUC-JPやUTF-8が主に使われてます。特に最近ではUTF-8という文字コードを使うことが主流となっています。
ソート順を考えるときにその UTF-8 での文字コードがどのように並んでいるのか一覧表をググって見つけてみました。
こちらの文字コード表が見やすかったのでこちらを参照させていただきました。
これを見るとカタカナだと ア と ー の順番は ー の方が後になっています。ですのでソートをすると、アア より アー の方が順番として後になってしまいます。
MySQLとPHPでデフォルトのソートはどうなっているか
具体的にMySQLで
このようなテーブルがあったとして、
SELECT * FROM testkana
ORDER BY kana
と kana の昇順に並べ替えてみます
結果はこのように アアト の方が、 アート よりも先に表示されてしまいます。
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はすべて全角カタカナではいっているとします。ということは ー を カタカナ全てよりも小さいコードを持つ文字に置き換えて、それをソートすれば大丈夫そうです。
この表を見ると分かるのですが、カタカナ全部より前に ひらがな のコードがあるようです。そこで、 ー を あ に置き換えた状態でソートすれば大丈夫そうです。
SELECT * FROM `testkana` order by replace(kana, 'ー', 'あ');
このコードを実行します。これは kanaの中にある ー を あ に置き換えた状態で昇順にソートする命令です。
これを実行してみると、
このように アート が アアト より先に来て、思ったようにソートすることができました。
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のコード表をじっくり見て考えましょう
今回は全てがカタカナの場合の対応でした。もしも全てがひらがなだったら、
このへんの記号を使いますかね。気をつけたいのは置き換える文字は「その項目で絶対に使っていない文字にする」ということです。
案外簡単だったので、ソートに困ったらおためしください(^^)/
コメント