Как изменить случай латинских строк UTF-8 в С++?

В Objective-C он мертв просто:

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

В С++, что эквивалентно? Может ли кто-нибудь предоставить действительный код для этого, который дает тот же результат? Есть ли хороший способ STL сделать это, не полагаясь на ICU, Boost или любые другие сторонние библиотеки?

Мое текущее не-решение:

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"

Ответ 1

В С++ проблема оказывается невероятно сложной. Там только одна библиотека, которую я знаю об этом, абсолютно корректна, принимая во внимание нормализацию юникода и другие проблемы с символами, не относящимися к нижнему 128-ASCII.

IBM ICU

Он массивный, но он делает все правильно. toupper и tolower оспаривают эту проблему, к сожалению, и нет никакой другой конструкции С++.

Ответ 2

Существует tolower, который является специфичным для локали, но я не думаю, что он будет работать с строками UTF-8.

Правильное решение всегда будет специфичным для локали, потому что правила дела зависят от языка. Например, строчная версия "I" не всегда "i".