Goで文字幅操作
golang.org/x/text/width
パッケージはテキストの文字列の操作ができる。
全角に変換
s := "ハンカクカラゼンカク" w := width.Widen.String(s) fmt.Println(s) fmt.Println(w) // output: // ハンカクカラゼンカク // ハンカクカラゼンカク
s := "モトモトゼンカク" w := width.Widen.String(s) fmt.Println(s) fmt.Println(w)
output: モトモトゼンカク モトモトゼンカク
全角を引数にwidth.Widen.String()を実行しても全角のままである。
半角に変換
s := "ゼンカクカラハンカク" h := width.Narrow.String(s) fmt.Println(s) fmt.Println(h)
output: ゼンカクカラハンカク ゼンカクカラハンカク
濁点が変換されない。
解決策を紹介している記事を見つけた。
これを解消するには,安直な手段だが,いったん NFD 正規化で合成列に変換してから変換するとよい。
s := "ゼンカクカラハンカク" h := width.Narrow.String(norm.NFD.String(s)) fmt.Println(s) fmt.Println(h)
output: ゼンカクカラハンカク ゼンカクカラハンカク
NFD 正規化については後からちゃんと調べよう。
正規の幅に変換
s := "カタカナabc" f := width.Fold.String(s) fmt.Println(s) fmt.Println(f)
output: カタカナabc カタカナabc
所感
文字コードちゃんと勉強する。