当我在c ++中尝试使用非英语字符的tolower()时,它无法正常工作。我搜索了这个问题,但我发现了一些关于语言环境的内容,但我不确定最佳解决方案。
我的示例代码如下:
printf("%c ",tolower('Ü'));
答案 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)
#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