我可以使用setlocale()和isalpha()来确定字符是否属于当前语言环境的字母表吗?

时间:2013-05-08 08:52:29

标签: linux unix posix locale setlocale

是否可以执行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

1 个答案:

答案 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>;/