Posted at

ひらがなかカタカナなのか判定したい #golang

More than 3 years have passed since last update.


ひらがなとカタカナの判定

unicodeパッケージを眺めていたら、KatakanaHiraganaという変数を見つけた。

*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.SpecialCaseunicode.CaseRangeのスライスっぽい。

unicode.CaseRangeは何なのかというと、

type CaseRange struct {

Lo uint32
Hi uint32
Delta d
}

というやつだ。

LoとかHiunicode.RangeTableR16とかR32とかにあったやつだ。

可能性を感じる。

unicode.dってなんだ。小文字だから外から使えないじゃないか。

type d [MaxCase]rune

おっ。

unicode.CaseRange{

Lo: ...,
Hi: ...,
Delta: [unicode.MaxCase]rune{0, 0x131 - 0x49, 0},
}

こんな感じで、リテラルで指定すればよいか。

しかし、何書いたらいいのかよくわからない。

わからん。

今日はここまで。

分かったらまた書きます。

すいませんでした。