是否可以执行setlocale(LC_CTYPE,“ru_RU.utf8”)并对字符串“русeng”的每个符号执行isaplha()检查并获取以下结果:
р alpha у alpha с alpha not alpha e not alpha n not alpha g not alpha
现在当我设置区域设置ru_RU.utf8时,除空格符号外的所有符号都是alpha
答案 0 :(得分:2)
isalpha
函数询问the question:
isalpha()函数应测试c是否是程序当前语言环境中的alpha类字符。
继续注意:
c参数是一个int,应用程序应确保的值可以表示为unsigned char或等于宏EOF的值。如果参数具有任何其他值,则行为未定义。
这意味着它仅适用于ascii字符。
测试几乎是范围[A-Z]
或[a-z]
中的字符,仅此而已。
Noe如果您想测试此范围之外的字符,则需要使用其中一种宽字符变体,例如iswalpha。
您问的是,您是否可以执行拒绝不是明确的西里尔字母字符的测试?这不适用于iswalpha()
测试,因为它假定几乎所有字符集中的所有字母字符都是字母字符 - 如果您读取了ru_RU的语言环境定义(glibc source {{3 }}),它使用localedata/locales/ru_RU
文件,因为它的字符类型的数据源决定什么是alpha。
如果输入数据真的只是i18n
,那么您可以检查该字符是否为非ascii,如果是这种情况,则将其作为有效字符接受;不幸的是,很有可能会输入一些字符,例如将使用拉丁字符е
输入e
(即CYRILLIC SMALL LETTER IE Unicode:U + 0435,UTF-8:D0 B5)(即LATIN SMALL LETTER E Unicode:U + 0065,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>;/