はじめに 「日本語判定」は“文字列の中身の“顔ぶれ”を見分ける技
業務システムだと、こんな要件がよく出てきます。
- 氏名は日本語で入力してほしい(漢字・ひらがな・カタカナ)
- ログインIDは日本語禁止(英数字のみ)
- フリガナはカタカナだけにしたい
これをコードでやろうとすると、必ずぶつかるのが「日本語判定」です。
でも C# には「これは日本語です」と教えてくれるメソッドはありません。
なので、自分で「どの文字を日本語とみなすか」を決めて、判定ロジックを組み立てる必要があります。
ここでは、初心者向けに、
- まず「日本語の文字とは何か」をざっくり整理
- ひらがな・カタカナ・漢字の Unicode 範囲で判定する方法
- 「日本語を含むか?」「全部日本語か?」のユーティリティ化
- 実務でよくある“日本語禁止/日本語必須”チェックへの応用
を、例題付きでかみ砕いて説明していきます。
日本語の文字って何?をざっくり整理する
日本語でよく使う文字の種類
ここでは、最低限これだけは押さえておきます。
- ひらがな:あ〜ん(「ぁ」「ゃ」などの小さい文字も含む)
- カタカナ:ア〜ン(全角カタカナ)
- 漢字:一般的な CJK 統合漢字(いわゆる普通の漢字)
- 全角記号・全角英数字:これを「日本語」とみなすかどうかは要件次第
まずは「ひらがな・カタカナ・漢字を“日本語”とみなす」方針で進めます。
全角英数字や全角記号をどう扱うかは、あとで触れます。
Unicode の“範囲”で考える
C# の char は Unicode の 1 文字です。
「この文字はひらがなか?」を判定するには、「ひらがなの Unicode 範囲に入っているか?」を見ます。
ざっくり言うと、
- ひらがな:
U+3040〜U+309F - カタカナ:
U+30A0〜U+30FF - 漢字(CJK 統合漢字の基本面):
U+4E00〜U+9FFF
この範囲に入っているかどうかを char の数値で判定していきます。
ひらがな・カタカナ・漢字を判定するユーティリティ
1文字が「日本語か?」を判定するメソッド
まずは「1文字が日本語かどうか」を判定するところから始めます。
using System;
public static class JapaneseCharUtil
{
public static bool IsHiragana(char c)
{
return c >= '\u3040' && c <= '\u309F';
}
public static bool IsKatakana(char c)
{
return c >= '\u30A0' && c <= '\u30FF';
}
public static bool IsKanji(char c)
{
return c >= '\u4E00' && c <= '\u9FFF';
}
public static bool IsJapaneseChar(char c)
{
return IsHiragana(c) || IsKatakana(c) || IsKanji(c);
}
}
C#ここでやっていることはシンプルです。
'\u3040'のように、Unicode のコードポイントを\uXXXXで書いている- ひらがな・カタカナ・漢字の範囲に入っているかを
>=と<=で判定 - 最後に
IsJapaneseCharで「ひらがな or カタカナ or 漢字なら true」
動作例でイメージをつかむ
Console.WriteLine(JapaneseCharUtil.IsJapaneseChar('あ')); // true(ひらがな)
Console.WriteLine(JapaneseCharUtil.IsJapaneseChar('ア')); // true(カタカナ)
Console.WriteLine(JapaneseCharUtil.IsJapaneseChar('漢')); // true(漢字)
Console.WriteLine(JapaneseCharUtil.IsJapaneseChar('A')); // false
Console.WriteLine(JapaneseCharUtil.IsJapaneseChar('1')); // false
Console.WriteLine(JapaneseCharUtil.IsJapaneseChar('☆')); // false(ここでは日本語扱いしていない)
C#ここまでで、「1文字レベルで日本語かどうか」を判定できるようになりました。
文字列に「日本語を含むか?」を判定する
1文字判定を組み合わせて「含まれているか」を見る
次は、「文字列の中に日本語が1文字でも含まれているか?」を判定するユーティリティです。
using System;
public static class JapaneseStringUtil
{
public static bool ContainsJapanese(string? value)
{
if (string.IsNullOrEmpty(value))
{
return false;
}
foreach (char c in value)
{
if (JapaneseCharUtil.IsJapaneseChar(c))
{
return true;
}
}
return false;
}
}
C#やっていることはとても素直です。
- null や空文字なら「日本語は含まれていない」として false
- 1文字ずつ見て、日本語文字が見つかったら true を返して終了
- 最後まで見ても見つからなければ false
動作例
Console.WriteLine(JapaneseStringUtil.ContainsJapanese("山田太郎")); // true
Console.WriteLine(JapaneseStringUtil.ContainsJapanese("Yamada太郎")); // true
Console.WriteLine(JapaneseStringUtil.ContainsJapanese("Yamada Taro")); // false
Console.WriteLine(JapaneseStringUtil.ContainsJapanese("123-ABC")); // false
Console.WriteLine(JapaneseStringUtil.ContainsJapanese(null)); // false
C#この ContainsJapanese は、例えばこんな場面で使えます。
- 「ログインIDに日本語が混ざっていないかチェックする(含まれていたらエラー)」
- 「フリーテキストに日本語が含まれているかどうかで処理を分ける」
文字列が「全部日本語か?」を判定する
「日本語以外が混ざっていないか」をチェックする
次は逆に、「この文字列は全部日本語だけで構成されているか?」を判定するユーティリティです。
using System;
public static class JapaneseStringUtil
{
public static bool IsAllJapanese(string? value)
{
if (string.IsNullOrEmpty(value))
{
return false; // 空は「全部日本語」とはみなさない方針
}
foreach (char c in value)
{
if (!JapaneseCharUtil.IsJapaneseChar(c))
{
return false;
}
}
return true;
}
}
C#ここでは、
- null や空文字は false(「全部日本語」とは言えない)とする
- 1文字でも日本語以外があれば false
- 最後まで見て全部日本語なら true
というルールにしています。
動作例
Console.WriteLine(JapaneseStringUtil.IsAllJapanese("山田太郎")); // true
Console.WriteLine(JapaneseStringUtil.IsAllJapanese("山田太郎A")); // false
Console.WriteLine(JapaneseStringUtil.IsAllJapanese("やまだタロウ")); // true
Console.WriteLine(JapaneseStringUtil.IsAllJapanese("")); // false
C#この IsAllJapanese は、例えばこんな場面で使えます。
- 「氏名は日本語のみ許可(英字や数字が混ざっていたらエラー)」
- 「フリガナはひらがな・カタカナだけにしたい(※ここはさらに絞る例を後で出します)」
ひらがなだけ/カタカナだけに絞る判定
ひらがなだけかどうか
フリガナを「ひらがなだけ」にしたい場合などは、
「日本語かどうか」ではなく「ひらがなだけかどうか」を判定します。
public static class KanaStringUtil
{
public static bool IsAllHiragana(string? value)
{
if (string.IsNullOrEmpty(value))
{
return false;
}
foreach (char c in value)
{
if (!JapaneseCharUtil.IsHiragana(c))
{
return false;
}
}
return true;
}
}
C#動作例です。
Console.WriteLine(KanaStringUtil.IsAllHiragana("やまだたろう")); // true
Console.WriteLine(KanaStringUtil.IsAllHiragana("ヤマダタロウ")); // false
Console.WriteLine(KanaStringUtil.IsAllHiragana("山田太郎")); // false
C#カタカナだけかどうか
フリガナを「カタカナだけ」にしたい場合はこちら。
public static class KanaStringUtil
{
public static bool IsAllKatakana(string? value)
{
if (string.IsNullOrEmpty(value))
{
return false;
}
foreach (char c in value)
{
if (!JapaneseCharUtil.IsKatakana(c))
{
return false;
}
}
return true;
}
}
C#動作例です。
Console.WriteLine(KanaStringUtil.IsAllKatakana("ヤマダタロウ")); // true
Console.WriteLine(KanaStringUtil.IsAllKatakana("やまだたろう")); // false
Console.WriteLine(KanaStringUtil.IsAllKatakana("山田太郎")); // false
C#「日本語判定」をもう一歩細かくして、「どの種類の日本語か」を判定するイメージです。
全角記号・全角英数字をどう扱うか問題
「日本語として許可するか」は要件次第
例えば、次のような文字があります。
- 全角英数字:ABC123
- 全角記号:!@#など
これらを「日本語として許可するかどうか」は、業務要件によって変わります。
- 氏名なら「全角英数字は基本的に使わない前提で禁止」でもよい
- 自由入力欄なら「全角英数字も日本語の一部として許可」でもよい
もし「全角英数字も日本語扱いしたい」なら、IsJapaneseChar に「全角英数字の範囲」を足していく形になります。
ただし、Unicode の範囲が少しややこしくなるので、
最初の段階では「ひらがな・カタカナ・漢字だけ」を日本語とみなす方針で十分です。
実務での使いどころと設計のコツ
よくあるパターン
日本語判定ユーティリティは、こんなところで効いてきます。
- ログインID/ユーザーID
日本語禁止 →ContainsJapaneseが true ならエラー - 氏名(漢字+かな)
日本語必須 →ContainsJapaneseが false ならエラー - フリガナ(カタカナのみ)
IsAllKatakanaが false ならエラー - 検索用キー(英数字のみ)
日本語が混ざっていたら別の処理に回す、など
ルールを「ユーティリティに埋め込む」
大事なのは、「何を日本語とみなすか」「空文字をどう扱うか」といったルールを、
ユーティリティの中に“決めごととして埋め込む”ことです。
呼び出し側は、
ContainsJapanese→ 「日本語が含まれているか?」IsAllJapanese→ 「全部日本語か?」IsAllHiragana/IsAllKatakana→ 「ひらがな/カタカナだけか?」
のような“意味のある名前”だけを見ればよくなります。
これが、実務で長く保守されるコードの書き方です。
まとめ 「日本語判定ユーティリティ」は“文字列の中身の顔ぶれを見分けるフィルタ”
日本語判定は、見た目は地味ですが、
- 日本語禁止のフィールドを守る
- 日本語必須のフィールドの品質を保つ
- ひらがな/カタカナ/漢字の使い分けルールをコード化する
といった場面で、じわじわ効いてくるユーティリティです。
押さえておきたいポイントは、
- ひらがな・カタカナ・漢字の Unicode 範囲を使って「日本語文字」を定義する
- 1文字判定(
IsJapaneseChar)をベースに、「含まれているか」「全部日本語か」を組み立てる - ひらがなだけ/カタカナだけの判定も、同じ考え方で簡単に作れる
- 全角英数字や記号を日本語扱いするかどうかは、要件に応じて後から拡張する
ここまで理解できれば、「なんとなく日本語っぽいか見ている」段階から一歩進んで、
“文字列の中身の顔ぶれをきちんと見分けるフィルタ”として、
業務で使える C# の日本語判定ユーティリティを、自分の手で設計・実装できるようになっていきます。
