0

我正在阅读cppreference.com的文档std::tolower

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

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

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

4

2 回答 2

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 语言没有编码的概念,所以 a char(因此 a char const*)只是bytes。切换语言环境时,您会切换这些字节的解释,例如这里的字节0xb4(180) 超出 ASCII 范围 (0-127),因此其含义会根据您切换到的语言环境而变化:

  • 在 ISO-8859-1 中,它表示´,因此在从上到下移动时不变
  • 在 ISO-8859-15 中,它表示Ž,因此在ž从上到下移动时更改为 (0xb8 in this locale)

您会认为在后 Unicode 世界中,这无关紧要,但许多人还没有过渡到 Unicode...

于 2014-08-11T06:18:19.977 回答
2

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

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

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

于 2014-08-11T06:19:43.557 回答