C# Tips | 文字列操作:大文字に変換する

Web APP C#
スポンサーリンク
スポンサーリンク
  1. C#で文字列を大文字に変換する方法|ToUpper・ToUpperInvariantの使い方と実務での注意点
  2. C#で文字列を大文字に変換する基本
    1. ToUpperメソッドを使う
    2. 文字列の一部だけでなく、英字全体を変換する
  3. ToUpperを使用するときに理解しておきたいこと
    1. 元の文字列そのものが書き換わるわけではない
    2. すでに大文字の文字列を変換しても問題ない
  4. ToUpperとToUpperInvariantの違い
    1. ToUpperは実行環境のカルチャの影響を受ける
    2. ToUpperInvariantを使って環境に依存しない変換を行う
    3. 識別子や検索キーでは、変換だけでなく比較方法も考える
  5. nullや空文字を安全に大文字へ変換する
    1. nullに対してToUpperを呼び出すと例外が発生する
    2. nullの場合は空文字として処理する
    3. nullの場合と空文字の場合を区別して処理する
    4. 空文字や空白もまとめて判定する
  6. 実務で再利用できる大文字変換メソッドを作る
    1. 変換処理をメソッドにまとめる
    2. nullを空文字に置き換えたくない場合のテンプレート
  7. 文字列を大文字に変換するときの注意点
    1. すべての文字が1文字ずつ対応するとは限らない
    2. 大文字に変換するだけでは入力値の検証にならない
    3. SQLインジェクションやクロスサイトスクリプティングの対策にはならない
  8. よく使うコードテンプレート
    1. 基本的な大文字変換
    2. カルチャに依存しない大文字変換
    3. nullの場合は空文字として処理する
    4. 前後の空白を取り除いてから変換する
    5. 大文字・小文字を区別せずに比較する
  9. まとめ

C#で文字列を大文字に変換する方法|ToUpper・ToUpperInvariantの使い方と実務での注意点

C#で文字列を操作する場面では、英字を大文字に変換したいことがあります。例えば、入力された文字列を統一して検索しやすくしたり、ユーザーが入力したコードや識別子を一定の形式にそろえたりするときです。

C#では、文字列を大文字に変換するために、主に ToUpper() と ToUpperInvariant() というメソッドを使用します。どちらも文字列を大文字に変換できますが、実務ではそれぞれの違いを理解して使い分けることが大切です。

この記事では、プログラミング初心者の方にも分かりやすいように、基本的な使い方から、実務で再利用できるメソッドの作成方法、例外への対処、セキュリティー面での注意点まで順番に解説します。

C#で文字列を大文字に変換する基本

ToUpperメソッドを使う

C#で文字列を大文字に変換する最も基本的な方法は、ToUpper() メソッドを使用することです。

例えば、"hello" という文字列を "HELLO" に変換したい場合は、次のように記述します。

using System;

class Program
{
    static void Main()
    {
        // 小文字を含む文字列を用意します
        string text = "hello";

        // 文字列を大文字に変換します
        string upperText = text.ToUpper();

        // 変換結果を表示します
        Console.WriteLine(upperText); // HELLO
    }
}
C#

実行すると、次の結果が表示されます。

HELLO

コードの流れを順番に確認しましょう。

  1. string text = "hello"; で、変換対象の文字列を用意します。
  2. text.ToUpper() で、文字列を大文字に変換します。
  3. 変換した結果を upperText という変数に格納します。
  4. Console.WriteLine() で、変換結果を画面に表示します。

このように、ToUpper() を使用すると、文字列に含まれる英字を大文字に変換できます。

文字列の一部だけでなく、英字全体を変換する

ToUpper() は、文字列に含まれる英字をまとめて大文字に変換します。小文字と大文字が混在していても問題ありません。

using System;

class Program
{
    static void Main()
    {
        // 小文字、大文字、数字を含む文字列
        string text = "Hello World 123";

        // 英字を大文字に変換します
        string result = text.ToUpper();

        // 変換結果を表示します
        Console.WriteLine(result); // HELLO WORLD 123
    }
}
C#

実行結果は次のとおりです。

HELLO WORLD 123

