我找到了一个std::tolower的例子,在这里:https://en.cppreference.com/w/cpp/string/byte/islower
有一个例子,根据网站,应该返回false
和true
的这位代码:
#include <iostream>
#include <cctype>
#include <clocale>
int main()
{
unsigned char c = 'xe5'; // letter å in ISO-8859-1
std::cout << "islower('\xe5', default C locale) returned "
<< std::boolalpha << (bool)std::islower(c) << 'n';
std::setlocale(LC_ALL, "en_GB.iso88591");
std::cout << "islower('\xe5', ISO-8859-1 locale) returned "
<< std::boolalpha << (bool)std::islower(c) << 'n';
}
但是在我自己的IDE中复制粘贴这一点给了我false
和false
,网站本身的run this code button
也是如此。
编辑:所以locale没有被正确设置。使用windows 10和最新的Jetbrains Rider
如此:
assert(std::setlocale(LC_ALL, "en_US.UTF-8"));
//assert(std::setlocale(LC_ALL, "en_GB.iso88591"));
printf ("Locale is: %sn", setlocale(LC_ALL,NULL) );
但是取消注释其他语言环境会抛出错误。
问题是在Windows区域设置名称与Linux不相同。
在Windows上iso88591
由代码页1252
表示,因此可能的区域设置名称之一是:.1252
:
std::setlocale(LC_ALL, ".1252");
不确定,但也有可能.Windows-1252
也会做这项工作。
您也可以尝试boost.locale
来统一语言环境名称(因此它可以在所有平台上工作)。因为这是c++,你需要使用std::tolower(std::locale)。