C#で全角・半角を変換する方法|判定・置換までサンプルコードで解説

はじめに

C#でユーザー入力やCSV、帳票、検索キーワードなどを扱っていると、「ABC」と「ABC」、「123」と「123」、「カタカナ」と「カタカナ」のように、全角・半角の違いで処理結果が変わることがあります。

たとえば、画面上では同じように見える文字列でも、C#では別の文字として扱われます。そのため、検索、重複チェック、バリデーション、データ連携、置換処理などでは、全角・半角の変換や判定が重要です。

この記事では、C#で全角・半角を変換する方法を、判定・置換のサンプルコードとあわせて解説します。全角英数字、半角英数字、全角スペース、半角スペース、カタカナ、記号まで扱うため、実務でそのまま使える形で理解できます。

1. C#で全角・半角を扱う前に知っておきたい基礎

1-1. 全角・半角とは?英数字・記号・カナ・スペースの違い

全角文字とは、日本語環境で主に使われる幅の広い文字のことです。たとえば、次のような文字があります。

C#
ABC
123
@#%
カタカナ
 

一方、半角文字は英数字や記号などでよく使われる幅の狭い文字です。

C#
ABC
123
@#%
カタカナ

C#では、全角の「A」と半角の「A」は別の文字として扱われます。

C#
Console.WriteLine("A" == "A"); // False

見た目が似ていても文字コードが異なるため、単純な文字列比較では一致しません。

また、スペースにも注意が必要です。半角スペースは通常の空白ですが、全角スペースは日本語文章で使われる幅の広い空白です。

C#
Console.WriteLine(" " == " "); // False

そのため、全角・半角を扱うときは、英数字、記号、カナ、スペースを分けて考えることが大切です。

1-2. C#で全角・半角処理が必要になる主なケース

C#で全角・半角処理が必要になる代表的なケースは、次のような場面です。

ユーザー入力の正規化では、「ABC123」と「ABC123」を同じ値として扱いたい場合があります。会員登録フォーム、住所入力、商品コード入力、電話番号入力などでよく使われます。

検索処理でも、全角・半角の違いは問題になります。たとえば、データベースに「ABC」と登録されているのに、ユーザーが「ABC」と入力すると、通常の完全一致検索ではヒットしない可能性があります。

CSVや外部システム連携でも、全角・半角の統一が必要です。外部システムが半角英数字しか受け付けない場合、事前に全角英数字を半角に変換する必要があります。

バリデーションでは、「半角英数字のみ許可」「全角カタカナのみ許可」「全角文字を含んではいけない」といった判定が必要になることがあります。

このように、C#で全角・半角を正しく扱うことは、入力チェックやデータ品質を高めるうえで重要です。

1-3. 変換・判定・置換で使う代表的な方法の比較

C#で全角・半角を扱う方法には、いくつかの選択肢があります。

まず、英数字や一部の記号を正規化する場合は、Normalizeを使う方法があります。特にNormalizationForm.FormKCを使うと、全角英数字を半角に変換できます。

C#
string text = "ABC123";
string result = text.Normalize(NormalizationForm.FormKC);

Console.WriteLine(result); // ABC123

ただし、Normalizeはすべての用途に万能ではありません。たとえば、半角カタカナは全角カタカナに正規化されますが、全角カタカナを半角カタカナにしたい場合には別の方法が必要です。

全角・半角のカナ変換まで行いたい場合は、Microsoft.VisualBasic.Strings.StrConvを使う方法があります。C#でもMicrosoft.VisualBasic名前空間を参照すれば利用できます。

また、特定の文字だけを変換したい場合は、Replaceがシンプルです。たとえば、全角スペースだけを半角スペースに置換する場合に向いています。

判定処理では、正規表現を使う方法と、文字コードの範囲を見て判定する方法があります。正規表現は読みやすく、文字コード範囲による判定は細かく制御しやすいのが特徴です。

用途別に整理すると、次のようになります。

C#
// 全角英数字を半角にしたい
Normalize(NormalizationForm.FormKC)

// 全角スペースだけ置換したい
Replace(" ", " ")

