質問

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 を実行する一連のメソッドをカプセル化するファクトリ メソッドを使用できると思います。

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top