Kyl*_*ker 11
如果您的系统已经是UTF-8,通过使用std::use_facet,您可以写:
#include <iostream>
#include <locale.h>
int main() {
std::locale::global(std::locale("")); // (*)
std::wcout.imbue(std::locale());
auto& f = std::use_facet<std::ctype<wchar_t>>(std::locale());
std::wstring str = L"Zoë Saldaña played in La maldición del padre Cardona.";
f.toupper(&str[0], &str[0] + str.size());
std::wcout << str << std::endl;
return 0;
}
Run Code Online (Sandbox Code Playgroud)
你得到了(http://ideone.com/AFHoHC):
ZOËSALDAÑA在LAMALDICIÓNDELPADRE CARDONA演出.
如果它不起作用,您将不得不将(*)更改为std::locale::global(std::locale("en_US.UTF8"));您在平台上实际拥有的UTF-8区域设置.
如果您想要一个健全且成熟的解决方案,请考虑IBM 的 ICU。这是一个例子:
\n\n#include <iostream>\n#include <unicode/unistr.h>\n#include <string>\n\nint main(){\n icu::UnicodeString us("\xc3\xb3\xc3\xb3\xc3\x9fChlo\xc3\xab");\n us.toUpper(); //convert to uppercase in-place\n std::string s;\n us.toUTF8String(s);\n std::cout<<"Upper: "<<s<<"\\n";\n\n us.toLower(); //convert to lowercase in-place\n s.clear();\n us.toUTF8String(s);\n std::cout<<"Lower: "<<s<<"\\n";\n return 0;\n}\nRun Code Online (Sandbox Code Playgroud)\n\n输出:
\n\nUpper: \xc3\x93\xc3\x93SSCHLO\xc3\x8b\nLower: \xc3\xb3\xc3\xb3sschlo\xc3\xab\nRun Code Online (Sandbox Code Playgroud)\n\n注意:在后面的步骤中SS不被视为德语的大写字母\xc3\x9f
您可以迭代 awstring并使用towupper / towlower
for (wstring::iterator it = a.begin(); it != a.end(); ++it)
*it = towupper(*it);
Run Code Online (Sandbox Code Playgroud)