記事内にはプロモーションが含まれています

【C#】半角⇔全角の変換方法!StrConvや正規表現での実装

【C#】半角⇔全角の変換方法!StrConvや正規表現での実装 C#

業務アプリケーションやデータ移行ツールを開発していると、ユーザーが入力したデータの「表記揺れ」に悩まされることがよくあります。

「数字は半角に統一したい」「カナは全角で保存したい」といった要件は、日本のシステム開発において避けて通れない課題です。

C#には、VB.NETのように「半角・全角変換」を一発で行う専用の標準メソッドが存在しません。
そのため、開発者が状況に応じて最適な方法を選択する必要があります。

この記事では、C#で半角・全角変換を行うための主要なアプローチとして、手軽な StrConv の利用から、環境に依存しない 正規表現 での実装、そしてパフォーマンスを重視した 自作ロジック まで、現在の開発トレンドに合わせて徹底解説します。

【本記事の信頼性】
プロフィール
執筆者:マヒロ
  • 執筆者は元エンジニア
  • SES⇒大手の社内SE⇒独立
  • 現在はこじんまりとしたプログラミングスクールを運営
  • モットーは「利他の精神」

C#で半角・全角変換を行う3つの主要な方法

C#で文字幅(Half-width / Full-width)を変換する方法は、大きく分けて以下の3つがあります。

  1. Microsoft.VisualBasic.Strings.StrConv を使う
    • メリット:コードが最も短く、簡単。カタカナの濁点・半濁点の結合/分離も自動でやってくれる。
    • デメリット:VB.NETのアセンブリを参照する必要がある。Linuxなどの非Windows環境で動作しない場合がある(環境依存)。
  2. System.Text.RegularExpressions.Regex(正規表現)を使う
    • メリット:外部参照が不要で、.NET標準機能だけで完結する。英数字のみ、カタカナのみなど細かい制御が可能。
    • デメリット:濁点・半濁点(ガ・カ゛)の処理などはロジックを組む必要がある。
  3. 自作のマッピング処理(Dictionaryなど)を使う
    • メリット:最速。変換ルールを完全に制御できる。
    • デメリット:実装が面倒。

Windows専用のデスクトップアプリなら「1」が手軽ですが、Webアプリ(ASP.NET Core)やクロスプラットフォームを意識するなら「2」または「3」が推奨されます。

方法1:Microsoft.VisualBasic.Strings.StrConvを使う

C#から、VB.NETの便利な関数である StrConv を呼び出す方法です。
Windows環境での開発であれば、これが最も手っ取り早い解決策です。

準備:参照の追加

この機能を使うには、プロジェクトに Microsoft.VisualBasic への参照を追加する必要があります。
(.NET Core / .NET 5以降では、NuGetパッケージなどの追加が必要な場合がありますが、Windows互換パックに含まれていることが多いです)

StrConvを使った変換コード

using System;
using Microsoft.VisualBasic; // 必須

class Program
{
    static void Main()
    {
        string text = "ABCabc123アイウ";

        // 全角 → 半角
        // VbStrConv.Narrow を指定
        string narrow = Strings.StrConv(text, VbStrConv.Narrow, 0);
        Console.WriteLine($"半角変換: {narrow}");

        // 半角 → 全角
        // VbStrConv.Wide を指定
        string wide = Strings.StrConv(narrow, VbStrConv.Wide, 0);
        Console.WriteLine($"全角変換: {wide}");
        
        // カタカナのみ全角、英数字は半角などの組み合わせも可能
        // ただし、StrConvだけでは細かい種別指定は難しい
    }
}

実行結果

半角変換: ABCabc123アイウ
全角変換: ABCabc123アイウ

Strings.StrConv メソッドの第2引数に変換モードを指定します。

  • VbStrConv.Narrow:全角を半角に変換します。
  • VbStrConv.Wide:半角を全角に変換します。 第3引数の 0 はロケールID(LocaleID)で、通常はシステム設定に従うため 0 を指定します。 このメソッドの強力な点は、「ガ(全角)」を「ガ(半角2文字)」に、逆に「ガ」を「ガ」に正しく変換してくれる点です。

方法2:正規表現(Regex)を使って英数字のみ変換する

「英数字だけを半角にして、カタカナはそのままにしたい」といった要件では、正規表現を使った置換が便利です。
文字コードの差分を利用して計算で変換します。

全角英数字を半角に変換するコード

using System;
using System.Text.RegularExpressions;

class Program
{
    static void Main()
    {
        string text = "ID:12345、Pass:abc";

        // 全角英数字(0-9、A-Z、a-z)にマッチする正規表現
        // マッチした文字を1つずつラムダ式で変換する
        string result = Regex.Replace(text, "[0-9A-Za-z]", match =>
        {
            // マッチした文字の文字コードを取得
            char c = match.Value[0];
            
            // 全角と半角の文字コードの差分(0xFEE0)を引く
            return ((char)(c - 0xFEE0)).ToString();
        });

        Console.WriteLine($"変換後: {result}");
    }
}

実行結果

変換後: ID:12345、Pass:abc

