当我在 C++ 中尝试使用非英语字符的 tolower() 时,它无法正常工作。我搜索了那个问题,发现了一些关于语言环境的东西,但我不确定最好的解决方案。
我的示例代码如下:
printf("%c ",tolower('Ü'));
不幸的是,标准 C++ 库没有足够的支持来更改所有可能的非英文字符的大小写(就那些完全有大小写变体的字符而言)。此限制是由于 C++ 标准假定单个字符及其大小写变体恰好占据一个char
对象(或wchar_t
宽字符的对象)和不能保证为真的非英文字符(也取决于字符被编码)。
如果您的环境对相关字符使用单字节编码,这可能会为您提供所需的内容:
std::cout << std::tolower('Ü', locale());
使用宽字符,您可能会有更多的运气:
std::wcout << std::tolower(L'Ü', locale());
但即使这样也不会给出正确的结果toupper(L'ß')
,这将是两个字符序列L"SS"
)。
如果您需要对所有字符的支持,请查看ICU 库,尤其是关于案例映射的部分
正如 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