今後Go言語でも50音順ソートしたくなるのでは、と虫の知らせがあったので作ってみました。
50音順とは何者か
50音順は「あいうえおかきくけこ・・・」あたりまでなら簡単なので、すごく簡単に思えるじゃないですか。 しかしここに濁音・半濁音・拗音・片仮名・長音記号etc. が入ってくるとだいぶややこしくなります。
濁音を含んだソート
たとえば濁点の扱いを見てみましょう。 「さどう」「さとうや」「サトー」「さと」「さど」「さとう」「さとおや」という7つの単語を並べ替えます。 普通にGo標準のソートを使うと以下のようになります。
package main
import (
"fmt"
"sort"
)
func main() {
list := []string{
"さどう",
"さとうや",
"サトー",
"さと",
"さど",
"さとう",
"さとおや",
}
sort.Strings(list)
fmt.Println(list)
// Output:
// [さと さとう さとうや さとおや さど さどう サトー]
}
一見良さそうですが・・・「さと」と「さど」が遠く離れてしまいました。 このふたつは音が似ているので近くに配置したいです。
jisx4061を使ったソート
shogo82148/jisx4061を使うと解決します。
package main
import (
"fmt"
"github.com/shogo82148/jisx4061"
)
func main() {
list := []string{
"さどう",
"さとうや",
"サトー",
"さと",
"さど",
"さとう",
"さとおや",
}
jisx4061.Sort(list)
fmt.Println(list)
// Output:
// [さと さど さとう さどう さとうや サトー さとおや]
}
「さと」「さど」が近くに来て探しやすくなりましたね。
JIS X 4061
この規則は「日本語文字列照合順番」という名前でJIS X 4061に定義されています。
あいうえお順というと簡単に聞こえますが、規格化して統一が必要な程度には難しい問題なんですね。
まとめ
あいうえお順って難しいよ。 よかったら shogo82148/jisx4061 使ってね。