LoginSignup
1
0

More than 1 year has passed since last update.

Goでカタカナバリデーションを実装しようとしたが、unicodeパッケージのKatakanaテーブルには記号なども含まれていた。

Posted at

現象

Goでカタカナチェックを実装する際に、
unicodeパッケージのKatakanaテーブルを利用していたのだが、

        if !unicode.In(r, unicode.Katakana) {
            return false
        }

なんか想定外のなどの記号も通してしまうので、
Katakanaのテーブルにはどのような文字が入っているのか確認した。

解析

unicodeパッケージのソースを見る限り、下記コードポイントの範囲で指定されている。

var _Katakana = &RangeTable{
    R16: []Range16{
        {0x30a1, 0x30fa, 1},
        {0x30fd, 0x30ff, 1},
        {0x31f0, 0x31ff, 1},
        {0x32d0, 0x32fe, 1},
        {0x3300, 0x3357, 1},
        {0xff66, 0xff6f, 1},
        {0xff71, 0xff9d, 1},
    },
    R32: []Range32{
        {0x1b000, 0x1b164, 356},
        {0x1b165, 0x1b167, 1},
    },
}

コードポイントを調べた所、アイウエオのような一般的なカタカナ以外にも、
㌠みたいな、カタカナを利用して構築してある記号や、
ヰのような旧字体かなや変体仮名も、カナとしての対象として含まれていた。

Range16

  • 0x30a1
  • 0x30fa
  • 0x30fd
  • 0x30ff
  • 0x31f0
  • 0x31ff
  • 0x32d0
  • 0x32fe
  • 0x3300
  • 0x3357
  • 0xff66
  • 0xff6f
  • 0xff71
  • 0xff9d

Range32

  • 0x1b000
    • 𛀀 変体仮名 片仮名 ア行エ段
  • 0x1b164
    • ヰ 旧字体かな文字
  • 0x1b165
    • ヱ 旧字体かな文字
  • 0x1b167
    • 𛅧 旧字体かな文字 ンの仮名?

対応

要件としては、記号系のカナはバリデーション対象外とする必要があり、
unicodeパッケージのKatakanaテーブルは使えないので、自作する事にした。

参考

1
0
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
1
0