C++ で文字列を大文字に変換する方法

胡金庫 2023年12月11日
  1. 文字列を大文字に変換するには std::transform()std::toupper() を使用する
  2. icu::UnicodeStringtoUpper() を用いて文字列を大文字に変換する
  3. 特定のロケールで icu::UnicodeStringtoUpper() を使用して文字列を大文字に変換する
C++ で文字列を大文字に変換する方法

この記事では、string を大文字に変換する方法について説明します。

文字列を大文字に変換するには std::transform()std::toupper() を使用する

std::transform メソッドは STL <algorithm> ライブラリから提供されており、与えられた関数を範囲に適用することができます。この例では、これを利用して std::string の文字範囲を操作し、toupper 関数を用いて各 char を大文字に変換します。このメソッドは与えられた文字列からシングルバイト文字を変換することに成功しましたが、プログラムの出力を見ると、マルチバイトエンコーディングの文字は大文字化されていないことに注意してください。

#include <iostream>
#include <algorithm>
#include <string>

using std::cout; using std::string;
using std::endl; using std::cin;
using std::transform; using std::toupper;

string capitalizeString(string s)
{
    transform(s.begin(), s.end(), s.begin(),
                   [](unsigned char c){ return toupper(c); });
    return s;
}

int main() {
    string string1("hello there είναι απλά ένα κείμενο χωρίς");
    cout << "input  string: " << string1 << endl
         <<  "output string: " << capitalizeString(string1) << endl << endl;

    return 0;
}

出力:

input  string: hello there είναι απλά ένα κείμενο χωρίς
output string: HELLO THERE είναι απλά ένα κείμενο χωρίς

icu::UnicodeStringtoUpper() を用いて文字列を大文字に変換する

上記のコードは ASCII 文字列やその他の文字に対しては問題なく動作しますが、例えば特定の Unicode 文字列を渡すと toupper 関数はそれらを大文字化しません。ICU (International Components for Unicode) ライブラリは安定性を提供するのに十分成熟しており、広くアクセス可能で、コードをクロスプラットフォームに保つことができます。

ICU ライブラリを利用するには、ソースファイルに <unicode/unistr.h><unicode/ustream.h><unicode/locid.h> というヘッダをインクルードしなければなりません。これらのライブラリはオペレーティングシステムに既にインストールされていて、利用可能である可能性が高く、コード例は問題なく動作するはずです。しかし、コンパイル時のエラーが発生した場合は、ICU ウェブサイトの特定のプラットフォーム用のライブラリをダウンロードする方法についての説明を参照してください。

ICU ライブラリの依存関係を正常にリンクするためには、以下のコンパイラフラグを指定する必要があることに注意してください。

g++ sample_code.cpp -licuio -licuuc -o sample_code
#include <iostream>
#include <string>
#include <unicode/unistr.h>
#include <unicode/ustream.h>
#include <unicode/locid.h>

using std::cout; using std::string;
using std::endl; using std::cin;
using std::transform; using std::toupper;

int main() {
    string string1("hello there είναι απλά ένα κείμενο χωρίς");

    icu::UnicodeString unicodeString(string1.c_str());
    cout << "input string:  " << string1 << endl
        <<  "output string: " << unicodeString.toUpper() << endl;

    return 0;
}

出力:

input string:  hello there είναι απλά ένα κείμενο χωρίς
output string: HELLO THERE ΕΊΝΑΙ ΑΠΛΆ ΈΝΑ ΚΕΊΜΕΝΟ ΧΩΡΊΣ

特定のロケールで icu::UnicodeStringtoUpper() を使用して文字列を大文字に変換する

関数 toUpperlocale パラメータを受け取ることもでき、特定の locale の規則に従って文字列を操作することができます。渡す引数は icu::Locale オブジェクトとして個別に作成することもできますし、toUpper 関数に文字列リテラルでロケールを指定することもできます。

#include <unicode/locid.h>
#include <unicode/unistr.h>
#include <unicode/ustream.h>

#include <iostream>

int main() {
  string string2 = "Contrairement à une opinion répandue";

  icu::UnicodeString unicodeString2(string2.c_str());
  cout << unicodeString2.toUpper("fr-FR") << endl;

  return 0;
}
著者: 胡金庫
胡金庫 avatar 胡金庫 avatar

DelftStack.comの創設者です。Jinku はロボティクスと自動車産業で8年以上働いています。自動テスト、リモートサーバーからのデータ収集、耐久テストからのレポート作成が必要となったとき、彼はコーディングスキルを磨きました。彼は電気/電子工学のバックグラウンドを持っていますが、組み込みエレクトロニクス、組み込みプログラミング、フロントエンド/バックエンドプログラミングへの関心を広げています。

LinkedIn Facebook

関連記事 - C++ String