12

Objective-C では、非常に単純です。

NSLog(@"%@", [@"BAÑO" lowercaseString]);  // Outputs "baño".

C ++では、同等のものは何ですか? 誰でも同じ出力を生成する有効なコードを提供できますか? ICU、Boost、またはその他のサードパーティのライブラリに依存せずにこれを行うための適切な STL の方法はありますか?

私の現在の非解決策は次のとおりです。

using namespace std;
string s = "BAÑO";
wstring w(s.begin(), s.end());
transform(w.begin(), w.end(), w.begin(), towlower);
// w contains "baÑo"
4

2 に答える 2

5

この問題は、C++では非常に複雑であることがわかりました。私が知っているライブラリは1つだけで、ユニコードの正規化やその他の非下位128ASCII文字ポイントの問題を考慮して完全に正しくなります。

IBMのICU

それは巨大ですが、それはすべてを正しく行います。残念ながら、toupperとtolowerはこの問題では不十分であり、他に利用できるC++構造はありません。

于 2012-05-18T00:38:16.940 に答える
2

ロケール固有のtolowerがありますが、UTF-8 文字列では機能しないと思います。

大文字と小文字の規則は言語に依存するため、正しい解決策は常にロケール固有です。たとえば、'I' の小文字バージョンが常に 'i' であるとは限りません。

于 2012-05-18T00:04:41.020 に答える