将C++中的unicode字符串转换为大写字母

Pan*_*kaj 17 c++ string unicode

我们如何在C或C++中将多语言字符串或unicode字符串转换为大写/小写.

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区域设置.


Jah*_*hid 5

如果您想要一个健全且成熟的解决方案,请考虑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}\n
Run Code Online (Sandbox Code Playgroud)\n\n

输出:

\n\n
Upper: \xc3\x93\xc3\x93SSCHLO\xc3\x8b\nLower: \xc3\xb3\xc3\xb3sschlo\xc3\xab\n
Run Code Online (Sandbox Code Playgroud)\n\n

注意:在后面的步骤中SS不被视为德语的大写字母\xc3\x9f

\n


mew*_*ewa 2

您可以迭代 awstring并使用towupper / towlower

for (wstring::iterator it = a.begin(); it != a.end(); ++it)
        *it = towupper(*it);
Run Code Online (Sandbox Code Playgroud)