LoginSignup
26
17

More than 5 years have passed since last update.

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

Posted at

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

unicodeパッケージを眺めていたら、KatakanaHiraganaという変数を見つけた。
*unicode.RangeTableという型らしい。さらにunicode.Inという関数を発見。

func In(r rune, ranges ...*RangeTable) bool

ほうほう。これはひらがなかカタカナか判定できるぞ。

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

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

わからん。

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

26
17
4

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
26
17