Kouhei Sutou
kou****@clear*****
2012年 4月 18日 (水) 14:37:32 JST
須藤です。 In <20120417215803wU$1GY****@gmail*****> "[groonga-dev,00779] 文字列カラムのソート順が日本語が先になる" on Tue, 17 Apr 2012 21:58:03 +0900, Shinya Kawaji <kawaj****@gmail*****> wrote: > 文字列型カラム(text/short_text)をソート順に使った場合、一般的な > 文字コード順である「記号」「数字」「英字」「日本語」になることを > 期待していたのですが、実際は「日本語」が先になって、他が後になります。 現象を確認しました! groongaのソースコードを確認したところ、バイト列ではなく文字 列として比較している箇所がありました。(C言語でいうと unsigned charではなくcharで比較していた。) で、groonga的にはバイト列として比較してソートするのが他の箇 所とも整合性がとれるため、そちらの方が適切です。ということで、 groongaの問題なので、修正します! > これを、「日本語が先になる」ようにするにはどのような方法が有りますでしょ > うか。 次のgroongaのリリースをお待ちください。。。 ということになります。 > それと出来れば、現時点での「日本語が先になる理由(仕組み)」を知りたいの > ですが、どのように理解すればよいでしょうか。 ↑をもう少し詳しく説明しますね。 例にあったそれぞれの文字列の1バイト目は以下のようになっていま す。 p "(社)".unpack("C")[0] # -> 40 p "222".unpack("C")[0] # -> 50 p "cs".unpack("C")[0] # -> 99 p "黒".unpack("C")[0] # -> 233 これを使って大きい順に並べると ["(社)", "222", "cs", "黒"] という意図した順番になります。 しかし、1バイト目を1バイトの符号付き整数として扱うと p "(社)".unpack("c")[0] # -> 40 p "222".unpack("c")[0] # -> 50 p "cs".unpack("c")[0] # -> 99 p "黒".unpack("c")[0] # -> -23 となるので、これを使って大きい順に並べると ["黒", "(社)", "222", "cs"] という現在の挙動になります。 -- 須藤 功平 <kou****@clear*****> 株式会社クリアコード <http://www.clear-code.com/> (03-6231-7270) プログラミングが好きなソフトウェア開発者を募集中: http://www.clear-code.com/recruitment/