【问题标题】:How does the behavior of std::tolower change in different locales?std::tolow 的行为在不同语言环境中有何变化?
【发布时间】:2014-08-11 06:02:58
【问题描述】:

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

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

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

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

【问题讨论】:

  • 通过转换默认语言环境中不存在的字符?
  • @juanchopanza 哦...好吧,现在我想起来了。
  • 提示:C 和 C++ 中对语言环境的一般支持在编译器和系统之间是不稳定且不均匀的。此外,大多数解析器都是在“C”语言环境的假设下编写的,如果你使用一个做任何花哨的语言环境,它们就会崩溃。避免它们,它们不值得努力。

标签: c++ locale tolower


【解决方案1】:

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

#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*)只是 字节。切换语言环境时,您会切换这些字节的解释,例如这里的字节 0xb4 (180) 超出 ASCII 范围 (0-127),因此其含义会根据语言环境而变化你切换到:

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

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

【讨论】:

  • :sigh: 他们才20年
  • 那么如果你使用的是unicode,有没有更好的函数可以使用?
  • @anthropomorphic:如果你使用 Unicode,你应该只使用 Unicode 语言环境。
  • @anthropomorphic:默认语言环境由您的操作系统设置决定(在类 Unix 系统上,通常通过环境变量 LC_ALL)。如果未指定其他内容,则为 C 语言环境。
  • @anthropomorphic:实际上,Unicode 也带来了一些新的案例。许多语言环境都经过精心设计,以便将一个“字符”(无论是什么意思)编码在一个字节上,这是tolower 所假设的。不幸的是,对于 Unicode,这不再成立,因此 tolower 不适用于 Unicode 字符串,无论特定编码(utf-8、utf-16、utf-32、...)如何
【解决方案2】:

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

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

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

【讨论】:

    猜你喜欢
    • 2021-12-20
    • 2020-11-27
    • 2022-10-24
    • 2014-02-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2010-09-18
    相关资源
    最近更新 更多