gpt4 book ai didi

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

转载 作者:太空宇宙 更新时间:2023-11-04 09:45:50 25 4
gpt4 key购买 nike

是否可以执行 setlocale(LC_CTYPE, "ru_RU.utf8") 并对字符串“рус eng”的每个符号执行 isaplha() 检查并获得以下结果:

р alphaу alphaс alpha  not alphae not alphan not alphag not alpha

现在当我设置语言环境 ru_RU.utf8 时,除了空格符号之外的所有符号都是 alpha

最佳答案

isalpha 函数询问 the question :

The isalpha() function shall test whether c is a character of class alpha in the program's current locale.

并继续注意:

The c argument is an int, the value of which the application shall ensure is representable as an unsigned char or equal to the value of the macro EOF. If the argument has any other value, the behavior is undefined.

这意味着它只适用于 ascii 字符。

测试几乎是 [A-Z][a-z] 范围内的字符,仅此而已。

不,如果你想测试这个范围之外的字符,那么你需要使用宽字符变体之一,例如 iswalpha .

您似乎在问,您是否可以执行一个测试来拒绝不是明确的西里尔字母的字符?这不适用于 iswalpha() 测试,因为它假定几乎所有字符集中的 所有 字母字符都是字母字符 - 如果您阅读 ru_RU 的语言环境定义( glibc 源 localedata/locales/ru_RU ),它使用 i18n文件作为字符类型的数据源决定了什么被认为是 alpha。

如果输入数据真的只有from the russian alphabet , 那么你可以检查这个字符是否是非 ascii 字符,如果是这样就接受它作为一个有效字符;不幸的是,很有可能输入了一些字符,例如е(即 CYRILLIC SMALL LETTER IE Unicode:U+0435,UTF-8:D0 B5)将使用拉丁字符 e(即 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>;/

关于linux - 我可以使用 setlocale() 和 isalpha() 来确定字符是否属于当前语言环境的字母表吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16436397/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com