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

November 9, 2014

この記事はQiitaの記事をエクスポートしたものです。内容が古くなっている可能性があります。

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

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},
}

こんな感じで、リテラルで指定すればよいか。 しかし、何書いたらいいのかよくわからない。

わからん。

今日はここまで。 分かったらまた書きます。 すいませんでした。