仮名・ローマ字変換する Go パッケージを作ってみた
@mattn_jp さんの tweet で偽名や偽住所を生成できる mattn/go-gimei という Go パッケージを知る。 なにそれ便利。 さっそく使わせてもらおう。
ところでこれローマ字があるといいよね。
というわけで,仮名からローマ字に変換するパッケージを作ってしまった(笑)
こんな感じで使うことができる。
package krconv_test
import (
"fmt"
"github.com/spiegel-im-spiegel/krconv"
)
func ExampleConvert() {
s := "マツエ テッペイ めっちゃほりでぃ ナンバかげつで まんざい みるんだょっ"
fmt.Println(krconv.Convert(s))
//Output:
//matsue teppei metchahoridei nambakagetsude manzai mirundayotsu
}
ちなみに UTF-8 文字列が前提ね。
これと先程の mattn/go-gimei を組み合わせてみよう。
//go:build run
// +build run
package main
import (
"fmt"
"strings"
"github.com/mattn/go-gimei"
"github.com/spiegel-im-spiegel/krconv"
)
func main() {
p := gimei.NewName()
fmt.Println("氏名:", p.Kanji())
fmt.Println("カナ:", p.Katakana())
fmt.Println("ローマ字:", strings.ToTitle(krconv.Convert(p.Last.Hiragana())), strings.Title(krconv.Convert(p.First.Hiragana())))
fmt.Println("Email:", string([]rune(krconv.Convert(p.First.Hiragana()))[0:1])+"."+krconv.Convert(p.Last.Hiragana())+"@example.com")
}
出力結果はこんな感じ。
$ go run sample.go
氏名: 上原 弥璃
カナ: ウエハラ イヨリ
ローマ字: UEHARA Iyori
Email: i.uehara@example.com
どやさ!
変換については,以下のページを参考に,ヘボン式にしている。
- ヘボン式ローマ字|神奈川県パスポートセンター公式サイト
- ヘボン式ローマ字綴方表(外務省のページ?)
ただし,長音の扱い(大野(おおの)→ [☓] oono , [○] ono)については判定が難しそうなので無視している1。 そうそう,これに関連して長音の記号(ー)は変換後の文字列から削除することにした。
全体の処理手順としては
- 半角全角変換(全角英数・記号は半角に,半角カナは全角に,カナの濁点・半濁点の合成列は事前合成形に)
- カタカナ→平仮名変換
- 文字単位(
rune
単位ではない)に分割 - 文字単位でローマ字への置き換え
- 拗音の変換
- 撥音・促音の変換
という感じ。 仮名文字以外の英数字や漢字や記号(「々」等)は素通しなのであしからず。 ヷ,ヸ,ヹ,ヺ はどう変換していいか分からなかったので,これも素通ししている。 「あ゙」のような対応するローマ字のない合成列も同様。
あとヒープを潤沢に使ってループもぐるぐる回してかなり富豪的なコードになっているので,大規模文字列やクリティカルな処理には向いてない。
というわけで,こんなんでよろしければどうぞ。
【2021-09-12 追記】
変換ロジックを見直した v0.1.2 をリリースした。
krconv パッケージの変換ロジックは,同じく拙作の gnkf からのコピペなのだが,仮名文字を平仮名に寄せると「ば(U+306F U+3099)」「ぱ(U+306F U+309A)」のような濁点・半濁点の結合文字を付加した合成列に対応できてないことに気が付いた。
そこで変換手順の前半を
- 平仮名→カタカナ変換
- 半角全角変換(全角英数・記号は半角に,半角カナは全角に,濁点・半濁点の合成列は事前合成形に)
と入れ替えることで対応した。 仮名文字を全角カタカナに寄せた上で変換するわけですな。
ブックマーク
参考図書
- プログラミング言語Go (ADDISON-WESLEY PROFESSIONAL COMPUTING SERIES)
- Alan A.A. Donovan (著), Brian W. Kernighan (著), 柴田 芳樹 (翻訳)
- 丸善出版 2016-06-20
- 単行本(ソフトカバー)
- 4621300253 (ASIN), 9784621300251 (EAN), 4621300253 (ISBN), 9784621300251 (ISBN)
- 評価
著者のひとりは(あの「バイブル」とも呼ばれる)通称 “K&R” の K のほうである。この本は Go 言語の教科書と言ってもいいだろう。