仕事でAIRを使った業務アプリケーションを作成しているのですが、名称でソートした場合に漢字よりもカタカナが後ろに並ぶなどしてどうにもおかしい。
例 カタカナのチが漢字の真ん中に並ぶ
切断
チューブ
部品
どうしてなのか、ネット検索して見つけた下記サイトにそのヒントを見つけた。
SQLiteの日本語ソート問題
http://d.hatena.ne.jp/Fio/20081010/p1
このサイトによると、文字コードがUTF-16LEで作成されていた場合に、日本語のソートが正しく行われないとある。
UTF-8など別に文字コードに変更すれば日本語のソートが正しく行われる。
並び順
1(全角)
A(全角)
1(半角)
A(半角)
a(全角)
あ
案
a(半角)
表
ア(半角)
ア(全角)
そもそも、VisualBasicやC#でも内部の文字コードはUTF-16LEで行われており、配列のソートを使ったとしても正しく行われる。
そんなことを思いながら、さらに検索してみると下記サイトを見つけた。
sqlite の内部ソート関数がきっちり UTF-16le に対応できていないのではないか
http://macs.o-ya.net/cboard/c-board.cgi?cmd=one;no=636;id=bbs
そこで、メモ帳で先程の並び順の文字を貼りつけて、Unicodeに保存してバイナリエディタで各文字コードを参照してみた。
その文字コードをみると、本来UTF-16LEなので、上下バイトを反転した上でソートしなければならないが、そのままでソートされているのである。
これはあきらかに不具合以外の何物でもないだろう。
1(全角) |
11FF |
A(全角) |
21FF |
1(半角) |
3100 |
A(半角) |
4100 |
a(全角) |
41FF |
あ |
4230 |
案 |
4868 |
a(半角) |
6100 |
表 |
6888 |
ア(半角) |
71FF |
ア(全角) |
A230 |
|
|
切 |
0752 |
チ |
C130 |
部 |
E890 |
AIRのローカルデータベース作成する際には文字コードの指定はなく、デフォルトでUTF-16LEで作成されてしまう。
AIRで新規にデータベースを作成しないで、別途UTF-8で作成したデータベースを使えばいいかもしれないが・・・
AIRで文字コードを指定してローカルデータベース作成するといった解決方法はあるのだろうか?
あれば知りたい。
追記
SQLiteのファイルフォーマットを参照し、59byteの値を1:UTF-8に書き換えるようなプログラムを別途追加すれば文字コードを変えることができる。
http://www.sqlite.org/fileformat.html