views:

540

answers:

3

I am working on an application that allows users to input Japanese language characters. I am trying to come up with a way to determine whether the user's input is a Japanese kana (hiragana, katakana, or kanji).

There are certain fields in the application where entering Latin text would be inappropriate and I need a way to limit certain fields to kanji-only, or katakana-only, etc.

The project uses UTF-8 encoding. I don't expect to accept JIS or Shift-JIS input.

Ideas?

+4  A: 

Not sure of a perfect answer, but there is a Unicode range for katakana and hiragana listed on Wikipedia. (Which I would expect are also available from unicode.org as well.)

  • Hiragana: Unicode: 3040-309F
  • Katakana: Unicode: 30A0–30FF

Checking those ranges against the input should work as a validation for hiragana or katakana for Unicode in a language-agnostic manner.

For kanji, I would expect it to be a little more complicated, as I expect that the Chinese characters used in Chinese and Japanese are both included in the same range, but then again, I may be wrong here. (I can't expect that Simplified Chinese and Traditional Chinese to be included in the same range...)

coobird
+3  A: 

It sounds like you basically need to just check whether each Unicode character is within a particular range. The Unicode code charts should be a good starting point.

If you're using .NET, my MiscUtil library has some Unicode range support - it's primitive, but it should do the job. I don't have the source to hand right now, but will update this post with an example later if it would be helpful.

Jon Skeet
Jon, you wouldn't happen to have the source handy, would you?
Zack Mulgrew
@Zack: Follow the link and you can download it :)
Jon Skeet
+3  A: 

oh oh! I had this one once... I had a regex with the hiragana, then katakana and then the kanji. I forget the exact codes, I'll go have a look.

regex is great because you double the problems. And I did it in PHP, my choice for extra strong auto problem generation

--edit--

$pattern = '/[^\wぁ-ゔァ-ヺー\x{4E00}-\x{9FAF}_\-]+/u';

I found this here, but it's not great... I'll keep looking

--edit-- I looked through my portable hard drive.... I thought I had kept that particular snippet from the last company... sorry.

Assembler