変換後は、Hello が HELLO に、World が WORLD になります。一方、空白や数字など、大文字・小文字の区別がない文字は基本的にそのままです。

日本語のひらがな、カタカナ、漢字にも、英字のような大文字・小文字の区別はありません。そのため、日本語を含む文字列に対して使用しても、日本語部分は通常そのまま残ります。

using System;

class Program
{
    static void Main()
    {
        // 英字と日本語を含む文字列
        string text = "Hello 世界";

        // 大文字に変換します
        string result = text.ToUpper();

        // 結果を表示します
        Console.WriteLine(result); // HELLO 世界
    }
}
C#

ToUpper() は、文字列全体を新しい形式に変換するためのメソッドですが、すべての文字が別の文字に変わるわけではありません。大文字・小文字の区別がある文字が主な変換対象になります。

ToUpperを使用するときに理解しておきたいこと

元の文字列そのものが書き換わるわけではない

C#の string 型は、文字列を変更できない「不変(immutable)」の型です。

そのため、ToUpper() を実行しても、元の文字列自体が直接書き換えられるわけではありません。大文字に変換された結果が返されます。

次のコードで確認してみましょう。

using System;

class Program
{
    static void Main()
    {
        // 元の文字列を用意します
        string text = "hello";

        // 大文字に変換した結果を別の変数に格納します
        string upperText = text.ToUpper();

        // 元の文字列を表示します
        Console.WriteLine(text); // hello

        // 変換後の文字列を表示します
        Console.WriteLine(upperText); // HELLO
    }
}
C#

実行結果は次のとおりです。

hello
HELLO

元の text は "hello" のままです。変換結果を upperText に格納しているため、2つの変数で異なる文字列を扱えます。

変換後の結果を元の変数で使いたい場合は、次のように代入します。

using System;

class Program
{
    static void Main()
    {
        // 小文字の文字列を用意します
        string text = "hello";

        // 変換結果を同じ変数に再代入します
        text = text.ToUpper();

        // 再代入後の文字列を表示します
        Console.WriteLine(text); // HELLO
    }
}
C#

ここで重要なのは、text.ToUpper() を呼び出しただけでは、変数 text の値が自動的に置き換わるわけではないという点です。

変換後の結果を利用するには、戻り値を変数に代入するか、別の処理に渡す必要があります。

すでに大文字の文字列を変換しても問題ない

文字列がすでに大文字であっても、ToUpper() を実行できます。

using System;

class Program
{
    static void Main()
    {
        // すでに大文字の文字列
        string text = "HELLO";

        // 大文字に変換します
        string result = text.ToUpper();

        // 結果を表示します
        Console.WriteLine(result); // HELLO
    }
}
C#

この場合、表示結果は "HELLO" です。

小文字が含まれていなければ、見た目上の変化はありません。そのため、入力された文字列がすでに大文字かどうかを事前に判定しなくても、通常はそのまま ToUpper() を呼び出せます。

ただし、文字列が null の場合は別です。null に対してインスタンスメソッドを呼び出すと例外が発生するため、後述する null 対策が必要になります。

ToUpperとToUpperInvariantの違い

ToUpperは実行環境のカルチャの影響を受ける

ToUpper() は、実行環境の現在のカルチャ(言語や地域に関する設定)に基づいて、大文字への変換を行います。

多くの英語の文字列では、ToUpper() を使っても期待どおりの結果になります。しかし、言語によっては、大文字・小文字の変換規則が異なります。

代表的な例が、トルコ語の i です。トルコ語には、英語とは異なる大文字・小文字の対応関係があります。

そのため、実行環境のカルチャによっては、同じ文字列でも大文字への変換結果が異なることがあります。

一般的なユーザー向けの表示であれば、現在のカルチャに従って変換することが適切な場合もあります。一方、プログラム内部で使用する識別子や固定形式のコードなどでは、実行環境によって結果が変わらないようにしたい場合があります。

このような用途では、ToUpperInvariant() を検討します。

ToUpperInvariantを使って環境に依存しない変換を行う

ToUpperInvariant() は、カルチャに依存しない規則で大文字に変換するメソッドです。

例えば、英字で構成された識別子や、プログラム内部で扱う固定形式の値などを変換する場合に役立ちます。

using System;

