13
9

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 3 years have passed since last update.

Golangでひらがな、カタカナ、漢字を判定する

Posted at

Golangで漢字を判定する必要があったので正規表現を使ってUnicodeの範囲を指定するみたいな事しないといけないのかなと思って調べていたんですが、built inのunicode packageUnicodeの範囲を示すRangeTableが既に用意されていたのでした。

というわけでunicode packageを利用してこんな感じで実装出来ます。

ひらがなを判定する

import (
	"unicode"
)

func IsHiragana(r rune) bool {
	return unicode.In(r, unicode.Hiragana)
}

カタカナを判定する

import (
	"unicode"
)

func IsKatakana(r rune) bool {
	return unicode.In(r, unicode.Katakana)
}

漢字を判定する

import (
	"unicode"
)

func IsKanji(r rune) bool {
	return unicode.In(r, unicode.Han)
}

UniHanは日本漢字の他に繁体字、簡体字、韓国漢字、ベトナム漢字が含まれます。
厳密に日本の漢字のみを判定したいならRangeTableを独自に定義してUnicodeの範囲を指定してあげる必要がありそうです。

動作確認

package main

import (
	"fmt"
	"unicode"
)

func main() {
	for _, s := range []string{"あ", "ア", "ア", "漢"} {
		rs := []rune(s)
		fmt.Printf("[%s]", s)
		fmt.Printf(" IsHiragana=%v", IsHiragana(rs[0]))
		fmt.Printf(" IsKatakana=%v", IsKatakana(rs[0]))
		fmt.Printf(" IsKanji=%v", IsKanji(rs[0]))
		fmt.Println()
	}
}

func IsHiragana(r rune) bool {
	return unicode.In(r, unicode.Hiragana)
}

func IsKatakana(r rune) bool {
	return unicode.In(r, unicode.Katakana)
}

func IsKanji(r rune) bool {
	return unicode.In(r, unicode.Han)
}
[あ] IsHiragana=true IsKatakana=false IsKanji=false
[ア] IsHiragana=false IsKatakana=true IsKanji=false
[ア] IsHiragana=false IsKatakana=true IsKanji=false
[漢] IsHiragana=false IsKatakana=false IsKanji=true

半角カナもちゃんと判定されてますね。良さそうです。

13
9
0

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
13
9

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?