// 半角カタカナを全角カタカナにしたい
Normalize(NormalizationForm.FormKC) または StrConv

// 全角カタカナを半角カタカナにしたい
StrConv

// 全角・半角を判定したい
Regex または 文字コード範囲

2. C#で全角を半角に変換する方法

2-1. Normalizeを使って全角英数字を半角に変換する

C#で全角英数字を半角に変換する簡単な方法は、string.Normalizeを使うことです。

NormalizationForm.FormKCを指定すると、互換文字が標準的な形に正規化されます。全角英数字は半角英数字に変換されます。

C#
using System;
using System.Text;

class Program
{
static void Main()
{
string input = "ABC123";
string result = input.Normalize(NormalizationForm.FormKC);

Console.WriteLine(result); // ABC123
}
}

全角の英字や数字だけでなく、一部の全角記号も半角に変換されます。

C#
string input = "ABC!123?";
string result = input.Normalize(NormalizationForm.FormKC);

Console.WriteLine(result); // ABC!123?

ただし、Normalizeには注意点があります。全角カタカナを半角カタカナに変換する目的では使えません。むしろ、半角カタカナは全角カタカナへ正規化されます。

C#
string input = "カタカナ";
string result = input.Normalize(NormalizationForm.FormKC);

Console.WriteLine(result); // カタカナ

そのため、全角英数字の半角化にはNormalizeが便利ですが、カタカナの半角化には別の方法を使いましょう。

2-2. 全角スペースを半角スペースに変換する

全角スペースはNormalize(NormalizationForm.FormKC)でも半角スペースに変換できます。

C#
using System;
using System.Text;

class Program
{
static void Main()
{
string input = "山田 太郎";
string result = input.Normalize(NormalizationForm.FormKC);

Console.WriteLine(result); // 山田 太郎
}
}

ただし、スペースだけを確実に置換したい場合は、Replaceを使う方法がわかりやすいです。

C#
string input = "山田 太郎";
string result = input.Replace(" ", " ");

Console.WriteLine(result); // 山田 太郎

Replaceを使うと、全角英数字や記号には影響を与えず、全角スペースだけを半角スペースに変換できます。

C#
string input = "ABC 123";
string result = input.Replace(" ", " ");

Console.WriteLine(result); // ABC 123

全角スペースだけを処理したい場合はReplace、全角英数字や記号もまとめて半角化したい場合はNormalizeを使うとよいでしょう。

2-3. 全角カタカナを半角カタカナに変換する

全角カタカナを半角カタカナに変換する場合は、Microsoft.VisualBasic.Strings.StrConvを使う方法が便利です。

C#で使用するには、次の名前空間を追加します。

C#
using Microsoft.VisualBasic;

全角カタカナを半角カタカナへ変換するには、VbStrConv.Narrowを指定します。

C#
using System;
using Microsoft.VisualBasic;

class Program
{
static void Main()
{
string input = "カタカナ";
string result = Strings.StrConv(input, VbStrConv.Narrow, 0x0411);

Console.WriteLine(result); // カタカナ
}
}

第3引数の0x0411は日本語ロケールを表します。カタカナ変換のように日本語環境に依存する処理では、明示しておくと意図がわかりやすくなります。

濁点や半濁点を含むカタカナも変換できます。

C#
string input = "ガギグゲゴ パピプペポ";
string result = Strings.StrConv(input, VbStrConv.Narrow, 0x0411);

Console.WriteLine(result); // ガギグゲゴ パピプペポ

ただし、StrConvは環境や対象フレームワークによって利用可否や挙動を確認しておく必要があります。業務システムで使う場合は、対象の.NETバージョンと実行環境でテストしてから採用しましょう。

2-4. 全角記号を半角記号に変換する

全角記号を半角記号に変換する場合も、Normalize(NormalizationForm.FormKC)が使えます。

C#
using System;
using System.Text;

class Program
{
static void Main()
{
string input = "!@#$%&()";
string result = input.Normalize(NormalizationForm.FormKC);

Console.WriteLine(result); // !@#$%&()
}
}

全角英数字と一部の記号をまとめて半角にしたい場合は、次のように書けます。

