1. POSIX Base Definitions 中 locale 与 character classes 的概念模型,LC_CTYPE 与 LC_COLLATE 的优先级如何设定?
请解释 POSIX Base Definitions 中 locale 与字符类(character classes)的概念模型,并说明 LC_CTYPE 与 LC_COLLATE 在 locale 应用中的优先级如何设定?
- 掌握 character classes 与 locale 分类的关系
- 理解 LC_CTYPE 与 LC_COLLATE 各自职责及优先级
- 理解 setlocale 与工作区选区的机制
POSIX 规定 locale 是一个区域化环境集合,由若干分类(LC_CTYPE、LC_COLLATE、LC_MESSAGES、LC_MONETARY、LC_NUMERIC、LC_TIME)组成,每个分类独立控制字符分类、排序、消息、货币、数字和时间格式。字符类(character classes)如 [:alpha:]、[:digit:] 是这些分类定义中使用的抽象字符集合,由 LC_CTYPE 定义的单字节映射与字符分类决定其成员。LC_CTYPE 负责字符分类与转换(如 isalpha、toupper),而 LC_COLLATE 负责字符串排序规则(如 strcoll、collation 权重)。优先级方面,LC_ALL 会覆盖所有其他 LC_* 分类,而单独设置的 LC_* 覆盖对应的默认项;当 setlocale 时 LC_ALL 优先级最高,其次是个别 LC_* 变量,最后是程序默认的 C locale。实际应用中 locale 对象是"分区"的,LC_CTYPE 与 LC_COLLATE 可独立切换,互不覆盖。
优先级链的要点是 LC_ALL 具有最高优先级,而 LC_* 各分类彼此独立、可单独设置。开发者常误以为 LC_CTYPE 决定一切,实际上排序(LC_COLLATE)与字符分类(LC_CTYPE)由不同分类控制,可分别配置。理解这一点对调试"排序异常"和"字符识别异常"至关重要。