Can isdigit合法地是依赖于C的语言环境

cde*_*dev 18 c locale codepages

在涉及setlocale的部分中,ANSI C标准在脚注中指出,其行为不受当前语言环境影响的唯一ctype.h函数是isdigit和isxdigit.

isdigit的Microsoft实现依赖于语言环境,因为,例如,在使用代码页1250的语言环境中,isdigit仅对0x30('0') - 0x39('9')范围内的字符返回非零值,而在使用代码页的语言环境中对于上标数字0xB2('²'),0xB3('³')和0xB9('¹'),1252 isdigit也返回非零值.

Microsoft是否依赖于isdigit语言环境违反了C标准?

在这个问题中,我主要对C90感兴趣,C90是微软声称要遵守的,而不是C99.

附加背景:

Microsoft自己的setlocale文档错误地指出isdigit不受语言环境的LC_CTYPE部分的影响.

涵盖ctype.h函数的C标准部分包含一些我认为含糊不清的措辞:

这些函数的行为受当前语言环境的影响.下面将说明仅在不在"C"语言环境中时具有语言环境特定方面的那些函数.

我认为这是模棱两可的,因为不清楚它是什么试图说的isdigit这样的函数,没有关于locale特定方面的注释.它可能试图说这些函数必须假定依赖于语言环境,在这种情况下,Microsoft的isdigit实现就可以了.(除了我之前提到的脚注似乎与这种解释相矛盾.)

Ale*_*yak 12

  1. 微软永远是对的.
  2. 如果微软不对,请参阅第1项

微软总是对规范有自己的解释.通常句子"但微软是错的"对你的CEO没有任何重视,所以你必须围绕MS错误/解释进行编码.

支持IE和Outlook错误行为的代码量是惊人的.

在许多情况下,唯一的解决方案是滚动您自己的函数版本,该函数执行正确的操作并执行以下操作:

int my_isdigit( int c )
{
#ifdef WIN32
  your implementation goes here
#else
  return isdigit( c );
#endif
}
Run Code Online (Sandbox Code Playgroud)


Han*_*ant 5

所需的字符集在第 2.2.1 节中定义。然后第 2.2.1.2 节继续描述扩展字符的行为:

  • 应存在 $2.2.1 中定义的单字节字符。
  • 任何附加成员的存在、含义和表示都是特定于区域设置的。