2010-05-24 28 views
16

在涵蓋setlocale的部分中,ANSI C標準在腳註中聲明,其行爲不受當前語言環境影響的唯一ctype.h函數是isdigit和isxdigit。isdigit合法地取決於語言環境C

isdigit的Microsoft實現與區域設置有關,例如,在使用代碼頁1250的區域設置中,isdigit僅對範圍爲0x30('0') - 0x39('9')的字符返回非零值,而在使用代碼頁1252 isdigit的語言環境對於上標數字0xB2('2'),0xB3('3')和0xB9('1')也返回非零值。

微軟是否違反了C標準,使isdigit語言環境相關?

在這個問題中,我主要感興趣的是微軟聲稱符合的C90,而不是C99。

其他背景:

微軟自己的setlocale的文檔錯誤地指出ISDIGIT是由語言環境的LC_CTYPE部分不受影響。

C標準覆蓋ctype.h函數的部分包含了一些字眼,我認爲含糊:

這些函數的行爲受當前語言環境的影響。下面列出了只有當不在「C」語言環境中時才具有特定於語言環境的那些功能 。

我認爲這是不明確的,因爲它不清楚它想要說的功能,如isdigit,沒有關於區域特定方面的註釋。它可能試圖說這些函數必須被假定爲依賴locale,在這種情況下,微軟對isdigit的實現是可以的。 (除了我之前提到的腳註似乎與此解釋相矛盾。)

回答

6
  1. 微軟永遠是對的。
  2. 如果微軟沒有看到右邊第1項

微軟總是有它的規範的自己的解釋。通常這句話:「但微軟是錯誤的」,不會對你的首席執行官產生任何影響,所以你必須圍繞MS錯誤/解釋進行編碼。

支持IE和Outlook不正確行爲的代碼量是驚人的。

在許多情況下,唯一的辦法就是推出自己的,做正確的事的功能的版本,做這樣的事情:

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

+1非常實用的想法:) – 2010-05-24 16:23:49

4

所需的字符集在第2.2.1節中定義。 2.2.1.2節繼續描述擴展字符的行爲:

  • 應該存在$ 2.2.1中定義的單字節字符。
  • 任何其他成員的存在,含義和表示法是特定於語言環境的。