C#
string input = "ID:12345@ABC";
string result = input.Normalize(NormalizationForm.FormKC);

Console.WriteLine(result); // ID:12345@ABC

ただし、すべての記号が期待どおりに変換されるとは限りません。特に、業務上「この記号は変換したい」「この記号は変換したくない」というルールがある場合は、独自の置換表を用意する方法が安全です。

C#
string input = "価格:1,000円";
string result = input
.Replace(":", ":")
.Replace(",", ",");

Console.WriteLine(result); // 価格:1,000円

全体を正規化すると数字も半角になりますが、個別にReplaceすれば対象を限定できます。

2-5. 全角から半角へ変換するサンプルコード

全角英数字、全角記号、全角スペースをまとめて半角に変換するなら、まずはNormalize(NormalizationForm.FormKC)を使うのが簡単です。

C#
using System;
using System.Text;

public static class WidthConverter
{
public static string ToHalfWidthBasic(string input)
{
if (string.IsNullOrEmpty(input))
{
return input;
}

return input.Normalize(NormalizationForm.FormKC);
}
}

class Program
{
static void Main()
{
string input = "ABC123! テスト";
string result = WidthConverter.ToHalfWidthBasic(input);

Console.WriteLine(result); // ABC123! テスト
}
}

ただし、この方法では半角カタカナが全角カタカナに変換される点に注意してください。

C#
string input = "ABC123 カタカナ";
string result = input.Normalize(NormalizationForm.FormKC);

Console.WriteLine(result); // ABC123 カタカナ

全角カタカナも半角にしたい場合は、StrConvを組み合わせます。

C#
using System;
using System.Text;
using Microsoft.VisualBasic;

public static class WidthConverter
{
public static string ToHalfWidth(string input)
{
if (string.IsNullOrEmpty(input))
{
return input;
}

string normalized = input.Normalize(NormalizationForm.FormKC);

return Strings.StrConv(normalized, VbStrConv.Narrow, 0x0411);
}
}

class Program
{
static void Main()
{
string input = "ABC123! カタカナ";
string result = WidthConverter.ToHalfWidth(input);

Console.WriteLine(result); // ABC123! カタカナ
}
}

このコードでは、まずNormalizeで全角英数字や記号を半角に変換し、その後StrConvでカタカナも半角に変換しています。

ただし、用途によってはカタカナを半角にしないほうがよい場合もあります。検索用の正規化では全角カタカナのまま扱うことも多いため、業務ルールに合わせて変換範囲を決めましょう。

3. C#で半角を全角に変換する方法

3-1. 半角英数字を全角に変換する

半角英数字を全角に変換する場合、Normalizeだけでは対応できません。Normalize(NormalizationForm.FormKC)は、基本的に互換文字を標準形へ寄せるため、全角英数字は半角になりますが、半角英数字を全角にする処理ではありません。

半角英数字を全角に変換するには、文字コードの差を利用する方法がよく使われます。

ASCIIの半角英数字や記号の一部は、全角文字と一定の差があります。半角の!から~までを全角に変換する場合は、0xFEE0を加算します。

C#
using System;

public static class WidthConverter
{
public static string ToFullWidthAscii(string input)
{
if (string.IsNullOrEmpty(input))
{
return input;
}

char[] chars = input.ToCharArray();

for (int i = 0; i < chars.Length; i++)
{
if (chars[i] >= '!' && chars[i] <= '~')
{
chars[i] = (char)(chars[i] + 0xFEE0);
}
}

return new string(chars);
}
}

class Program
{
static void Main()
{
string input = "ABC123";
string result = WidthConverter.ToFullWidthAscii(input);

Console.WriteLine(result); // ABC123
}
}

この方法では、英数字だけでなく記号も全角化されます。

C#
string input = "ABC-123@example.com";
string result = WidthConverter.ToFullWidthAscii(input);

Console.WriteLine(result); // ABC-123@example.com

英数字だけを全角にしたい場合は、条件を英字と数字に限定します。

