C と POSIX はどちらも、C/POSIX ロケールに存在する必要がある文字セットは非常に限られていますが、追加の文字が存在することは許可されています。これにより、実装の自由度が大幅に高まります。たとえば、C ロケールですべての Unicode (UTF-8 として) をサポートすることは準拠動作です。ただし、ほとんどの歴史的な実装では、C ロケールは、ISO-8859-1 (Latin-1) または一種の「抽象 8 ビット文字セット」のいずれかの「8 ビットクリーン」シングルバイト文字エンコーディングを持つものとして扱われます。非 ASCII バイトは、特定の ID を持たない抽象文字です。(ただし、後者の場合、コンパイラが を定義する場合__STDC_ISO_10646__
、それらは規範的に Unicode 文字、通常は Latin-1 範囲に対応します。)
あまり一般的ではないように思われる別の準拠オプションは、すべての非 ASCII バイトを非文字として扱うことです。つまり、EILSEQ
エラーで応答します。
私が知りたいのは、C ロケールを実装する際に、これまたはその他の異常なオプションを取る実装があるかどうかです。C ロケールで「上位バイト」を変換しようとするとEILSEQ
、(abstract または Latin-1) シングルバイト文字または UTF-8 として扱われる以外の結果になる実装はありますか?