class Program
{
    static void Main()
    {
        // 変換対象の文字列を用意します
        string text = "hello world";

        // カルチャに依存しない規則で大文字に変換します
        string result = text.ToUpperInvariant();

        // 変換結果を表示します
        Console.WriteLine(result); // HELLO WORLD
    }
}
C#

実行結果は次のとおりです。

HELLO WORLD

一般的な英語の文字列では、ToUpper() と ToUpperInvariant() の結果は同じになることが多いため、違いが分かりにくいかもしれません。

ただし、両者は目的が異なります。実務では、次のように使い分けるとよいでしょう。

  • ToUpper():現在のカルチャに従った変換が必要な場合に使用します。
  • ToUpperInvariant():カルチャに依存しない変換が必要な場合に使用します。

なお、ToUpperInvariant() は、すべての言語で人間にとって同じ意味や読み方になるように変換するものではありません。あくまでも、カルチャに依存しない規則を使うためのメソッドです。

識別子や検索キーでは、変換だけでなく比較方法も考える

実務で文字列を扱う場合は、単純に大文字へ変換するだけでなく、その文字列をどのように比較するのかも重要です。

例えば、ユーザー名や商品コードを大文字・小文字の違いを無視して比較したい場合、双方を大文字に変換してから比較する方法があります。

using System;

class Program
{
    static void Main()
    {
        // 比較する文字列を用意します
        string code1 = "item-001";
        string code2 = "ITEM-001";

        // 両方を大文字に変換して比較します
        bool isEqual =
            code1.ToUpperInvariant() == code2.ToUpperInvariant();

        // 比較結果を表示します
        Console.WriteLine(isEqual); // True
    }
}
C#

このコードでは、両方の文字列を大文字にしてから比較するため、英字の大文字・小文字の違いを無視できます。

ただし、比較だけが目的なら、毎回文字列を変換する必要はありません。StringComparison.OrdinalIgnoreCase を使用する方法もあります。

using System;

class Program
{
    static void Main()
    {
        // 比較する文字列を用意します
        string code1 = "item-001";
        string code2 = "ITEM-001";

        // 大文字・小文字を区別せずに比較します
        bool isEqual = string.Equals(
            code1,
            code2,
            StringComparison.OrdinalIgnoreCase
        );

        // 比較結果を表示します
        Console.WriteLine(isEqual); // True
    }
}
C#

StringComparison.OrdinalIgnoreCase は、文字列を大文字に変換するための指定ではなく、大文字・小文字を区別せずに比較するための指定です。

比較が目的なら比較用のAPIを使用し、実際に大文字の文字列が必要な場合に変換するという考え方を持つと、余計な文字列の生成を避けやすくなります。

nullや空文字を安全に大文字へ変換する

nullに対してToUpperを呼び出すと例外が発生する

業務アプリケーションでは、文字列の値が常に存在するとは限りません。データベースから取得した値や、ユーザーが入力した値などが null になることがあります。

次のコードは、null に対して ToUpper() を呼び出しているため、安全ではありません。

using System;

class Program
{
    static void Main()
    {
        // nullを設定します
        string? text = null;

        // nullに対してToUpperを呼び出すと例外が発生します
        string result = text.ToUpper();

        Console.WriteLine(result);
    }
}
C#

このコードでは、text が null のため、NullReferenceException が発生します。実際のアプリケーションでは、処理が中断されたり、エラー画面が表示されたりする原因になります。

このような問題を防ぐには、変換前に null を確認する方法や、null 合体演算子 ?? を利用する方法があります。

nullの場合は空文字として処理する

null の場合に空文字 string.Empty として扱ってよいのであれば、?? を使うと簡潔に書けます。

using System;

class Program
{
    static void Main()
    {
        // nullが入る可能性のある文字列
        string? text = null;

        // nullの場合は空文字に置き換えてから大文字に変換します
        string result = (text ?? string.Empty).ToUpperInvariant();

        // 結果を表示します
        Console.WriteLine($"結果:[{result}]"); // 結果:[]
    }
}
C#

text ?? string.Empty は、text が null であれば string.Empty を使用し、null でなければ text の値を使用するという意味です。

この方法なら、変換対象が null でも例外が発生しません。

