業務アプリケーションやデータ移行ツールを開発していると、ユーザーが入力したデータの「表記揺れ」に悩まされることがよくあります。
「数字は半角に統一したい」「カナは全角で保存したい」といった要件は、日本のシステム開発において避けて通れない課題です。
そのため、開発者が状況に応じて最適な方法を選択する必要があります。
この記事では、C#で半角・全角変換を行うための主要なアプローチとして、手軽な StrConv の利用から、環境に依存しない 正規表現 での実装、そしてパフォーマンスを重視した 自作ロジック まで、現在の開発トレンドに合わせて徹底解説します。
![]() 執筆者:マヒロ |
|
C#で半角・全角変換を行う3つの主要な方法
C#で文字幅(Half-width / Full-width)を変換する方法は、大きく分けて以下の3つがあります。
Microsoft.VisualBasic.Strings.StrConvを使う- メリット:コードが最も短く、簡単。カタカナの濁点・半濁点の結合/分離も自動でやってくれる。
- デメリット:VB.NETのアセンブリを参照する必要がある。Linuxなどの非Windows環境で動作しない場合がある(環境依存)。
System.Text.RegularExpressions.Regex(正規表現)を使う- メリット:外部参照が不要で、.NET標準機能だけで完結する。英数字のみ、カタカナのみなど細かい制御が可能。
- デメリット:濁点・半濁点(ガ・カ゛)の処理などはロジックを組む必要がある。
- 自作のマッピング処理(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#の案件を探しやすくなります。
転職エージェントも副業エージェントも、登録・利用は完全無料なので、どんな求人や副業案件があるのか気になる方は、気軽に利用してみるとよいでしょう。



