ひらがなかカタカナなのか判定したい #golang
November 9, 2014
この記事はQiitaの記事をエクスポートしたものです。内容が古くなっている可能性があります。
ひらがなとカタカナの判定
unicode
パッケージを眺めていたら、Katakana
とHiragana
という変数を見つけた。
*unicode.RangeTable
という型らしい。さらにunicode.In
という関数を発見。
func In(r rune, ranges ...*RangeTable) bool
ほうほう。これはひらがなかカタカナか判定できるぞ。
http://play.golang.org/p/cKKSuzrn_F
package main
import (
"fmt"
"unicode"
)
func main() {
for _, r := range "あいうえおアイウエオアイウエオ" {
fmt.Println(string(r), "is Hiragana", unicode.In(r, unicode.Hiragana))
fmt.Println(string(r), "is Katakana", unicode.In(r, unicode.Katakana))
}
}
判定じゃなくて変換がしたいんだ
判定するだけなんてあまり用途がない。 顧客や上司からデータは半角カナオンリーね。って言われたらどうするんだ。 かといって、ユーザに半角カナを入力させるなんてナンセンスだ。 我々はひらがなをカタカナに、全角カナを半角カナに変換したいんだ。
strings
パッケージを眺めているとToLowerSpecial
という関数があった。
func ToLowerSpecial(_case unicode.SpecialCase, s string) string
第1引数にunicode.SpecialCase
を取る。unicode.SpecialCase
はunicode.CaseRange
のスライスっぽい。
unicode.CaseRange
は何なのかというと、
type CaseRange struct {
Lo uint32
Hi uint32
Delta d
}
というやつだ。
Lo
とかHi
はunicode.RangeTable
のR16
とかR32
とかにあったやつだ。
可能性を感じる。
unicode.d
ってなんだ。小文字だから外から使えないじゃないか。
type d [MaxCase]rune
おっ。
unicode.CaseRange{
Lo: ...,
Hi: ...,
Delta: [unicode.MaxCase]rune{0, 0x131 - 0x49, 0},
}
こんな感じで、リテラルで指定すればよいか。 しかし、何書いたらいいのかよくわからない。
わからん。
今日はここまで。 分かったらまた書きます。 すいませんでした。