在涉及setlocale的部分,ANSI C标准在一个脚注中指出,当前语言环境不会影响的ctype.h函数只有isdigit和isxdigit。
由于在使用代码页面1250的语言环境中,isdigit仅对范围在0x30('0')- 0x39('9')之间的字符返回非零值,而在使用代码页1252的语言环境中,isdigit还会对上标数字0xB2('²'),0xB3('³')和0xB9('¹')返回非零值,因此Microsoft实现的isdigit是与语言环境相关的。
通过使isdigit与语言环境相关,Microsoft是否违反了C标准?
在这个问题中,我主要关心的是C90,因为Microsoft声称符合它,而不是C99。
附加背景:
Microsoft自己的setlocale文档错误地声明isdigit不受语言环境的LC_CTYPE部分的影响。
涵盖ctype.h函数的C标准部分包含一些我认为模棱两可的措辞:
这些函数的行为受当前语言环境的影响。那些仅在非“C”语言环境下具有特定地区性方面的功能如下所示。
我认为这是模棱两可的,因为不清楚它试图说isdigit这样的函数的情况,对于这些函数没有区域特定方面的注释。它可能试图说这样的函数必须假定是与语言环境相关的,在这种情况下,Microsoft的isdigit实现将是可以接受的。(除了我之前提到的脚注似乎与此解释相矛盾。)
由于在使用代码页面1250的语言环境中,isdigit仅对范围在0x30('0')- 0x39('9')之间的字符返回非零值,而在使用代码页1252的语言环境中,isdigit还会对上标数字0xB2('²'),0xB3('³')和0xB9('¹')返回非零值,因此Microsoft实现的isdigit是与语言环境相关的。
通过使isdigit与语言环境相关,Microsoft是否违反了C标准?
在这个问题中,我主要关心的是C90,因为Microsoft声称符合它,而不是C99。
附加背景:
Microsoft自己的setlocale文档错误地声明isdigit不受语言环境的LC_CTYPE部分的影响。
涵盖ctype.h函数的C标准部分包含一些我认为模棱两可的措辞:
这些函数的行为受当前语言环境的影响。那些仅在非“C”语言环境下具有特定地区性方面的功能如下所示。
我认为这是模棱两可的,因为不清楚它试图说isdigit这样的函数的情况,对于这些函数没有区域特定方面的注释。它可能试图说这样的函数必须假定是与语言环境相关的,在这种情况下,Microsoft的isdigit实现将是可以接受的。(除了我之前提到的脚注似乎与此解释相矛盾。)
<ctype.h>
中的东西,因为它要求你对发送给它的所有内容进行清理。相应地,我会使用ICU的u_isalpha()
和u_isUAlphabetic()
。 - Dúthomhas