[13] ASCII との互換性が求められることがしばしばあります。 何をもって互換というかには色々な解釈があります。
[36] 似て非なる定義がいくつかあって、 それらの意味も不明瞭なところがあり、 混乱の元となるのでこうした用語は使うべきではないのかもしれません。
[2] ASCII 互換文字符号化とは、ある程度 ASCII と互換性のある文字符号化方式を表す HTML 仕様上の用語です。
[3] 単一バイトまたは可変長の符号化であって、 0x09, 0x0A, 0x0C, 0x0D, 0x20 - 0x22, 0x26, 0x27, 0x2C - 0x3F, 0x41 - 0x5A, 0x61 - 0x7A の範囲の第1バイトがすべて Windows-1252 と同じ Unicode文字を表すものをASCII互換文字符号化といいます。 >>1
[4] この定義だと ISO-2022-JP や HZ-GB-2312 は ASCII 非互換のように思えますが、 仕様書の注釈によってこれらは ASCII 互換に含まれるとされています。
[5] 同じく注釈によると UTF-16、UTF-7、GSM03.38、EBCDIC は非互換とされています。
[7] Encoding Standard の範囲では、 UTF-16 (utf-16be と utf-16) と replacement 以外はすべて ASCII互換文字符号化です。
[37] ISO/IEC 646の版は ASCII互換文字符号化です。 (おそらく意図的にそう定義されているのでしょう。)
[12] Remove allow non-ASCII-compatible encodings flag · whatwg/html@c485b70 ( 版) https://github.com/whatwg/html/commit/c485b70bfe41ed1302c451bc62b58df80cffd325
[10] RFC 7617 は、基本認証における「US-ASCIIと互換」を、 US-ASCII の文字が US-ASCII の文字コードと同じ1バイトに写像されるもの >>9 と定義しています。 ASCII互換文字符号化より厳しい制約です。
[14] Ruby におけるASCII互換エンコーディングは、
US-ASCII に含まれる文字を \x00-\x7F で表し、ロッキングシフトを用いない エンコーディング
です。 >>15
[16] 具体例として shift_jis や EUC-JP や UTF-8 が挙げられています。 また、逆に ASCII 互換でないエンコーディングの例として、 ISO-2022-JP や UTF-16 が挙げられています。 >>15
[17] 通常の ISO-2022-JP は ASCII を [ 0x00, 0x7F ] で表し、固定シフトを用いないので、 ASCII互換エンコーディングの定義に当てはまりそうですが、 そうではないと説明されています。「ロッキングシフト」は ISO/IEC 2022 の定める通常の意味とは違って、指示シーケンスなどの状態遷移を行うもの全般を指すのかもしれません。
[18] shift_jis がASCII互換エンコーディングであると明記されていることから、 ASCII文字以外が [ 0x00, 0x7F ] を使うことは定義に反しないようです。
[19] また、「Ruby のエンコーディングのサポート水準」 として、
... の3段階があります。ここで、 ASCII互換ではないエンコーディングには UTF-16BE や UTF-16LE が含まれ、 ダミーエンコーディングには ISO-2022-JP や UTF-7 が含まれます。 >>15
[23] ダミーエンコーディングとは
Ruby が名前を知っているが、 文字の列としての処理に対応していないエンコーディングのことです。 実際には ISO-2022-JP や UTF-7 のようなステートフルエンコーディングがダミーエンコーディングになります。
と説明されています。 >>15
[24] つまり、ASCII互換ではないエンコーディングは広義にはダミーエンコーディングを含み、 狭義には含まないということのようです。
[26]
Ruby には ASCII-8BIT
という名前のエンコーディングがあり、
Ruby の String は、文字の列を扱うためだけでなく、バイトの列を扱うためにも使われます。 しかし、Ruby M17N には直接にバイナリを表すエンコーディングは存在しません。 このため、バイナリを String で扱う際には、ASCII 互換オクテット列を意味する ASCII-8BIT を用います。
と説明されています。 >>15
[27]
つまりASCII互換エンコーディングの中に一般の文字符号化に相当するエンコーディングに加えて、
ASCII互換オクテット列 = ASCII-8BIT
なるバイナリーデータのためのエンコーディングがあります。
[34] 7ビットクリーンなる語が ASCII互換と似たような (しかし同じとも限らない) 意味で使われることがあるようです。
[29] Ruby のドキュメントには次のような説明があります。 >>15
ASCII互換エンコーディングである文字列や正規表現は、7bit クリーンな文字列や正規表現と、 結合・比較・マッチ等を行うことができます。
7bit クリーンな文字列
ASCII 互換エンコーディングをもつ 7bit クリーンな文字列は、 他の ASCII 互換エンコーディングを持つ文字列と結合・比較が可能です。 例えば、ASCII 互換エンコーディングをもつ文字列に、 7bit クリーンな文字列をエンコーディングの変換なしで結合することができます。 また、通常 Ruby の文字列比較メソッドである String#== は、 2 つの文字列のエンコーディングが異なっていると、バイト列としては一致していても false を返します。 しかし、7bit クリーンな文字列同士の比較の際は、 両者の文字エンコーディングが異なっていても、バイト列として一致していれば true を返します。
このため、バイナリを String で扱う際には、ASCII 互換オクテット列を意味する ASCII-8BIT を用います。 これにより、ASCII 互換であるこの String は 7bit クリーンな文字列と比較・結合が可能となります。
ダミーエンコーディングを持つ文字列の扱いは以下のように制限されます。
- エンコーディングの異なる 7bit クリーンな文字列との結合ができません。 例外 (EncodingCompatibilityError) が発生します。
[30] この説明から何が7bit クリーンな文字列の定義であるのかははっきりしませんが、 どうやら非ASCII文字を含まないことは最低条件であると思われます。
[32] >>31 は Python でインターネットメールを扱うライブラリーの説明であり、
Content-Transfer-Encoding の 7bit の説明で
all data must be "7 bit clean" (ASCII-only).
とあります。すなわち 7 bit clean とは ASCII のみであることを意味すると説明されています。
[33] ただし、 MIME の 7bit は ASCII のみであることを意味しているのではなく、
7ビットのバイトで構成され、改行文字などの要件を満たしていることを意味しています。
この乖離が当該ライブラリーの機能に関係する正しい説明なのか、
ドキュメントの筆者の知識不足による誤った解説なのかは不明です。
+などが条件に合致しないのでしょう。