19

setlocaleをカバーするセクションで、ANSI C標準は脚注で、現在のロケールの影響を受けない動作を持つctype.h関数はisdigitとisxdigitのみであると述べています。

たとえば、コードページ1250を使用するロケールでは、isdigitは0x30( '0')〜0x39( '9')の範囲の文字に対してのみゼロ以外を返すため、isdigitのMicrosoft実装はロケールに依存しますが、コードページを使用するロケールでは1252 isdigitは、上付き数字0xB2('²')、0xB3('³')、および0xB9('¹')に対してもゼロ以外を返します。

isdigitロケールに依存させることにより、MicrosoftはC標準に違反していますか?

この質問では、C99ではなく、Microsoftが準拠していると主張しているC90に主に関心があります。

追加の背景:

Microsoft独自のsetlocaleのドキュメントには、isdigitはロケールのLC_CTYPE部分の影響を受けないと誤って記載されています。

ctype.h関数をカバーするC標準のセクションには、あいまいだと思う言葉が含まれています。

これらの関数の動作は、現在のロケールの影響を受けます。「C」ロケールにない場合にのみロケール固有の側面を持つ関数を以下に示します。

ロケール固有の側面についての注記がないisdigitなどの関数について何を言おうとしているのかが明確でないため、これはあいまいだと思います。このような関数はロケールに依存していると想定する必要があると言っているかもしれません。その場合、Microsoftによるisdigitの実装は問題ありません。(先に述べた脚注がこの解釈と矛盾しているように見えることを除いて。)

4

2 に答える 2

12
  1. マイクロソフトは常に正しいです。
  2. Microsoftが正しくない場合は、項目1を参照してください。

Microsoftは、常に独自の仕様の解釈を持っています。また、通常、「Microsoftは間違っています」という文は、CEOにとって重要ではないため、MSのバグ/解釈をコーディングする必要があります。

IEとOutlookの誤った動作をサポートするコードの量は驚異的です。

多くの場合、唯一の解決策は、正しいことを実行する独自のバージョンの関数をロールして、次のようなことを行うことです。

int my_isdigit( int c )
{
#ifdef WIN32
  your implementation goes here
#else
  return isdigit( c );
#endif
}
于 2010-05-24T16:05:37.837 に答える
5

必要な文字セットはセクション2.2.1で定義されています。次に、セクション2.2.1.2で、拡張文字の動作について説明します。

  • $2.2.1で定義されている1バイト文字が存在する必要があります。
  • 追加メンバーの存在、意味、および表現は、ロケール固有です。
于 2010-05-24T17:07:09.290 に答える