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 正規化で合成列に変換してから変換するとよい。

text.baldanders.info

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

所感

文字コードちゃんと勉強する。