我正在 Debian Linux 上的 bash 中研究 GNU tr。正则表达式引擎似乎有 [:lower:] 和 [:upper:] 简写。正则表达式匹配“小写”和“大写”字母。这些的定义并不简单:
Ñ
是大写字母吗? (示例此处。)
不知何故,它似乎映射到 C 语言中定义的“islower”函数。
https://en.cppreference.com/w/c/string/byte/islower
http://web.archive.org/web/20120308171350/https://cplusplus.com/reference/clibrary/cctype/islower/
请注意,什么被视为字母可能取决于所使用的区域设置;在默认的 C 语言环境中,小写字母可以是以下任意一个:a b c def g hi j k l m no p q r s t u v w x y z。
有关不同 ctype 函数为标准 ANSII 字符集的每个字符返回的详细图表,请参阅标题参考。
https://github.com/coreutils/coreutils/blob/1f0bf8d7c4b7131c6a8762de02ea01affef4db65/src/tr.c#L392
我找不到 islower 的定义位置,可能是在特定的 C 实现中(例如
gcc
)。
它似乎也取决于“区域设置”。这是在编译时发生还是在运行时发生? https://docs.oracle.com/cd/E19253-01/817-2521/overview-1002/index.html
根据locale确定小写字母通常是在编译之前确定的。 C 没有提供标准方法来更改 locale's 确定。
区域设置可能会随着
char *setlocale(int category, const char *locale);
而改变
至少定义 2 个语言环境:
"C"
:最小的 C 环境。 这在规范中用 'a' - 'z'
定义,没有其他内容,为小写字母。
""
:实现的本机环境。
因此
islower()
的行为可以在程序运行期间发生变化。