【C#】文字列を大文字・小文字に変換:ToUpperとToLowerの使い方とカルチャ依存(InvariantCulture)の注意点

目次

文字列のケース(大文字・小文字)変換

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)

ToUpperToLowerメソッド(および他の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ı)」と「ドットのある ii)」が存在します。

  • トルコ語(tr-TR)カルチャでは:
    • i (小文字) を ToUpper() すると İ (大文字、ドット付き) になります。
    • I (大文字) を ToLower() すると ı (小文字、ドットなし) になります。

この動作は、ファイル名、APIのキー、JSONのプロパティ名など、プログラムが内部的に使用する「不変であるべき文字列」を比較する際に、意図しないバグを引き起こす可能性があります。


解決策:ToUpperInvariant()ToLowerInvariant()

プログラム内部での比較や正規化、キーとしての使用など、カルチャ(地域設定)に依存しない、一貫性のある大文字・小文字変換が必要な場合は、ToUpper() / ToLower() の代わりに、以下のメソッドを使用するべきです。

  • ToUpperInvariant(): **インバリアント・カルチャ(InvariantCulture)**という、どの地域設定にも属さない固定のルール(基本的に英語のルール)に基づいて大文字に変換します。
  • ToLowerInvariant(): インバリアント・カルチャに基づいて小文字に変換します。

コード例:ToLowerToLowerInvariant の使い分け

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

まとめ

ToUpperToLowerは、文字列のケース(大文字・小文字)を変換する簡単な方法を提供します。

  • ToUpper() / ToLower(): 現在のカルチャ(地域設定)に基づいて変換します。主にユーザーへの表示用テキストに使用します。
  • ToUpperInvariant() / ToLowerInvariant(): カルチャに依存しない固定ルールで変換します。内部的な処理、データの正規化、キーの比較などには、こちらを使用することが強く推奨されます。
  • 不変性: これらのメソッドは元の文字列を変更しません。必ず戻り値を代入して使用する必要があります。
よかったらシェアしてね!
  • URLをコピーしました!
  • URLをコピーしました!

この記事を書いた人

私が勉強したこと、実践したこと、してることを書いているブログです。
主に資産運用について書いていたのですが、
最近はプログラミングに興味があるので、今はそればっかりです。

目次