C#
public static string ToFullWidthAlphanumeric(string input)
{
if (string.IsNullOrEmpty(input))
{
return input;
}

char[] chars = input.ToCharArray();

for (int i = 0; i < chars.Length; i++)
{
bool isNumber = chars[i] >= '0' && chars[i] <= '9';
bool isUpper = chars[i] >= 'A' && chars[i] <= 'Z';
bool isLower = chars[i] >= 'a' && chars[i] <= 'z';

if (isNumber || isUpper || isLower)
{
chars[i] = (char)(chars[i] + 0xFEE0);
}
}

return new string(chars);
}

3-2. 半角スペースを全角スペースに変換する

半角スペースを全角スペースに変換する場合は、Replaceを使うのが簡単です。

C#
string input = "山田 太郎";
string result = input.Replace(" ", " ");

Console.WriteLine(result); // 山田 太郎

半角スペースは、文字コードの差を使った変換対象には含まれません。そのため、半角英数字や記号を全角化する処理とは別に扱う必要があります。

C#
public static string ToFullWidthWithSpace(string input)
{
if (string.IsNullOrEmpty(input))
{
return input;
}

char[] chars = input.ToCharArray();

for (int i = 0; i < chars.Length; i++)
{
if (chars[i] == ' ')
{
chars[i] = ' ';
}
else if (chars[i] >= '!' && chars[i] <= '~')
{
chars[i] = (char)(chars[i] + 0xFEE0);
}
}

return new string(chars);
}

実行例は次のとおりです。

C#
string input = "ABC 123";
string result = ToFullWidthWithSpace(input);

Console.WriteLine(result); // ABC 123

全角スペースは見落としやすい文字です。入力チェックやデータ整形では、英数字だけでなくスペースも変換対象に含めるかどうかを明確にしておきましょう。

3-3. 半角カタカナを全角カタカナに変換する

半角カタカナを全角カタカナに変換する場合は、Normalize(NormalizationForm.FormKC)が使えます。

C#
using System;
using System.Text;

class Program
{
static void Main()
{
string input = "カタカナ";
string result = input.Normalize(NormalizationForm.FormKC);

Console.WriteLine(result); // カタカナ
}
}

濁点や半濁点を含む半角カタカナも、全角カタカナに変換されます。

C#
string input = "ガギグゲゴ パピプペポ";
string result = input.Normalize(NormalizationForm.FormKC);

Console.WriteLine(result); // ガギグゲゴ パピプペポ

StrConvを使って変換することもできます。

C#
using System;
using Microsoft.VisualBasic;

class Program
{
static void Main()
{
string input = "カタカナ";
string result = Strings.StrConv(input, VbStrConv.Wide, 0x0411);

Console.WriteLine(result); // カタカナ
}
}

半角カタカナを全角カタカナにするだけなら、Normalizeのほうがシンプルです。ただし、半角英数字も同時に全角化したい場合は、Normalizeだけでは足りないため、文字コード変換やStrConvを組み合わせる必要があります。

3-4. 半角記号を全角記号に変換する

半角記号を全角記号に変換する場合も、半角英数字と同じように0xFEE0を加算する方法が使えます。

C#
using System;

public static class WidthConverter
{
public static string ToFullWidthAsciiAndSymbols(string input)
{
if (string.IsNullOrEmpty(input))
{
return input;
}

char[] chars = input.ToCharArray();

for (int i = 0; i < chars.Length; i++)
{
if (chars[i] >= '!' && chars[i] <= '~')
{
chars[i] = (char)(chars[i] + 0xFEE0);
}
else if (chars[i] == ' ')
{
chars[i] = ' ';
}
}

return new string(chars);
}
}

実行例です。

C#
string input = "ABC-123@example.com";
string result = WidthConverter.ToFullWidthAsciiAndSymbols(input);

Console.WriteLine(result); // ABC-123@example.com

すべての半角記号を全角にしたくない場合は、変換対象を限定しましょう。

たとえば、ハイフンとアットマークだけを全角にするなら、Replaceを使えます。

C#
string input = "ABC-123@example.com";
string result = input
.Replace("-", "-")
.Replace("@", "@");

Console.WriteLine(result); // ABC-123@example.com

