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

时间:2010-05-24 15:48:33

标签: c locale codepages

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

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

通过使isdigit语言环境依赖,Microsoft是否违反了C标准?

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

其他背景:

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

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

  

这些函数的行为受当前语言环境的影响。那些功能   仅当不在“C”语言环境中时才会出现特定于语言环境的方面。

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

2 个答案:

答案 0 :(得分:11)

  1. 微软永远是对的。
  2. 如果Microsoft不正确,请参阅第1项
  3. 微软总是对规范有自己的解释。通常句子“但微软是错误的”对你的CEO没有任何影响,所以你必须围绕MS错误/解释进行编码。

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

    在许多情况下,唯一的解决方案是滚动你自己的函数版本做正确的事情并做这样的事情:

    int my_isdigit( int c )
    {
    #ifdef WIN32
      your implementation goes here
    #else
      return isdigit( c );
    #endif
    }
    

答案 1 :(得分:4)

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

  • $ 2.2.1中定义的单字节字符应存在。
  • 任何其他成员的存在,含义和表示都是特定于语言环境的。