4

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

我的示例代码如下:

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

2 回答 2

6

不幸的是,标准 C++ 库没有足够的支持来更改所有可能的非英文字符的大小写(就那些完全有大小写变体的字符而言)。此限制是由于 C++ 标准假定单个字符及其大小写变体恰好占据一个char对象(或wchar_t宽字符的对象)和不能保证为真的非英文字符(也取决于字符被编码)。

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

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

使用宽字符,您可能会有更多的运气:

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

但即使这样也不会给出正确的结果toupper(L'ß'),这将是两个字符序列L"SS")。

如果您需要对所有字符的支持,请查看ICU 库,尤其是关于案例映射的部分

于 2012-12-13T11:48:14.740 回答
3

正如 Bart 所展示的,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
于 2012-12-13T12:28:53.270 回答