在涉及 setlocale 的部分中,ANSI C 标准在脚注中指出,行为不受当前语言环境影响的唯一 ctype.h 函数是 isdigit 和 isxdigit。
isdigit 的 Microsoft 实现依赖于区域设置,例如,在使用代码页 1250 的区域设置中,isdigit 仅对 0x30 ('0') - 0x39 ('9') 范围内的字符返回非零值,而在使用代码页的区域设置中1252 isdigit 还为上标数字 0xB2 ('²')、0xB3 ('³') 和 0xB9 ('¹') 返回非零值。
Microsoft 通过使 isdigit 区域设置依赖于违反 C 标准吗?
在这个问题中,我主要对微软声称符合的 C90 感兴趣,而不是 C99。
附加背景:
Microsoft 自己的 setlocale 文档错误地指出 isdigit 不受区域设置的 LC_CTYPE 部分的影响。
涵盖 ctype.h 函数的 C 标准部分包含一些我认为模棱两可的措辞:
这些函数的行为受当前语言环境的影响。那些仅在不在“C”语言环境中时才具有特定于语言环境的方面的功能将在下面注明。
我认为这是模棱两可的,因为不清楚它试图对诸如 isdigit 之类的函数说什么,因为它没有关于特定于语言环境的方面的注释。它可能试图说这些函数必须被假定为依赖于语言环境,在这种情况下,微软的 isdigit 实现就可以了。(除了我之前提到的脚注似乎与这种解释相矛盾。)