全角英数字(ASCII互換の範囲)は、Unicode上で半角文字に 0xFEE0 (65248)を足した位置に並んでいます。

そのため、正規表現で見つけた全角文字から 0xFEE0 を引くことで、対応する半角文字に変換できます。

Regex.Replace の第3引数に MatchEvaluator(変換処理を行う関数)を渡すことで、柔軟な置換が可能です。

※注意点:全角スペースについて
全角スペース(U+3000)と半角スペース(U+0020)の差分は 0xFEE0 ではありません。
そのため、上記の計算ロジックではスペースは変換されません。
全角スペースも変換したい場合は、別途 Replace(" ", " ") を行う必要があります。

半角英数字を全角に変換する場合

逆を行う場合は、足し算をするだけです。

string result = Regex.Replace(text, "[0-9A-Za-z]", match =>
{
    char c = match.Value[0];
    return ((char)(c + 0xFEE0)).ToString();
});

方法3:変換マップ(Dictionary)を自作して高速化

特定の文字(例えばカタカナや記号)だけを変換したい場合や、パフォーマンスを最優先したい場合は、変換テーブルを自作するのが確実です。

特に半角カタカナと全角カタカナの変換は、文字コードの計算だけでは対応できない(並び順が一致しない)ため、マッピングが必要です。

カタカナ変換の実装例

using System;
using System.Collections.Generic;
using System.Text;

class KanaConverter
{
    // 半角カナと全角カナの対応表(一部抜粋)
    private static readonly Dictionary<char, char> HalfToFullMap = new Dictionary<char, char>
    {
        {'ア', 'ア'}, {'イ', 'イ'}, {'ウ', 'ウ'}, {'エ', 'エ'}, {'オ', 'オ'},
        {'カ', 'カ'}, {'キ', 'キ'}, {'ク', 'ク'}, {'ケ', 'ケ'}, {'コ', 'コ'},
        // ... 実際には全てのカタカナを定義する ...
        {'゙', '゛'}, {'゚', '゜'} 
    };

    public static string ToFullWidthKana(string input)
    {
        if (string.IsNullOrEmpty(input)) return input;

        var sb = new StringBuilder(input.Length);
        
        foreach (char c in input)
        {
            if (HalfToFullMap.TryGetValue(c, out char fullChar))
            {
                sb.Append(fullChar);
            }
            else
            {
                sb.Append(c); // 対応表になければそのまま
            }
        }
        
        // ※注意:濁点・半濁点の結合処理(例:カ+゛→ ガ)を行う場合は
        // もう少し複雑なロジックが必要になります。
        
        return sb.ToString();
    }
}

Dictionary を使って、変換対象の文字と変換後の文字をペアで管理します。

入力文字列を1文字ずつ走査し、辞書にあれば置換、なければそのまま追加という処理を行います。 StringBuilder を使うことで、長い文字列でも高速に処理できます。

【モダン】Unicode正規化(Normalize)を使う

.NETの標準機能である String.Normalize メソッドを使うと、複雑なロジックを書かずに「全角英数→半角」「半角カナ→全角」といった変換を一括で行えます。

Windows以外の環境(LinuxやDocker上のASP.NET Coreなど)でも動作するため、現在、最も推奨されるモダンな手法の一つです。

using System;
using System.Text;

class Program
{
    static void Main()
    {
        string text = "ガーデン ABC"; // 半角カナ+全角英字

        // NFKC(互換構成)形式で正規化する
        // これだけで「半角カナ→全角」「全角英数→半角」が行われる
        string result = text.Normalize(NormalizationForm.FormNFKC);

        Console.WriteLine($"変換後: {result}");
    }
}

実行結果

変換後: ガーデン ABC

NormalizationForm.FormNFKC を指定することで、Unicodeの互換文字(半角カナや全角英数など)を、標準的な形式(全角カナや半角英数)に置き換えます。

これにより、StrConv を使わなくても「カ」と「゙」が結合して「ガ」になり、全角英数字は半角に統一されます。

細かい制御はできませんが、汎用的な変換ならこれが最強の選択肢です。

C#のスキルを活かして年収を上げる方法

以上、C#での半角⇔全角の変換方法について解説してきました。

なお、C#のスキルがある場合には、「転職して年収をアップさせる」「副業で稼ぐ」といった方法を検討するのがおすすめです。

業務システム開発やアプリ開発、ゲーム開発において需要の高いC#を扱えるエンジニアは、転職によって数十万円の年収アップはザラで、100万円以上年収が上がることも珍しくありません。

なお、転職によって年収を上げたい場合は、エンジニア専門の転職エージェントサービスを利用するのが最適です。

今すぐ転職する気がなくとも、とりあえず転職エージェントに無料登録しておくだけで、スカウトが届いたり、思わぬ好待遇の求人情報が送られてきたりするというメリットがあります。

併せて、副業案件を獲得できるエージェントにも登録しておくと、空いている時間を活かして稼げるようなC#の案件を探しやすくなります。

転職エージェントも副業エージェントも、登録・利用は完全無料なので、どんな求人や副業案件があるのか気になる方は、気軽に利用してみるとよいでしょう。

C#
スポンサーリンク
code-izumiをフォローする