記号は業務ルールによって扱いが変わりやすい部分です。メールアドレスやURLでは半角記号のままにすべきですが、帳票出力や表示用文字列では全角化したい場合もあります。

3-5. 半角から全角へ変換するサンプルコード

半角英数字、半角記号、半角スペース、半角カタカナをまとめて全角に変換するサンプルコードです。

C#
using System;
using System.Text;

public static class WidthConverter
{
public static string ToFullWidth(string input)
{
if (string.IsNullOrEmpty(input))
{
return input;
}

// まず半角カタカナを全角カタカナへ変換
string normalized = input.Normalize(NormalizationForm.FormKC);

char[] chars = normalized.ToCharArray();

for (int i = 0; i < chars.Length; i++)
{
if (chars[i] == ' ')
{
chars[i] = ' ';
}
else if (chars[i] >= '!' && chars[i] <= '~')
{
chars[i] = (char)(chars[i] + 0xFEE0);
}
}

return new string(chars);
}
}

class Program
{
static void Main()
{
string input = "ABC 123 カタカナ!";
string result = WidthConverter.ToFullWidth(input);

Console.WriteLine(result); // ABC 123 カタカナ!
}
}

このコードでは、最初にNormalizeで半角カタカナを全角カタカナに変換しています。その後、半角英数字、半角記号、半角スペースを全角に変換しています。

ただし、Normalizeによって一部の文字が意図せず変換される可能性もあります。入力値をどこまで変換してよいかは、システムの要件に合わせて調整してください。

たとえば、メールアドレス、URL、商品コード、パスワードなどは、勝手に全角化すると意味が変わる可能性があります。表示用の文字列と、検索・保存・認証に使う文字列では、変換ルールを分けることが重要です。

4. C#で文字列に全角・半角が含まれるか判定する方法

4-1. 全角文字を判定する基本的な考え方

C#で全角文字を判定する場合、厳密には「全角」という分類はUnicodeの仕様上、単純な1条件だけで完全に判定できるものではありません。

しかし、実務では次のような考え方で判定することが多いです。

C#
文字コードがASCII範囲外なら全角文字として扱う

ASCII文字は、英数字や基本的な記号を含む半角文字です。コード範囲でいうと、0x00から0x7Fです。

そのため、次のように書くと、ASCII以外の文字を含むかどうかを判定できます。

C#
public static bool ContainsNonAscii(string input)
{
if (string.IsNullOrEmpty(input))
{
return false;
}

foreach (char c in input)
{
if (c > 0x7F)
{
return true;
}
}

return false;
}

実行例です。

C#
Console.WriteLine(ContainsNonAscii("ABC123"));     // False
Console.WriteLine(ContainsNonAscii("ABC123")); // True
Console.WriteLine(ContainsNonAscii("カタカナ")); // True

ただし、この方法では、全角文字だけでなく日本語、絵文字、アクセント付き文字などもASCII以外として判定されます。

C#
Console.WriteLine(ContainsNonAscii("é")); // True
Console.WriteLine(ContainsNonAscii("😊")); // True

「日本語を含むか」「全角英数字を含むか」「全角カタカナを含むか」を判定したい場合は、正規表現や文字コード範囲をより細かく指定しましょう。

4-2. 半角文字を判定する基本的な考え方

半角文字を判定する場合は、ASCII範囲の文字かどうかを見る方法があります。

C#
public static bool ContainsAscii(string input)
{
if (string.IsNullOrEmpty(input))
{
return false;
}

foreach (char c in input)
{
if (c <= 0x7F)
{
return true;
}
}

return false;
}

実行例です。

C#
Console.WriteLine(ContainsAscii("ABC123"));      // True
Console.WriteLine(ContainsAscii("ABC123")); // False
Console.WriteLine(ContainsAscii("カタカナ")); // False

ただし、半角カタカナはASCIIではありません。半角カタカナはUnicode上ではU+FF61からU+FF9F付近に含まれます。

そのため、半角カタカナも半角文字として扱いたい場合は、ASCII範囲だけでなく、半角カタカナの範囲も判定対象にします。

