C如何判断一个字符是小写(islower还是isupper)?

问题描述 投票:0回答:1

我正在 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

c regex linux character non-ascii-characters
1个回答
0
投票

根据locale确定小写字母通常是在编译之前确定的。 C 没有提供标准方法来更改 locale's 确定。

区域设置可能会随着

char *setlocale(int category, const char *locale);

而改变

至少定义 2 个语言环境:

  1. "C"
    :最小的 C 环境。 这在规范中用
    'a' - 'z'
    定义,没有其他内容,为小写字母。

  2. ""
    :实现的本机环境。

因此

islower()
的行为可以在程序运行期间发生变化。

© www.soinside.com 2019 - 2024. All rights reserved.