std :: tolower的行为在不同的语言环境中如何变化?

时间:2014-08-11 06:02:58

标签: c++ locale tolower

我正在阅读documentation for std::tolower at cppreference.com

  

根据当前安装的C语言环境定义的字符转换规则将给定字符转换为小写。

     

在默认的“C”语言环境中,以下大写字母ABCDEFGHIJKLMNOPQRSTUVWXYZ将替换为相应的小写字母abcdefghijklmnopqrstuvwxyz。

这种行为如何在不同的语言环境中发生变化?

2 个答案:

答案 0 :(得分:5)

实际上,网站上的例子显示了不同之处:

#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';
}

输出:

in iso8859-1, tolower('0xb4') gives 0xb4
in iso8859-15, tolower('0xb4') gives 0xb8

由于C语言没有编码概念,因此char(以及char const*)只是 bytes 。切换语言环境时,切换这些字节的解释,例如,此处字节0xb4(180)超出ASCII范围(0-127),因此其含义会根据您切换到的语言环境:

  • 在ISO-8859-1中,它意味着´,因此从上到下移动时保持不变
  • 在ISO-8859-15中,它意味着Ž,因此当从上到下移动时,更改为ž(此语言环境中为0xb8)

您会认为在后Unicode世界中,这将是无关紧要的,但许多尚未转换为Unicode ......

答案 1 :(得分:2)

它可能会以两种方式改变:

  • 该组中没有字符,也可以在非C语言环境中翻译。例如,在德语区域设置中,字母“Ä”将转换为“ä”。
  • 即使对于该集中的字符,小写版本也可能不同。例如,在土耳其语语言环境中,“I”的小写版本不应为“i”,而应为“ı”,而“i”将生成为“İ”的小写等效。

另请注意,字符集中非ASCII字符的位置可能取决于区域设置,因为区域设置还确定使用的字符集。但是,即使您只使用Unicode(例如,仅使用UTF-8语言环境),您仍然会遇到上面列出的差异。