質問
C++ で文字列を小文字/大文字に変換するために人々が見つけた最良の方法は何ですか?
C++ が英語専用のプログラミング言語ではないという事実により、問題は複雑になります。良い多言語化方法はありますか?
解決
#include <algorithm>
std::string data = "Abc";
std::transform(data.begin(), data.end(), data.begin(), ::toupper);
http://notfaq.wordpress.com/2007/08/04/cc-convert-string-to-upper lower-case/
また、一般的な文字列メソッドに関する CodeProject の記事: http://www.codeproject.com/KB/stl/STL_string_util.aspx
他のヒント
> std::string data = “Abc”;
> std::transform(data.begin(), data.end(), data.begin(), ::toupper);
これは機能しますが、標準の「C」ロケールが使用されます。別のロケールの tower を取得する必要がある場合は、ファセットを使用できます。ファセットを使用した上記のコードは次のようになります。
locale loc("");
const ctype<char>& ct = use_facet<ctype<char> >(loc);
transform(str.begin(), str.end(), std::bind1st(std::mem_fun(&ctype<char>::tolower), &ct));
Nic Strong の回答を使用したいコピペの場合は、「use_factet」のスペルミスと、std::transform の 3 番目のパラメータが欠落していることに注意してください。
locale loc("");
const ctype<char>& ct = use_factet<ctype<char> >(loc);
transform(str.begin(), str.end(), std::bind1st(std::mem_fun(&ctype<char>::tolower), &ct));
あるべきです
locale loc("");
const ctype<char>& ct = use_facet<ctype<char> >(loc);
transform(str.begin(), str.end(), str.begin(), std::bind1st(std::mem_fun(&ctype<char>::tolower), &ct));
レビューもする必要があります この質問. 。基本的に問題は、標準の C/C++ ライブラリが Unicode データを処理するように構築されていないため、他のライブラリを参照する必要があることです。
これは、C++ 標準が更新されると変更される可能性があります。Borland の次のコンパイラ (CodeGear) が Unicode をサポートすることはわかっています。また、Microsoft の C++ コンパイラも Unicode をサポートする文字列ライブラリをサポートするか、すでにサポートしていると思います。
Darren さんが言ったように、最も簡単な方法は std::transform を使用することです。
ただし、ドイツ語などの一部の言語では、小文字と大文字が常に 1 対 1 で対応しているわけではないことに注意してください。小文字の「esset」(ギリシャ文字のベータに似ています)は大文字の「SS」に変換されます。
Boost をお持ちの場合は、最も簡単な方法があります。見て ブースト文字列アルゴリズムの to_upper()/to_ lower().
Unicode (および多言語) 文字の大文字と小文字を変換する方法を見つけましたが、その文字のロケールを (何らかの方法で) 知っている/見つける必要があります。
#include <locale.h>
_locale_t locale = _create_locale(LC_CTYPE, "Greek");
AfxMessageBox((CString)""+(TCHAR)_totupper_l(_T('α'), locale));
_free_locale(locale);
それを行う方法はまだ見つかっていません...誰か方法を知っているので、教えてください。
ロケールを NULL に設定しても機能しません...
の VCL
があります SysUtils.hpp
持っているもの LowerCase(unicodeStringVar)
そして UpperCase(unicodeStringVar)
それはあなたにとってうまくいくかもしれません。C++ Builder 2009 でこれを使用します。
Steve の言っていることは正しいですが、コードが複数の言語をサポートする必要がある場合は、その言語に基づいて関連する toUpper または toLower を実行する一連のメソッドをカプセル化するファクトリ メソッドを使用できると思います。