現象
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テーブルは使えないので、自作する事にした。