7-bit clean

7-bit clean

[13] ASCII との互換性が求められることがしばしばあります。 何をもって互換というかには色々な解釈があります。

[36] 似て非なる定義がいくつかあって、 それらの意味も不明瞭なところがあり、 混乱の元となるのでこうした用語は使うべきではないのかもしれません。

ASCII 互換文字符号化 (Web)

[2] ASCII 互換文字符号化 (ASCII-compatible character encoding) とは、ある程度 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-JPHZ-GB-2312 は ASCII 非互換のように思えますが、 仕様書の注釈によってこれらは ASCII 互換に含まれるとされています。

[5] 同じく注釈によると UTF-16UTF-7GSM03.38EBCDIC は非互換とされています。

[6] >>4 が含まれるなら UTF-7 も ASCII 互換に含まれていいようなものですが、 + などが条件に合致しないのでしょう。

[7] Encoding Standard の範囲では、 UTF-16 (utf-16beutf-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

US-ASCII と互換 (HTTP)

[10] RFC 7617 は、基本認証における「US-ASCIIと互換」を、 US-ASCII文字US-ASCII文字コードと同じ1バイトに写像されるもの >>9 と定義しています。 ASCII互換文字符号化より厳しい制約です。

[11] こちらの定義でも ISO-2022-JPEUC-JPEncoding Standardshift_jisASCII互換です。 HZ-GB-2312UTF-7ASCII互換ではありません。

ASCII 互換エンコーディング (Ruby)

[14] Ruby におけるASCII互換エンコーディングは、

US-ASCII に含まれる文字を \x00-\x7F で表し、ロッキングシフトを用いない エンコーディング

です。 >>15

[16] 具体例として shift_jisEUC-JPUTF-8 が挙げられています。 また、逆に ASCII 互換でないエンコーディングの例として、 ISO-2022-JPUTF-16 が挙げられています。 >>15

[17] 通常の ISO-2022-JPASCII を [ 0x00, 0x7F ] で表し、固定シフトを用いないので、 ASCII互換エンコーディングの定義に当てはまりそうですが、 そうではないと説明されています。「ロッキングシフト」は ISO/IEC 2022 の定める通常の意味とは違って、指示シーケンスなどの状態遷移を行うもの全般を指すのかもしれません。

[18] shift_jisASCII互換エンコーディングであると明記されていることから、 ASCII文字以外が [ 0x00, 0x7F ] を使うことは定義に反しないようです。

[19] また、「Ruby のエンコーディングのサポート水準」 として、

... の3段階があります。ここで、 ASCII互換ではないエンコーディングには UTF-16BEUTF-16LE が含まれ、 ダミーエンコーディングには ISO-2022-JPUTF-7 が含まれます。 >>15

[23] ダミーエンコーディングとは

Ruby が名前を知っているが、 文字の列としての処理に対応していないエンコーディングのことです。 実際には ISO-2022-JP や UTF-7 のようなステートフルエンコーディングがダミーエンコーディングになります。

と説明されています。 >>15

[24] つまり、ASCII互換ではないエンコーディングは広義にはダミーエンコーディングを含み、 狭義には含まないということのようです。

[25] ASCII互換かどうかは構造に基づく名称で、 ダミーかどうかは Ruby の実装上の状態に基づく名称で、 2つの異なる評価軸が混ざって用語定義が難しくなっています。

[26] Ruby には ASCII-8BIT という名前のエンコーディングがあり、

Ruby の String は、文字の列を扱うためだけでなく、バイトの列を扱うためにも使われます。 しかし、Ruby M17N には直接にバイナリを表すエンコーディングは存在しません。 このため、バイナリを String で扱う際には、ASCII 互換オクテット列を意味する ASCII-8BIT を用います。

と説明されています。 >>15

[27] つまりASCII互換エンコーディングの中に一般の文字符号化に相当するエンコーディングに加えて、 ASCII互換オクテット列 = ASCII-8BIT なるバイナリーデータのためのエンコーディングがあります。

[28] 任意のバイナリーデータASCII互換かどうか定かではないわけで、 「ASCII互換オクテット列」 とみなすべきものはプログラム開発者が ASCII互換と認識しているデータだけのはずであって、 ASCII互換ではないバイナリーデータとは分けて扱う必要がありそうですが、 そのあたりがどうモデル化されているのかはこのドキュメントからは明らかではありません。

7ビットクリーン

[34] 7ビットクリーンなる語が ASCII互換と似たような (しかし同じとも限らない) 意味で使われることがあるようです。

[35] 8ビットクリーンという語がよく使われますが、これは通信路の性質を表すもので、 まったく用法が異なります。しかしどちらも ASCII と関係が深い言葉であり、 もしかすると7ビットクリーン8ビットクリーンからの連想で作られた言葉かもしれません。 しかし、7ビットクリーンという言葉はほとんど聞きませんし、 どのへんに「クリーン」さを感じて使っている語なのかもいまいちはっきりしません。 多用される8ビットクリーンとの対比になっていないわかりにくい語なので、 使うべきではないでしょう。

[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] >>31Pythonインターネットメールを扱うライブラリーの説明であり、 Content-Transfer-Encoding7bit の説明で

all data must be "7 bit clean" (ASCII-only).

とあります。すなわち 7 bit clean とは ASCII のみであることを意味すると説明されています。

[33] ただし、 MIME7bitASCII のみであることを意味しているのではなく、 7ビットバイトで構成され、改行文字などの要件を満たしていることを意味しています。 この乖離が当該ライブラリーの機能に関係する正しい説明なのか、 ドキュメントの筆者の知識不足による誤った解説なのかは不明です。

ACE (ドメイン名)

[8] IDNACE は、 UnicodeDNS 等のために ASCII文字に変換する手法です。 ACE

関連