ただし、nullを空文字に置き換えることが業務上正しいかどうかは、別途判断する必要があります。

例えば、任意入力の備考欄なら空文字として扱っても問題ないかもしれません。しかし、必須の顧客コードが null だった場合に空文字として処理すると、データの欠落に気づきにくくなる可能性があります。

エラーとして扱うべき値なのか、空文字として扱ってよい値なのかを、用途に応じて決めることが大切です。

nullの場合と空文字の場合を区別して処理する

nullと空文字を同じものとして扱いたくない場合は、変換前に条件分岐を行います。

using System;

class Program
{
    static void Main()
    {
        // nullが入る可能性のある文字列
        string? text = null;

        // nullかどうかを確認します
        if (text is null)
        {
            Console.WriteLine("文字列が設定されていません。");
        }
        else
        {
            // nullではない場合に大文字へ変換します
            string result = text.ToUpperInvariant();

            // 変換結果を表示します
            Console.WriteLine(result);
        }
    }
}
C#

この方法では、null の場合に専用の処理を行い、文字列が存在する場合だけ変換します。

実務では、値が存在しないこと自体が重要な情報になる場合があります。そうしたケースでは、単に空文字へ置き換えるよりも、条件分岐で状態を明確にするほうが適切です。

空文字や空白もまとめて判定する

null だけでなく、空文字や空白だけの文字列も対象外にしたい場合は、string.IsNullOrWhiteSpace() が便利です。

using System;

class Program
{
    static void Main()
    {
        // 入力値の例です
        string? text = "   ";

        // null、空文字、空白だけの文字列を確認します
        if (string.IsNullOrWhiteSpace(text))
        {
            Console.WriteLine("変換する文字列がありません。");
        }
        else
        {
            // 有効な文字列を大文字に変換します
            string result = text.ToUpperInvariant();

            // 変換結果を表示します
            Console.WriteLine(result);
        }
    }
}
C#

string.IsNullOrWhiteSpace() は、次のような値に対して true を返します。

  • null
  • ""(空文字)
  • " "(半角空白だけの文字列)
  • タブや改行などの空白文字だけで構成された文字列

一方、" hello " のように文字列の一部に通常の文字が含まれている場合は false になります。

ただし、前後の空白も取り除いてから大文字にしたい場合は、Trim() と組み合わせる方法もあります。

using System;

class Program
{
    static void Main()
    {
        // 前後に空白がある文字列
        string? text = "  hello world  ";

        // null、空文字、空白だけの場合は処理しません
        if (string.IsNullOrWhiteSpace(text))
        {
            Console.WriteLine("入力値がありません。");
            return;
        }

        // 前後の空白を取り除いてから大文字に変換します
        string result = text.Trim().ToUpperInvariant();

        // 変換結果を表示します
        Console.WriteLine(result); // HELLO WORLD
    }
}
C#

ここで Trim() は、文字列の先頭と末尾にある空白文字などを取り除きます。文字列の途中にある空白は削除しません。

また、空白を取り除く処理と大文字に変換する処理は、それぞれ別の役割を持っています。必要な処理を組み合わせることで、入力値を扱いやすい形式に整えられます。

実務で再利用できる大文字変換メソッドを作る

変換処理をメソッドにまとめる

同じ変換処理を複数の場所で使用する場合は、専用のメソッドにまとめておくと便利です。

例えば、プログラム内で使う文字列を、カルチャに依存せず大文字に統一する処理を作成します。

using System;

class Program
{
    static void Main()
    {
        // 変換対象の文字列を用意します
        string text1 = "hello";
        string text2 = "item-001";
        string text3 = "[email protected]";

        // 作成したメソッドを呼び出します
        Console.WriteLine(ToUpperSafe(text1)); // HELLO
        Console.WriteLine(ToUpperSafe(text2)); // ITEM-001
        Console.WriteLine(ToUpperSafe(text3)); // [email protected]
    }

    // 文字列を安全に大文字へ変換するメソッド
    static string ToUpperSafe(string? value)
    {
        // nullの場合は空文字を返します
        if (value is null)
        {
            return string.Empty;
        }

        // カルチャに依存しない規則で大文字に変換します
        return value.ToUpperInvariant();
    }
}
C#

