是否可以执行 setlocale(LC_CTYPE, "ru_RU.utf8") 并对字符串 "рус eng" 的每个符号执行 isaplha() 检查并获得以下结果:
р 阿尔法 你阿尔法 α 不是阿尔法 e不是阿尔法 n 不是阿尔法 g 不是阿尔法
现在,当我设置语言环境 ru_RU.utf8 时,除空格符号外的所有符号都是 alpha
该isalpha
函数提出问题:
isalpha() 函数将测试 c 是否是程序当前语言环境中的 alpha 类字符。
并继续注意:
c 参数是一个 int,应用程序应确保其值可表示为无符号字符或等于宏 EOF 的值。如果参数有任何其他值,则行为未定义。
这意味着它仅适用于 ascii 字符。
测试几乎是范围内的字符[A-Z]
或[a-z]
,仅此而已。
不,如果您想测试超出此范围的字符,则需要使用宽字符变体之一,例如iswalpha。
看起来你要问的是你是否可以执行一个测试来拒绝不是明确的西里尔字母的字符?这不适用于iswalpha()
测试,因为它假定几乎所有字符集中的所有字母字符都是字母字符 - 如果您阅读 ru_RU (glibc 源)localedata/locales/ru_RU
的语言环境定义,它使用i18n
文件作为字符类型的数据源确定什么被认为是一个阿尔法。
如果输入数据确实仅来自俄罗斯字母表,那么您可以检查该字符是否为非 ascii,如果是这种情况,则将其作为有效字符接受;不幸的是,很有可能使用拉丁字符(即 LATIN SMALL LETTER E Unicode: U+0065 )输入某些键入的字符,例如е
(即西里尔小写字母 IE Unicode:U+0435,UTF-8:D0 B5)e
, UTF-8: 65) 等将被此测试遗漏。
如果要显式测试这些西里尔字符,则需要测试字符范围:
% CYRILLIC/
<U0400>..<U042F>;<U0460>..(2)..<U047E>;/
<U0480>;<U048A>..(2)..<U04BE>;<U04C0>;<U04C1>..(2)..<U04CD>;/
<U04D0>..(2)..<U04FE>;/
% CYRILLIC SUPPLEMENT/
<U0500>..(2)..<U0522>;/
% CYRILLIC SUPPLEMENT 2/
<UA640>..(2)..<UA65E>;<UA662>..(2)..<UA66C>;<UA680>..(2)..<UA696>;/
% CYRILLIC/
<U0430>..<U045F>;<U0461>..(2)..<U047F>;/
<U0481>;<U048B>..(2)..<U04BF>;<U04C2>..(2)..<U04CE>;/
<U04CF>;/
<U04D1>..(2)..<U0523>;/
% CYRILLIC SUPPLEMENT 2/
<UA641>..(2)..<UA65F>;<UA663>..(2)..<UA66D>;<UA681>..(2)..<UA697>;/