C#
public static bool ContainsHalfWidth(string input)
{
if (string.IsNullOrEmpty(input))
{
return false;
}

foreach (char c in input)
{
bool isAscii = c >= 0x0020 && c <= 0x007E;
bool isHalfWidthKana = c >= '\uFF61' && c <= '\uFF9F';

if (isAscii || isHalfWidthKana)
{
return true;
}
}

return false;
}

実行例です。

C#
Console.WriteLine(ContainsHalfWidth("ABC123"));   // True
Console.WriteLine(ContainsHalfWidth("カタカナ")); // True
Console.WriteLine(ContainsHalfWidth("カタカナ")); // False

半角文字の判定では、「半角英数字だけを対象にするのか」「半角記号や半角カタカナも対象にするのか」を決めてから実装しましょう。

4-3. 正規表現で全角・半角を判定する

C#では、Regexを使って全角・半角を判定できます。

全角文字を広めに判定したい場合は、ASCII以外の文字を検出する方法があります。

C#
using System.Text.RegularExpressions;

public static bool ContainsZenkakuLike(string input)
{
if (string.IsNullOrEmpty(input))
{
return false;
}

return Regex.IsMatch(input, @"[^\x00-\x7F]");
}

実行例です。

C#
Console.WriteLine(ContainsZenkakuLike("ABC123"));     // False
Console.WriteLine(ContainsZenkakuLike("ABC123")); // True
Console.WriteLine(ContainsZenkakuLike("あいうえお")); // True

半角英数字を判定する場合は、次のように書けます。

C#
public static bool ContainsHalfWidthAlphanumeric(string input)
{
if (string.IsNullOrEmpty(input))
{
return false;
}

return Regex.IsMatch(input, @"[A-Za-z0-9]");
}

全角英数字を判定する場合は、Unicodeの範囲を使います。

C#
public static bool ContainsFullWidthAlphanumeric(string input)
{
if (string.IsNullOrEmpty(input))
{
return false;
}

return Regex.IsMatch(input, @"[A-Za-z0-9]");
}

半角カタカナを判定する場合は、次のように書けます。

C#
public static bool ContainsHalfWidthKana(string input)
{
if (string.IsNullOrEmpty(input))
{
return false;
}

return Regex.IsMatch(input, @"[\uFF61-\uFF9F]");
}

全角カタカナを判定する場合は、次のように書けます。

C#
public static bool ContainsFullWidthKana(string input)
{
if (string.IsNullOrEmpty(input))
{
return false;
}

return Regex.IsMatch(input, @"[\u30A0-\u30FF]");
}

正規表現は、判定対象が明確な場合に便利です。「半角英数字のみ」「全角カタカナのみ」のようなバリデーションにも向いています。

たとえば、半角英数字のみ許可する場合は次のように書けます。

C#
public static bool IsOnlyHalfWidthAlphanumeric(string input)
{
if (string.IsNullOrEmpty(input))
{
return false;
}

return Regex.IsMatch(input, @"\A[A-Za-z0-9]+\z");
}

全角カタカナのみ許可する場合は次のように書けます。

C#
public static bool IsOnlyFullWidthKana(string input)
{
if (string.IsNullOrEmpty(input))
{
return false;
}

return Regex.IsMatch(input, @"\A[\u30A0-\u30FFー]+\z");
}

4-4. 文字コード範囲で全角・半角を判定する

正規表現を使わず、文字コード範囲で判定することもできます。

全角英数字は、次の範囲に含まれます。

C#
-
-
-

C#では次のように判定できます。

C#
public static bool IsFullWidthAlphanumeric(char c)
{
return (c >= 'A' && c <= 'Z')
|| (c >= 'a' && c <= 'z')
|| (c >= '0' && c <= '9');
}

半角英数字は次のように判定できます。

C#
public static bool IsHalfWidthAlphanumeric(char c)
{
return (c >= 'A' && c <= 'Z')
|| (c >= 'a' && c <= 'z')
|| (c >= '0' && c <= '9');
}

半角カタカナは、主に\uFF61から\uFF9Fの範囲にあります。

C#
public static bool IsHalfWidthKana(char c)
{
return c >= '\uFF61' && c <= '\uFF9F';
}

全角カタカナは、主に\u30A0から\u30FFの範囲にあります。

