tolower()不适用于c ++中的Ü,Ö

时间:2012-12-13 11:21:45

标签: c++ tolower

当我在c ++中尝试使用非英语字符的tolower()时,它无法正常工作。我搜索了这个问题,但我发现了一些关于语言环境的内容,但我不确定最佳解决方案。

我的示例代码如下:

printf("%c ",tolower('Ü'));

2 个答案:

答案 0 :(得分:6)

不幸的是,标准C ++库没有足够的支持来更改所有可能的非英语字符的大小写(就那些具有大小写变体的字符而言)。这种限制是由于C ++标准假定单个字符及其大小写变体只占用一个char对象(或宽wchar_t对象的宽字符)和非英语字符而不是保证是真的(也取决于字符的编码方式)。

如果您的环境对相关字符使用单字节编码,则可能会为您提供所需内容:

std::cout << std::tolower('Ü', locale());

对于广泛的角色,你可能会有更多的运气:

std::wcout << std::tolower(L'Ü', locale());

但即使这样也无法为toupper(L'ß')提供正确的结果,这将是双字符序列L"SS")。

如果您需要支持所有字符,请查看the ICU library,特别是the part about case mappings

答案 1 :(得分:3)

像巴特所表明的那样,C ++根本不喜欢多字节编码。幸运的是,您可以使用Boost.Local来解决这个问题而不会有太多麻烦。这是一个简单的例子:

#include <iostream>
#include <locale>
#include <boost/locale.hpp>

int main() {
    boost::locale::generator gen;
    std::locale loc = gen("en_US.UTF-8");
    std::string line;
    while (std::getline(std::cin, line))
        std::cout << boost::locale::to_lower(line, loc) << '\n';
}

要编译,我们需要链接到Boost.Locale库:

g++ -lboost_locale lower.cpp -o lower

当我们执行它时,我们得到以下结果:

$ ./main <<< 'ICH HÄTTE GERNE EINEN SÜßEN HASEN'
ich hätte gerne einen süßen hasen