I found an example of std::tolower, here: https://en.cppreference.com/w/cpp/string/byte/islower
There’s an example which, according to the website, should return false and true for this bit of code:
#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';
}
But copy-pasting this bit in my own IDE gives me false and false, and so does the run this code button on the website itself.
EDIT:
So the locale is not being set properly. Using windows 10 with latest Jetbrains Rider.
This works:
assert(std::setlocale(LC_ALL, "en_US.UTF-8"));
//assert(std::setlocale(LC_ALL, "en_GB.iso88591"));
printf ("Locale is: %s\n", setlocale(LC_ALL,NULL) );
But uncommenting the other locale will throw error.
>Solution :
Ok so problem is that on Windows locale names are not same as on Linux.
On Windows iso88591 is represented by codepage 1252 so one of possible locale name is:.1252:
std::setlocale(LC_ALL, ".1252");
Not sure, but it is possible also .Windows-1252 will do the job too.
You can also try boost.locale to try unify locale names (so it could work same on all platforms). Since this is C++ you need to use std::tolower(std::locale).