C# Tips | 文字列処理:日本語判定

C# C#
スポンサーリンク

はじめに 「日本語判定」は“文字列の中身の“顔ぶれ”を見分ける技

業務システムだと、こんな要件がよく出てきます。

  • 氏名は日本語で入力してほしい(漢字・ひらがな・カタカナ)
  • ログインIDは日本語禁止(英数字のみ)
  • フリガナはカタカナだけにしたい

これをコードでやろうとすると、必ずぶつかるのが「日本語判定」です。
でも C# には「これは日本語です」と教えてくれるメソッドはありません。
なので、自分で「どの文字を日本語とみなすか」を決めて、判定ロジックを組み立てる必要があります。

ここでは、初心者向けに、

  • まず「日本語の文字とは何か」をざっくり整理
  • ひらがな・カタカナ・漢字の Unicode 範囲で判定する方法
  • 「日本語を含むか?」「全部日本語か?」のユーティリティ化
  • 実務でよくある“日本語禁止/日本語必須”チェックへの応用

を、例題付きでかみ砕いて説明していきます。


日本語の文字って何?をざっくり整理する

日本語でよく使う文字の種類

ここでは、最低限これだけは押さえておきます。

  • ひらがな:あ〜ん(「ぁ」「ゃ」などの小さい文字も含む)
  • カタカナ:ア〜ン(全角カタカナ)
  • 漢字:一般的な CJK 統合漢字(いわゆる普通の漢字)
  • 全角記号・全角英数字:これを「日本語」とみなすかどうかは要件次第

まずは「ひらがな・カタカナ・漢字を“日本語”とみなす」方針で進めます。
全角英数字や全角記号をどう扱うかは、あとで触れます。

Unicode の“範囲”で考える

C# の char は Unicode の 1 文字です。
「この文字はひらがなか?」を判定するには、「ひらがなの Unicode 範囲に入っているか?」を見ます。

ざっくり言うと、

  • ひらがな:U+3040U+309F
  • カタカナ:U+30A0U+30FF
  • 漢字(CJK 統合漢字の基本面):U+4E00U+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# の日本語判定ユーティリティを、自分の手で設計・実装できるようになっていきます。

タイトルとURLをコピーしました