文字列のケース(大文字・小文字)変換
C#で文字列を扱う際、データの一貫性を保つために、大文字と小文字を統一したい場面がよくあります。例えば、ユーザー入力された "Yes"、"yes"、"YES" をすべて同じ "yes" として扱ったり、辞書のキーやデータベースの検索文字列を正規化(Normalize)したりする場合です。
stringクラスは、この変換を簡単に行うために ToUpper() メソッド(大文字へ)と ToLower() メソッド(小文字へ)を提供しています。
ToUpper() と ToLower() の基本的な使い方
ToUpper(): 文字列に含まれるすべてのアルファベットを大文字に変換した、新しい文字列を返します。ToLower(): 文字列に含まれるすべてのアルファベットを小文字に変換した、新しい文字列を返します。
コード例:基本的な変換
using System;
public class CaseConversionExample
{
public static void Main()
{
string originalText = "User: 'Admin' logged in.";
// 大文字に変換
string upperCaseText = originalText.ToUpper();
// 小文字に変換
string lowerCaseText = originalText.ToLower();
Console.WriteLine($"元の文字列: {originalText}");
Console.WriteLine($"ToUpper()後: {upperCaseText}");
Console.WriteLine($"ToLower()後: {lowerCaseText}");
}
}
出力結果:
元の文字列: User: 'Admin' logged in.
ToUpper()後: USER: 'ADMIN' LOGGED IN.
ToLower()後: user: 'admin' logged in.
重要な注意点(1):文字列の不変性(Immutable)
ToUpperやToLowerメソッド(および他のC#の文字列操作メソッド)は、元の文字列を直接変更しません。C#のstring型は不変(Immutable)であるためです。
これらのメソッドは、変換が完了した「新しい文字列」を戻り値として返します。したがって、変換結果を利用するには、必ず新しい変数に代入するか、元の変数に再代入する必要があります。
string status = "Active";
// 失敗する例 (結果を捨てている)
status.ToLower();
// Console.WriteLine(status); // "Active" のまま変わらない
// 正しい例 (結果を変数に代入する)
string lowerStatus = status.ToLower();
// Console.WriteLine(lowerStatus); // "active" が出力される
重要な注意点(2):「カルチャ(地域設定)」への依存
ToUpper()とToLower()には、一見すると分かりにくい、重要な動作特性があります。それは、これらのメソッドが**実行環境の「現在のカルチャ(CultureInfo.CurrentCulture)」**に基づいて変換ルールを決定する、という点です。
ほとんどの言語(例: 英語)では問題になりませんが、例えばトルコ語には「ドットのない i(ı)」と「ドットのある i(i)」が存在します。
- トルコ語(
tr-TR)カルチャでは:i(小文字) をToUpper()するとİ(大文字、ドット付き) になります。I(大文字) をToLower()するとı(小文字、ドットなし) になります。
この動作は、ファイル名、APIのキー、JSONのプロパティ名など、プログラムが内部的に使用する「不変であるべき文字列」を比較する際に、意図しないバグを引き起こす可能性があります。
解決策:ToUpperInvariant() と ToLowerInvariant()
プログラム内部での比較や正規化、キーとしての使用など、カルチャ(地域設定)に依存しない、一貫性のある大文字・小文字変換が必要な場合は、ToUpper() / ToLower() の代わりに、以下のメソッドを使用するべきです。
ToUpperInvariant(): **インバリアント・カルチャ(InvariantCulture)**という、どの地域設定にも属さない固定のルール(基本的に英語のルール)に基づいて大文字に変換します。ToLowerInvariant(): インバリアント・カルチャに基づいて小文字に変換します。
コード例:ToLower と ToLowerInvariant の使い分け
using System;
using System.Globalization;
using System.Threading;
public class InvariantExample
{
public static void Main()
{
string key = "API_KEY_ID";
// ユーザーに表示するための文字列(例: UIのラベル)
// これはカルチャに依存しても良い(例: ドイツ語の 'ß' が 'SS' になるなど)
string displayKey = key.ToLower();
Console.WriteLine($"表示用 (ToLower): {displayKey}");
// 内部処理・比較用の文字列(例: 辞書のキー)
// 実行環境に関わらず、常に "api_key_id" になってほしい
string internalKey = key.ToLowerInvariant();
Console.WriteLine($"内部用 (ToLowerInvariant): {internalKey}");
}
}
出力結果(どのカルチャで実行しても同じ):
表示用 (ToLower): api_key_id
内部用 (ToLowerInvariant): api_key_id
まとめ
ToUpperとToLowerは、文字列のケース(大文字・小文字)を変換する簡単な方法を提供します。
ToUpper()/ToLower(): 現在のカルチャ(地域設定)に基づいて変換します。主にユーザーへの表示用テキストに使用します。ToUpperInvariant()/ToLowerInvariant(): カルチャに依存しない固定ルールで変換します。内部的な処理、データの正規化、キーの比較などには、こちらを使用することが強く推奨されます。- 不変性: これらのメソッドは元の文字列を変更しません。必ず戻り値を代入して使用する必要があります。