このメソッドでは、value が null であれば空文字を返し、それ以外の場合は ToUpperInvariant() で変換しています。

変換処理を一か所にまとめておくと、今後の仕様変更にも対応しやすくなります。例えば、空白を取り除く処理を追加したい場合でも、メソッドの内部を変更すれば、呼び出し元のコードを個別に修正する必要がありません。

ただし、ToUpperSafe() という名前だけでは、null を空文字に置き換える仕様が分かりにくい場合があります。チーム開発では、メソッド名やコメントで処理内容を明確にしておくとよいでしょう。

nullを空文字に置き換えたくない場合のテンプレート

null を空文字に変換するのではなく、呼び出し元に null の状態を維持したい場合は、戻り値を string? にする方法があります。

using System;

class Program
{
    static void Main()
    {
        // 通常の文字列
        string? text1 = "hello";

        // nullの文字列
        string? text2 = null;

        // 変換処理を実行します
        string? result1 = ToUpperOrNull(text1);
        string? result2 = ToUpperOrNull(text2);

        // 変換結果を表示します
        Console.WriteLine(result1); // HELLO
        Console.WriteLine(result2 is null ? "nullです" : result2);
    }

    // nullはnullのまま、それ以外は大文字に変換します
    static string? ToUpperOrNull(string? value)
    {
        // nullの場合はnullを返します
        if (value is null)
        {
            return null;
        }

        // nullではない場合に大文字へ変換します
        return value.ToUpperInvariant();
    }
}
C#

この例では、入力値が null なら戻り値も null になります。値が存在する場合にだけ、大文字へ変換します。

このように、共通メソッドを作るときは、単に例外を防ぐだけでなく、null をどう扱うのかを明確にしておくことが重要です。

なお、string? は、C#の nullable reference types(null許容参照型)を有効にしたプロジェクトで使う表記です。古いプロジェクトなどでこの機能が有効になっていない場合は、設定や言語バージョンに応じて調整してください。

文字列を大文字に変換するときの注意点

すべての文字が1文字ずつ対応するとは限らない

文字列の大文字・小文字変換は、常に「1文字が必ず別の1文字に変わる」という単純な処理ではありません。Unicodeにはさまざまな言語の文字が含まれており、文字によっては大文字・小文字の対応が複雑です。

そのため、変換前と変換後の文字数や、文字列の内部表現が必ず同じになるとは限りません。

例えば、文字列を大文字にしたあとで文字数を使った判定を行う場合は、変換後の値に対して必要な確認を行ってください。

using System;

class Program
{
    static void Main()
    {
        // 変換対象の文字列
        string text = "hello";

        // 大文字に変換します
        string upperText = text.ToUpperInvariant();

        // 変換前と変換後の長さを表示します
        Console.WriteLine($"変換前の長さ:{text.Length}");
        Console.WriteLine($"変換後の長さ:{upperText.Length}");
    }
}
C#

この英語の例では、変換前後の長さは同じです。しかし、あらゆる言語の文字列で必ず同じになると仮定しないことが大切です。

また、C#の string.Length は、画面に表示される文字の数をそのまま数えるプロパティではなく、UTF-16コード単位の数を返します。絵文字などを含む文字列では、見た目の文字数と一致しない場合があります。

大文字に変換するだけでは入力値の検証にならない

例えば、ユーザーが入力したコードを大文字に変換しても、そのコードが正しい形式であることまでは保証されません。

using System;

class Program
{
    static void Main()
    {
        // 入力値の例
        string? input = "abc-123";

        // nullや空白だけの値を確認します
        if (string.IsNullOrWhiteSpace(input))
        {
            Console.WriteLine("入力値を指定してください。");
            return;
        }

        // 大文字に変換します
        string normalized = input.Trim().ToUpperInvariant();

        // 変換結果を表示します
        Console.WriteLine(normalized); // ABC-123

        // この段階では、形式が正しいかどうかは未確認です
    }
}
C#

このコードは、入力値の前後の空白を取り除き、大文字に変換しています。しかし、例えば "@@@-###" のような値も、変換処理だけでは不正な形式として検出できません。

