C#で文字列を半角文字に変換する基本
C#で文字列を半角文字に変換したい場面は、業務システムでは非常によくあります。たとえば、ユーザー入力の表記ゆれを減らしたいとき、検索しやすくしたいとき、CSVや固定長データを扱うとき、あるいは外部システム連携で入力形式をそろえたいときなどです。特に日本語を扱うシステムでは、全角と半角が混在しやすいため、文字列の正規化は実務上とても重要です。
ただし、ここで最初に強く押さえておきたいのは、「半角に変換する」といっても、何をどこまで半角にするのかを明確にしないと危険だということです。英数字だけを半角にしたいのか、カタカナも半角にしたいのか、記号も対象にしたいのかで、適切な方法が変わります。初心者の方は、まず「半角変換は単なる見た目の変換ではなく、データの意味や扱いやすさに関わる処理」であると理解すると、実務でも迷いにくくなります。
C#では、この用途でよく使われる方法のひとつに、Microsoft.VisualBasic.Strings.StrConv() を使うやり方があります。C#なのにVisual Basicの機能を使うのか、と驚く方もいるかもしれませんが、日本語の全角・半角変換では昔からよく使われてきた実用的な方法です。まずはこの基本から順に理解していきましょう。
最初に理解したい「全角」と「半角」の違い
半角変換を正しく使うには、まず全角と半角の違いを知る必要があります。日本語環境では、同じように見える文字でも内部的には別の文字として扱われることがあります。
たとえば、次のような違いがあります。
- 全角英数字:
ABC123 - 半角英数字:
ABC123
見た目は似ていますが、プログラム上では別の文字列です。そのため、比較や検索をすると一致しないことがあります。
たとえば、次の2つは人間には同じように見えても、プログラムでは別物として扱われることがあります。
TOKYOTOKYO
この違いがあるため、業務システムでは入力値を一定のルールでそろえる「正規化」が重要になります。半角変換はその代表例です。
C#で半角変換するときによく使う方法
C#で日本語文字列を半角へ変換するとき、代表的なのは Microsoft.VisualBasic.Strings.StrConv() を使う方法です。変換オプションとして VbStrConv.Narrow を指定すると、全角文字を半角文字へ変換できます。
まずは最小の例を見てみましょう。
using System;
using Microsoft.VisualBasic; // StrConvを使うために必要
class Program
{
static void Main()
{
string text = "ABC123";
// 全角英数字を半角に変換する
string narrowText = Strings.StrConv(text, VbStrConv.Narrow);
Console.WriteLine("変換前: " + text);
Console.WriteLine("変換後: " + narrowText);
}
}
C#このコードでは、ABC123 が ABC123 に変換されます。初心者の方にとって重要なのは、これも文字列変換なので、元の文字列そのものが書き換わるわけではなく、変換後の新しい文字列を受け取っているという点です。
実行結果のイメージは次のようになります。
変換前: ABC123
変換後: ABC123
C#StrConv() の基本的な考え方
StrConv() は文字列を別の形に変換するメソッドです。半角変換では VbStrConv.Narrow を指定します。
書き方は次の形です。
string result = Strings.StrConv(変換したい文字列, VbStrConv.Narrow);
C#この形を見て分かるように、変換対象の文字列と、どんな変換をしたいかを渡します。今回は「半角化」が目的なので Narrow を指定しています。
ここで初心者の方が覚えるべき大事な点は、ToLower() などの他の文字列操作と同じく、戻り値を受け取らないと変換結果を使えないということです。次のようなコードは意図通りになりません。
using System;
using Microsoft.VisualBasic;
class Program
{
static void Main()
{
string text = "ABC123";
// 変換結果を受け取っていない
Strings.StrConv(text, VbStrConv.Narrow);
// 元の文字列は変わっていない
Console.WriteLine(text);
}
}
C#この場合、表示されるのは元の ABC123 のままです。変換結果は必ず変数に代入しましょう。
まずは簡単な例題で慣れましょう
ここでは、実務に近い形を意識しながら、初心者向けに段階的に見ていきます。
例題1: 会員コードの英数字を半角にそろえる
業務システムでは、会員コードや社員番号などに全角英数字が混ざって入力されることがあります。そのままだと照合に失敗する可能性があるため、半角にそろえることがあります。
using System;
using Microsoft.VisualBasic;
class Program
{
static void Main()
{
string memberCode = "AB1234";
// 会員コードを半角に変換する
string normalizedCode = Strings.StrConv(memberCode, VbStrConv.Narrow);
Console.WriteLine("元の会員コード: " + memberCode);
Console.WriteLine("半角変換後: " + normalizedCode);
}
}
C#このようにしておくと、入力の揺れによる照合ミスを減らしやすくなります。
例題2: 検索キーワードを半角にそろえる
検索機能では、利用者が全角英数字で入力することがあります。データ側が半角で保存されている場合、検索前に半角へそろえることで一致しやすくなります。
using System;
using Microsoft.VisualBasic;
class Program
{
static void Main()
{
string keyword = "PC123";
// 検索前に半角へそろえる
string normalizedKeyword = Strings.StrConv(keyword, VbStrConv.Narrow);
Console.WriteLine("入力キーワード: " + keyword);
Console.WriteLine("検索用キーワード: " + normalizedKeyword);
}
}
C#実務では、このあとに前後空白の削除や大文字小文字の統一も組み合わせることがあります。
null の扱いには特に注意が必要です
実務では、画面入力、CSV、データベース、APIレスポンスなど、さまざまな場面で null が登場します。半角変換でも null の扱いを軽視してはいけません。
たとえば、次のようなコードは危険です。
using System;
using Microsoft.VisualBasic;
class Program
{
static void Main()
{
string text = null;
// textがnullの可能性を考えずに変換している
string result = Strings.StrConv(text, VbStrConv.Narrow);
Console.WriteLine(result);
}
}
C#環境や実装状況によっては例外や意図しない結果につながる可能性があります。そのため、実務では「変換前に値の有無を確認する」という習慣がとても大切です。
安全な書き方1: if で確認する
using System;
using Microsoft.VisualBasic;
class Program
{
static void Main()
{
string text = null;
// nullでなければ変換する
if (text != null)
{
string result = Strings.StrConv(text, VbStrConv.Narrow);
Console.WriteLine(result);
}
else
{
Console.WriteLine("文字列が設定されていません。");
}
}
}C#この書き方は初心者にも分かりやすく、安全に扱いやすいです。
安全な書き方2: ユーティリティメソッドに隠す
実務では毎回 if を書くより、安全な共通メソッドにまとめたほうが保守しやすくなります。
using System;
using Microsoft.VisualBasic;
public static class StringUtility
{
// nullを安全に扱いながら半角変換する
public static string ToSafeNarrow(string text)
{
// nullならそのまま返す
if (text == null)
{
return null;
}
// 半角に変換して返す
return Strings.StrConv(text, VbStrConv.Narrow);
}
}
class Program
{
static void Main()
{
string text = "ABC123";
string result = StringUtility.ToSafeNarrow(text);
Console.WriteLine(result);
}
}
C#このように共通化しておくと、チーム開発でも使い回ししやすくなります。
実務では「何を半角にするか」を必ず意識します
ここは特に深掘りして理解しておきたい重要ポイントです。半角変換は便利ですが、何でも一律に半角へ変換すればよいわけではありません。
たとえば、次のようなケースでは判断が必要です。
- 英数字だけ半角にしたい
- カタカナも半角にしたい
- 記号も半角にしたい
- 住所や氏名のように、見た目や意味を保ちたい
- 外部システム仕様で文字種が厳密に決まっている
たとえば氏名を無条件に半角化してしまうと、ユーザーが意図した表記を壊す可能性があります。また、半角カナはシステムによっては扱いづらいこともあります。つまり、「入力値をきれいに見せたい」のか、「検索や照合のために機械的にそろえたい」のか、「外部連携の制約に合わせたい」のかで方針が変わります。
このため、実務では次のように考えるのが大切です。
- 表示用データはむやみに変換しない
- 比較や検索用データは正規化して使う
- 保存時に変換するか、比較時だけ変換するかを設計で決める
この考え方があいまいだと、後で「画面の表示が崩れた」「検索結果が合わない」「外部連携でエラーになる」といった問題につながります。
前後の空白除去と組み合わせるのが実務的です
半角変換は単独で使うより、他の正規化処理と組み合わせることが多いです。特に前後の空白除去はよく一緒に使われます。
using System;
using Microsoft.VisualBasic;
class Program
{
static void Main()
{
string input = " ABC123 ";
// 前後の空白を削除してから半角に変換する
string normalized = Strings.StrConv(input.Trim(), VbStrConv.Narrow);
Console.WriteLine("正規化後: " + normalized);
}
}
C#この例では、入力の前後に余分な空白があっても、まず Trim() で取り除き、そのあとで半角化しています。検索や照合では非常によくある流れです。
比較のための正規化として使う例
半角変換は、比較の前処理としても役立ちます。たとえば、商品コードや会員IDなどを比較する前に、全角英数字を半角へそろえておくことで、入力ゆれによる不一致を減らせます。
using System;
using Microsoft.VisualBasic;
class Program
{
static void Main()
{
string systemCode = "ABC123";
string inputCode = "ABC123";
// 入力値を半角へ正規化する
string normalizedInputCode = Strings.StrConv(inputCode, VbStrConv.Narrow);
// 正規化後に比較する
bool isSame = string.Equals(systemCode, normalizedInputCode, StringComparison.Ordinal);
Console.WriteLine("一致結果: " + isSame);
}
}
C#ここで大事なのは、「比較前に変換している」という点です。つまり、文字列そのものの見た目を変えたいのではなく、比較を安定させるために正規化しています。この「表示のための変換」と「比較のための正規化」を区別して考えることは、実務でとても重要です。
業務で使いやすいユーティリティメソッドにまとめる
半角変換を実務で繰り返し使うなら、ユーティリティメソッドとしてまとめるのがおすすめです。ここでは段階的に実用的な形へ進めます。
シンプルな半角変換ユーティリティ
using System;
using Microsoft.VisualBasic;
public static class StringUtility
{
// 文字列を半角へ変換する
public static string ToNarrow(string text)
{
// nullならnullを返す
if (text == null)
{
return null;
}
// 半角へ変換する
return Strings.StrConv(text, VbStrConv.Narrow);
}
}C#この形は最も基本的な共通化です。
実務向けの正規化ユーティリティ
using System;
using Microsoft.VisualBasic;
public static class StringUtility
{
// 検索や照合に使いやすい形へ正規化する
public static string NormalizeForSearch(string text)
{
// nullまたは空白だけならそのまま返す
if (string.IsNullOrWhiteSpace(text))
{
return text;
}
// 前後空白を除去して半角化する
return Strings.StrConv(text.Trim(), VbStrConv.Narrow);
}
}C#このようにしておくと、検索処理や照合処理で毎回同じロジックを書かずに済みます。
英数字中心の入力整形テンプレート
using System;
using Microsoft.VisualBasic;
public static class StringUtility
{
// 会員コードや商品コードの入力を整形する
public static string NormalizeCode(string code)
{
// nullまたは空白ならそのまま返す
if (string.IsNullOrWhiteSpace(code))
{
return code;
}
// 前後空白を削除して半角へ変換する
string normalized = Strings.StrConv(code.Trim(), VbStrConv.Narrow);
// 必要に応じて大文字へ統一する
normalized = normalized.ToUpperInvariant();
return normalized;
}
}C#この形は、コード値の比較や検索でとても使いやすいです。半角化したあとに大文字へ統一することで、abc123 と ABC123 と Abc123 を同じ形にそろえやすくなります。
パフォーマンスの考え方も少し知っておきましょう
初心者のうちは、まず安全で分かりやすいコードを書くことが優先です。ただし、実務では大量データを処理する場面もあります。そのとき、毎回何度も同じ正規化を行うと、無駄な処理が増えることがあります。
たとえば、ループのたびに何度も半角変換をしていると、そのぶん新しい文字列がたくさん生成されます。少量データでは気にしすぎる必要はありませんが、バッチ処理や大量CSV処理では注意が必要です。
悪い例
using System;
using Microsoft.VisualBasic;
class Program
{
static void Main()
{
string inputCode = "ABC123";
// 比較のたびに毎回半角変換している
if (Strings.StrConv(inputCode, VbStrConv.Narrow) == "ABC123")
{
Console.WriteLine("一致しました。");
}
}
}C#改善例
using System;
using Microsoft.VisualBasic;
class Program
{
static void Main()
{
string inputCode = "ABC123";
// 一度だけ正規化して使い回す
string normalizedCode = Strings.StrConv(inputCode, VbStrConv.Narrow);
if (normalizedCode == "ABC123")
{
Console.WriteLine("一致しました。");
}
}
}C#このように、一度変換した結果を使い回すほうが分かりやすく、無駄も減らせます。
セキュリティと品質の観点でも正規化は重要です
業務システムでは、文字列の正規化は単なる見た目の問題ではありません。入力ゆれを放置すると、検索漏れ、重複登録、照合ミス、外部連携エラーなどの原因になります。場合によっては、本人確認やアカウント管理の品質にも影響します。
ただし、ここでも注意が必要です。正規化は便利ですが、元データの意味や証跡を壊してはいけません。たとえば、ユーザーが入力した元の値をそのまま保持すべき場面もあります。実務ではよく、次のように考えます。
- 表示用には元の入力値を保持する
- 検索用・比較用には正規化済みの値を使う
- 外部連携用には相手仕様に合わせた形式を別途作る
この設計を意識しておくと、あとから仕様変更があっても対応しやすくなります。
よくある失敗と注意点
半角変換すれば何でも解決すると考える
これは危険です。半角変換は便利ですが、対象文字や用途を考えずに一律適用すると、意図しないデータ変化を招くことがあります。まず「何のために変換するのか」を明確にしましょう。
null や空文字を軽視する
実務では null や空文字は非常によく出ます。入力チェックと変換処理はセットで考えることが大切です。
表示用データまで無条件に変換する
検索や比較には有効でも、表示用データに機械的な変換をかけると、ユーザーが意図した表記を損なうことがあります。表示用と内部処理用を分けて考えましょう。
半角カナの扱いを軽く考える
半角カナはシステムによっては扱いが難しいことがあります。外部連携や帳票出力などで要件が明確な場合を除き、どこまで変換するのかは仕様確認が大切です。
業務で使える実践テンプレート
最後に、業務でそのまま応用しやすいテンプレートを紹介します。商品コードや会員コードなど、入力ゆれを抑えたいケースを想定した例です。
using System;
using Microsoft.VisualBasic;
public static class StringUtility
{
// 業務用コード入力を正規化する
public static string NormalizeBusinessCode(string code)
{
// nullまたは空白だけならそのまま返す
if (string.IsNullOrWhiteSpace(code))
{
return code;
}
// 1. 前後の空白を削除する
string normalized = code.Trim();
// 2. 全角文字を半角へ変換する
normalized = Strings.StrConv(normalized, VbStrConv.Narrow);
// 3. 英字を大文字へ統一する
normalized = normalized.ToUpperInvariant();
// 正規化後の値を返す
return normalized;
}
}
class Program
{
static void Main()
{
string inputCode = " abc123 ";
// 入力値を業務用に整形する
string normalizedCode = StringUtility.NormalizeBusinessCode(inputCode);
Console.WriteLine("入力値: " + inputCode);
Console.WriteLine("正規化後: " + normalizedCode);
}
}
C#このテンプレートの良い点は、処理の流れがはっきりしていることです。まず空白を除去し、次に半角へ変換し、最後に大文字へ統一しています。こうすることで、入力ゆれをかなり抑えやすくなります。
まとめ
C#で文字列を半角文字に変換する処理は、日本語を扱う業務システムではとても重要です。基本としては Microsoft.VisualBasic.Strings.StrConv() と VbStrConv.Narrow を使う方法を覚えると、全角英数字や一部記号の正規化に対応しやすくなります。
ただし、実務で本当に大切なのは、単に変換方法を知ることではありません。次の点を意識することが重要です。
- 半角変換の対象を明確にする
nullや空文字を安全に扱う- 前後空白除去などの正規化と組み合わせる
- 表示用データと比較用データを分けて考える
- よく使う処理はユーティリティ化する
特に初心者の方は、「変換すること」そのものよりも、「なぜ変換するのか」「どの場面で変換すべきか」を意識すると、実務で通用する設計力が身につきやすくなります。半角変換は小さな処理に見えて、検索、照合、入力補正、外部連携など幅広い場面に関わる重要な基礎です。
