Shogo's Blog

Nov 20, 2022 - 1 minute read - Comments - go golang

50音順(JIS X 4061)をGoで実装してみた

今後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 使ってね。

参考