業務上のコードや識別子を扱う場合は、変換後に必要な形式チェックを行ってください。英数字とハイフンだけを許可するなど、要件に応じて Regex や文字列の検証処理を使用します。

SQLインジェクションやクロスサイトスクリプティングの対策にはならない

文字列を大文字に変換する処理は、入力値を安全にするためのセキュリティー対策ではありません。

例えば、SQL文に入力値を直接連結してしまうと、入力値を大文字に変換してもSQLインジェクションを防ぐことはできません。同様に、HTMLへ出力する値を大文字に変換しても、クロスサイトスクリプティング(XSS)対策にはなりません。

セキュリティー対策は、データの用途に応じて実施する必要があります。

  • SQLを実行するときは、原則としてパラメーター化クエリを使用します。
  • HTMLに値を出力するときは、出力先の文脈に応じた適切なエンコードを行います。
  • 入力値は、業務上の仕様に基づいて形式や長さを検証します。
  • 大文字・小文字を区別するかどうかは、業務要件や識別子の仕様に従って決定します。

ToUpper() や ToUpperInvariant() は文字列の表記を変換するためのメソッドであり、入力値の安全性を保証するものではないことを理解しておきましょう。

よく使うコードテンプレート

基本的な大文字変換

// 文字列を用意します
string text = "hello";

// 大文字に変換します
string result = text.ToUpper();

// 結果:HELLO
Console.WriteLine(result);
C#

カルチャに依存しない大文字変換

// プログラム内部で使用する文字列を用意します
string code = "item-001";

// カルチャに依存しない規則で大文字に変換します
string result = code.ToUpperInvariant();

// 結果:ITEM-001
Console.WriteLine(result);
C#

nullの場合は空文字として処理する

// nullが入る可能性のある文字列
string? text = null;

// nullの場合は空文字に置き換えてから変換します
string result = (text ?? string.Empty).ToUpperInvariant();

// 結果:空文字
Console.WriteLine($"[{result}]");
C#

前後の空白を取り除いてから変換する

// 前後に空白がある文字列
string? text = "  hello  ";

// null、空文字、空白だけの場合は処理しません
if (string.IsNullOrWhiteSpace(text))
{
    Console.WriteLine("入力値がありません。");
}
else
{
    // 前後の空白を取り除き、大文字に変換します
    string result = text.Trim().ToUpperInvariant();

    // 結果:HELLO
    Console.WriteLine(result);
}
C#

大文字・小文字を区別せずに比較する

using System;

// 比較対象の文字列
string code1 = "item-001";
string code2 = "ITEM-001";

// 大文字・小文字を区別せずに比較します
bool isEqual = string.Equals(
    code1,
    code2,
    StringComparison.OrdinalIgnoreCase
);

// 結果:True
Console.WriteLine(isEqual);
C#

これらのテンプレートを基本として、入力値の扱い方や変換する目的に合わせて調整してください。

まとめ

C#で文字列を大文字に変換するには、ToUpper() または ToUpperInvariant() を使用します。どちらも基本的な使い方は簡単ですが、実務では変換の目的に応じた使い分けが重要です。

  • ToUpper() は、現在のカルチャに基づいて大文字に変換します。
  • ToUpperInvariant() は、カルチャに依存しない規則で大文字に変換します。
  • string は不変型なので、変換結果を利用するには戻り値を受け取る必要があります。
  • null に対して直接 ToUpper() を呼び出すと、例外が発生します。
  • null を空文字に置き換えるかどうかは、業務上の要件に応じて決めます。
  • 大文字・小文字を区別せずに比較したいだけなら、StringComparison.OrdinalIgnoreCase を使用する方法もあります。
  • 大文字への変換だけでは、入力値の形式検証やセキュリティー対策にはなりません。

特に覚えておきたいのは、文字列を大文字に変換することと、文字列を比較することは別の処理であるという点です。

画面表示用の文字列を変換したいのか、プログラム内部の識別子を統一したいのか、それとも大文字・小文字を無視して比較したいのかによって、適切な方法は変わります。

用途を明確にしたうえで ToUpper()、ToUpperInvariant()、StringComparison.OrdinalIgnoreCase を使い分けることで、読みやすく安全で、実務でも再利用しやすいC#コードを作成できます。

タイトルとURLをコピーしました