C#
public static bool IsFullWidthKana(char c)
{
return c >= '\u30A0' && c <= '\u30FF';
}

文字列に含まれるかを判定するには、foreachで1文字ずつ確認します。

C#
public static bool ContainsFullWidthAlphanumericByCode(string input)
{
if (string.IsNullOrEmpty(input))
{
return false;
}

foreach (char c in input)
{
if (IsFullWidthAlphanumeric(c))
{
return true;
}
}

return false;
}

この方法は、正規表現よりも処理内容が明示的です。判定条件を細かく調整したい場合に向いています。

4-5. 英数字・カナ・記号ごとに判定するサンプルコード

英数字、カナ、記号ごとに全角・半角を判定するサンプルコードです。

C#
using System;

public static class WidthChecker
{
public static bool IsHalfWidthAlphanumeric(char c)
{
return (c >= 'A' && c <= 'Z')
|| (c >= 'a' && c <= 'z')
|| (c >= '0' && c <= '9');
}

public static bool IsFullWidthAlphanumeric(char c)
{
return (c >= 'A' && c <= 'Z')
|| (c >= 'a' && c <= 'z')
|| (c >= '0' && c <= '9');
}

public static bool IsHalfWidthKana(char c)
{
return c >= '\uFF61' && c <= '\uFF9F';
}

public static bool IsFullWidthKana(char c)
{
return c >= '\u30A0' && c <= '\u30FF';
}

public static bool IsHalfWidthSymbol(char c)
{
return (c >= '!' && c <= '/')
|| (c >= ':' && c <= '@')
|| (c >= '[' && c <= '`')
|| (c >= '{' && c <= '~');
}

public static bool IsFullWidthSymbol(char c)
{
return (c >= '!' && c <= '/')
|| (c >= ':' && c <= '@')
|| (c >= '[' && c <= '`')
|| (c >= '{' && c <= '~');
}

public static bool ContainsFullWidth(string input)
{
if (string.IsNullOrEmpty(input))
{
return false;
}

foreach (char c in input)
{
if (IsFullWidthAlphanumeric(c)
|| IsFullWidthKana(c)
|| IsFullWidthSymbol(c)
|| c == ' ')
{
return true;
}
}

return false;
}

public static bool ContainsHalfWidth(string input)
{
if (string.IsNullOrEmpty(input))
{
return false;
}

foreach (char c in input)
{
if (IsHalfWidthAlphanumeric(c)
|| IsHalfWidthKana(c)
|| IsHalfWidthSymbol(c)
|| c == ' ')
{
return true;
}
}

return false;
}
}

class Program
{
static void Main()
{
Console.WriteLine(WidthChecker.ContainsFullWidth("ABC123")); // False
Console.WriteLine(WidthChecker.ContainsFullWidth("ABC123")); // True
Console.WriteLine(WidthChecker.ContainsHalfWidth("カタカナ")); // True
Console.WriteLine(WidthChecker.ContainsHalfWidth("カタカナ")); // False
}
}

このように分類しておくと、「全角英数字だけ禁止」「半角カタカナだけ許可」「全角スペースを含む場合はエラー」といった細かいバリデーションを実装しやすくなります。

たとえば、全角英数字を含む場合だけエラーにしたい場合は、次のように書けます。

C#
public static bool ContainsFullWidthAlphanumeric(string input)
{
if (string.IsNullOrEmpty(input))
{
return false;
}

foreach (char c in input)
{
if (WidthChecker.IsFullWidthAlphanumeric(c))
{
return true;
}
}

return false;
}

入力チェックでは、単に「全角か半角か」ではなく、「どの種類の文字を許可するか」を明確にすることが重要です。

5. C#で全角・半角を置換する方法

5-1. Replaceで特定の全角・半角文字を置換する

C#で特定の全角・半角文字だけを置換したい場合は、Replaceを使います。

たとえば、全角スペースを半角スペースに置換する場合は次のように書けます。

C#
string input = "山田 太郎";
string result = input.Replace(" ", " ");

Console.WriteLine(result); // 山田 太郎

半角スペースを全角スペースに置換する場合は、逆にします。

