Mic*_*rst 0 c++ locale tolower
我正在阅读cppreference.com上的文档std::tolower:
根据当前安装的C语言环境定义的字符转换规则将给定字符转换为小写.
在默认的"C"语言环境中,以下大写字母ABCDEFGHIJKLMNOPQRSTUVWXYZ将替换为相应的小写字母abcdefghijklmnopqrstuvwxyz.
这种行为在不同的语言环境中如何变化?
实际上,网站上的示例显示了一个区别:
#include <iostream>
#include <cctype>
#include <clocale>
int main()
{
unsigned char c = '\xb4'; // the character Ž in ISO-8859-15
// but ´ (acute accent) in ISO-8859-1
std::setlocale(LC_ALL, "en_US.iso88591");
std::cout << std::hex << std::showbase;
std::cout << "in iso8859-1, tolower('0xb4') gives "
<< std::tolower(c) << '\n';
std::setlocale(LC_ALL, "en_US.iso885915");
std::cout << "in iso8859-15, tolower('0xb4') gives "
<< std::tolower(c) << '\n';
}
Run Code Online (Sandbox Code Playgroud)
输出:
in iso8859-1, tolower('0xb4') gives 0xb4
in iso8859-15, tolower('0xb4') gives 0xb8
Run Code Online (Sandbox Code Playgroud)
因为C语言没有编码概念,所以a char(因此a char const*)只是字节.切换语言环境时,可以切换这些字节的解释,例如,此处字节0xb4(180)超出ASCII范围(0-127),因此其含义会根据您切换到的语言环境而改变:
´,因此当从上到下移动时不变Ž,因此在ž从上到下移动时更改为(此区域设置中的0xb8)您会认为在后Unicode世界中,这将是无关紧要的,但许多尚未转换为Unicode ......