Edited at

golang 版 mb_convert_kana でひらがな・カタカナ・全角・半角を正規化する

PicApp アドベントカレンダー4日目です。

なんらかのテキスト処理を行う際の前処理として、ひらがなをすべてカタカナに変換する、半角カタカナを全角カタカナに変換するといった処理を行うことがあると思いますが、golang ではそれを直接実現する標準パッケージはなさそうです。(text/unicode/normそれらしいことはできます

実際のところ、自前で実装するにしても大した規模ではないため、わざわざ外部パッケージの依存を増やすほどのことでもないかもしれません。が、いくつかのパターンを切り替えたり、テストしたりすることを考慮すると、パッケージとして切り出されている方が便利でしょう。

さて、この種の変換でぱっと思い浮かぶのは PHP の mb_convert_kana です。よく使うパターンの変換方法を用意してくれていて、かつそれらの任意の組み合わせが可能です1。golang でこれと同程度のことが実現できるパッケージを探したのですが見つからなかったので作りました。

https://github.com/tomoemon/text_normalizer

下記、簡単な使用例です。

全角記号を半角に、全角数字を半角に、英字を半角に、ひらがなとカタカナを濁点なしの全角カタカナに、というオプションを指定しています。


import (
"fmt"
"github.com/tomoemon/text_normalizer"
)

func main(){
s := "# # 5 5 a A a A ア ガ ア ガ あ が"
n := text_normalizer.NewTextNormalizer(
text_normalizer.ZenkakuSignToHankaku,
text_normalizer.ZenkakuNumberToHankaku,
text_normalizer.AlphabetToHankaku,
text_normalizer.KanaToZenkakuKatakana,
text_normalizer.RemoveDakuten)
fmt.Println(n.Replace(s))
}

出力

# # 5 5 a A a A ア カ ア カ ア カ

このように一つの文字列に含まれる複数の文字種をまとめて変換することができます。





  1. ガラケー向けのサービスを作っていた当時、片っ端からカタカナを半角カタカナに変換するのにお世話になりました