isdigit 可以合法地依赖于 C 语言环境吗

标签 c locale codepages

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

Microsoft 的 isdigit 实现依赖于语言环境,因为例如,在使用代码页 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 标准部分包含一些我认为有歧义的措辞:

The behavior of these functions is affected by the current locale. Those functions that have locale-specific aspects only when not in the "C" locale are noted below.

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

最佳答案

  1. Microsoft 永远是对的。
  2. 如果 Microsoft 不正确,请参阅第 1 项

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

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

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

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

关于isdigit 可以合法地依赖于 C 语言环境吗,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2898228/

相关文章:

C++ 文件字符编码

c - 为什么 setlocale 给我?而不是普通的字母?

C 拆分位

C: 函数 ‘vsyslog’ 的隐式声明

c - Sizeof 运算符返回不正确的大小?

java - 如何使用 DateFormat 和 NumberFormat 为几个不同的区域设置输出相同的日期、数字、价格和百分比?

delphi - 将字符串从某些代码页转换为Unicode

c - Mongo C 驱动程序通过 _id 访问文档

android - 在 Android 中以编程方式更改应用程序中的语言

R,Rstudio 控制台编码窗口