C++ で文字列を大文字に変換する方法
-
文字列を大文字に変換するには
std::transform()
とstd::toupper()
を使用する -
icu::UnicodeString
とtoUpper()
を用いて文字列を大文字に変換する -
特定のロケールで
icu::UnicodeString
とtoUpper()
を使用して文字列を大文字に変換する
この記事では、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::UnicodeString
と toUpper()
を用いて文字列を大文字に変換する
上記のコードは 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::UnicodeString
と toUpper()
を使用して文字列を大文字に変換する
関数 toUpper
は locale
パラメータを受け取ることもでき、特定の 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;
}