C#
string input = "山田 太郎";
string result = input.Replace(" ", " ");

Console.WriteLine(result); // 山田 太郎

特定の全角記号を半角記号に置換することもできます。

C#
string input = "価格:1,000円";
string result = input
.Replace(":", ":")
.Replace(",", ",");

Console.WriteLine(result); // 価格:1,000円

逆に、半角記号を全角記号に置換することもできます。

C#
string input = "価格:1,000円";
string result = input
.Replace(":", ":")
.Replace(",", ",");

Console.WriteLine(result); // 価格:1,000円

複数の文字をまとめて置換したい場合は、辞書を使うと管理しやすくなります。

C#
using System;
using System.Collections.Generic;
using System.Text;

public static class WidthReplacer
{
public static string ReplaceByMap(string input, Dictionary<char, char> map)
{
if (string.IsNullOrEmpty(input))
{
return input;
}

StringBuilder sb = new StringBuilder(input.Length);

foreach (char c in input)
{
if (map.TryGetValue(c, out char replaced))
{
sb.Append(replaced);
}
else
{
sb.Append(c);
}
}

return sb.ToString();
}
}

class Program
{
static void Main()
{
var map = new Dictionary<char, char>
{
[' '] = ' ',
[':'] = ':',
[','] = ',',
['!'] = '!',
['?'] = '?'
};

string input = "注意:入力値が不正です!";
string result = WidthReplacer.ReplaceByMap(input, map);

Console.WriteLine(result); // 注意:入力値が不正です!
}
}

Replaceや置換表を使う方法は、変換対象を限定できる点がメリットです。

たとえば、Normalizeを使うと全角英数字や記号がまとめて変換されますが、業務上は「全角スペースだけ半角にしたい」「全角コロンだけ半角にしたい」というケースもあります。

そのような場合は、NormalizeよりもReplaceや辞書による置換のほうが安全です。

また、正規表現を使って特定の文字種だけを置換することもできます。

C#
using System.Text.RegularExpressions;

string input = "ABC 123 カタカナ";
string result = Regex.Replace(input, @"[A-Za-z0-9]", m =>
{
char c = m.Value[0];
return ((char)(c - 0xFEE0)).ToString();
});

Console.WriteLine(result); // ABC 123 カタカナ

このコードでは、全角英数字だけを半角英数字に置換しています。カタカナやスペースには影響しません。

半角英数字だけを全角英数字に置換する場合は、次のように書けます。

C#
using System.Text.RegularExpressions;

string input = "ABC 123 カタカナ";
string result = Regex.Replace(input, @"[A-Za-z0-9]", m =>
{
char c = m.Value[0];
return ((char)(c + 0xFEE0)).ToString();
});

Console.WriteLine(result); // ABC 123 カタカナ

置換処理では、全体を一括変換するのか、一部の文字だけを変換するのかを先に決めることが重要です。

まとめ

C#で全角・半角を扱う場合は、変換対象によって使う方法を選ぶことが大切です。

全角英数字や一部の全角記号を半角に変換するなら、Normalize(NormalizationForm.FormKC)が簡単です。全角スペースだけを半角スペースにしたい場合は、Replace(" ", " ")がわかりやすく安全です。

半角カタカナを全角カタカナに変換する場合も、Normalize(NormalizationForm.FormKC)が使えます。一方、全角カタカナを半角カタカナに変換したい場合は、Microsoft.VisualBasic.Strings.StrConvVbStrConv.Narrowを使う方法があります。

半角英数字を全角に変換する場合は、0xFEE0を加算する方法がよく使われます。半角スペースは別扱いになるため、' '' 'に置換する処理を加えましょう。

全角・半角の判定では、正規表現を使う方法と、文字コード範囲で判定する方法があります。簡単に判定したい場合は正規表現、細かく制御したい場合は文字コード範囲による判定が向いています。

C#で全角・半角を処理するときは、「英数字」「記号」「カタカナ」「スペース」を分けて考えるのがポイントです。検索用、保存用、表示用、バリデーション用で必要な変換ルールは異なるため、用途に合わせて適切な方法を選びましょう。