【问题标题】:Can isdigit legitimately be locale dependent in Cisdigit 可以合法地依赖于 C 语言中的语言环境吗
【发布时间】:2010-05-24 15:48:32
【问题描述】:

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

isdigit 的 Microsoft 实现取决于区域设置,例如,在使用代码页 1250 的区域设置中,isdigit 仅对 0x30 ('0') - 0x39 ('9') 范围内的字符返回非零值,而在区域设置中使用代码页 1252 isdigit 还会为上标数字 0xB2 ('²')、0xB3 ('³') 和 0xB9 ('¹') 返回非零值。

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

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

附加背景:

Microsoft 自己的 setlocale 文档错误地指出 isdigit 不受区域设置的 LC_CTYPE 部分的影响。

涵盖 ctype.h 函数的 C 标准部分包含一些我认为模棱两可的措辞:

这些函数的行为受当前语言环境的影响。那些功能 仅当不在“C”语言环境中时才具有特定于语言环境的方面,如下所述。

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

【问题讨论】:

    标签: c locale codepages


    【解决方案1】:
    1. 微软永远是对的。
    2. 如果 Microsoft 不正确,请参阅第 1 项

    Microsoft 始终对规范有自己的解释。通常,“但微软错了”这句话对你的 CEO 没有任何影响,所以你必须围绕 MS 错误/解释编写代码。

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

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

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

    【讨论】:

      【解决方案2】:

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

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

      【讨论】:

        猜你喜欢
        • 2014-04-24
        • 1970-01-01
        • 2010-12-28
        • 1970-01-01
        • 1970-01-01
        • 2019-06-25
        • 2014-07-03
        • 2013-06-14
        • 1970-01-01
        相关资源
        最近更新 更多