[38] 
[DFN[同型符号化]]、[DFN[同型復号]]は、
[[文字列]]と[[バイト列]]との形式的な変換操作です。

[39] 
[[インターネット]]で使われる[[プロトコル]]の多くは、
伝統的に[[プロトコル要素]]の色々な部分で
[[ASCII]] を使っています。
しかし[[ネットワーク]]に直接転送されるのは[[バイト列]]であって、
[[文字列]]とは異なっています。
これを変換するのが[[同型符号化]]、[[同型復号]]の操作です。

[40] 
実装上これがどう扱われるかは時と場合によります。

[EG[
[41] 例えば [[HTTP]] の
[CODE[Content-Type]] [[ヘッダー]]を設定する、
という操作の場合、
[[バイト列]]の[[データ型]]のある[[プログラミング言語]]では、
[CODE[Content-Type]] という[[バイト列]]を直接[[リテラル]]として記述すれば、
変換操作は不要です。
]EG]

[EG[
[42] 
指定された値を[[パーセント符号化]]してから[[バイト列]]として送出する、
という操作の場合、
[[パーセント符号化]]の結果は[[文字列]] ([[ASCII文字列]]) なので、
[[ASCII文字列]]の[[データ型]]のある[[プログラミング言語]]なら[[バイト列]]に[[型キャスト]]すれば使えるかもしれませんし、
[[Unicode文字列]]の[[データ型]]しかない[[プログラミング言語]]なら
[[UTF-8符号化]]する必要があるかもしれません。
]EG]

* 仕様書

[REFS[
- [2] [CITE@en[Infra Standard]] ([TIME[2017-08-17 16:48:46 +09:00]]) <https://infra.spec.whatwg.org/#isomorphic-encode>
- [10] [CITE@en[Infra Standard]] ([TIME[2017-08-17 16:48:46 +09:00]]) <https://infra.spec.whatwg.org/#isomorphic-decode>
]REFS]

* 演算

[3] [[文字列]][VAR[データ]]の[DFN[[RUBYB[同型符号化]@en[isomorphic encode]]]]は、
次のようにします [SRC[>>2]]。

[FIG(steps)[
= [4] [VAR[出力]]を、新しい[[空バイト列]]に設定します。
= [5] [VAR[データ]]の各[[符号位置]][VAR[符号位置]]について、順に、
== [6] [VAR[出力]]の末尾に、値が[VAR[符号位置]]の[[バイト]]を追加します。
= [7] [VAR[出力]]を返します。
]FIG]

;; [8] この[[演算]]は、[VAR[データ]]が [CODE[U+0100]] [[以上]]の[[符号位置]]を含ま''ない''ときにしか使えません。

[28] [DFN[[RUBYB[ASCII符号化]@en[ASCII encode]]]]は、
[[ASCII文字列]]に対する[[同型符号化]]です [SRC[>>2]]。

;; [29] この[[演算]]は、[VAR[データ]]が [CODE[U+0080]] [[以上]]の[[符号位置]]を含ま''ない''ときにしか使えません。

-*-*-

[11] [[バイト列]][VAR[データ]]の[DFN[[RUBYB[同型復号]@en[isomorphic decode]]]]は、
次のようにします [SRC[>>10]]。

[FIG(steps)[
= [12] [VAR[出力]]を、新しい[[空文字列]]に設定します。
= [13] [VAR[データ]]の各[[バイト]][VAR[バイト]]について、順に、
== [14] [VAR[出力]]の末尾に、値が[VAR[バイト]]の[[符号位置]]を追加します。
= [15] [VAR[出力]]を返します。
]FIG]

[30] [DFN[[RUBYB[ASCII復号]@en[ASCII decode]]]]は、
[[ASCIIバイト]][[列][バイト列]]に対する[[同型復号]]です [SRC[>>10]]。

;; [31] この[[演算]]は、[VAR[データ]]が [CODE[0x80]] [[以上]]の[[バイト]]を含ま''ない''ときにしか使えません。

* 文脈

[18] [[同型符号化]]は、次の場面で使われています。

[FIG(short list)[ [19] [[同型符号化]]の[[応用]]
- [CODE[btoa]]
- [[MIME型をバイト列に符号化]]
- [CODE[Content-Length]]
- [CODE[Referer:]]
- [CODE[Location:]]
- [CODE[Sec-WebSocket-Key:]]
]FIG]

[20] この他に、[[仕様書]]では[[UTF-8符号化]]や[[UTF-8復号]]となっていても、
実質的に[[同型符号化]]や[[同型復号]]を表していることがあります。

[22] [[同型復号]]の用法は、[[復号][復号 (符号化)]]も参照。

[44] [[TypedArray]] の歴史の項も参照。

* 関連

[45] [[UTF-8符号化されたバイト列]]

[43] 
[[Unicode]] で[[制御文字]]を使う方法は[[同形復号]]的に定義されています。
[SEE[ [[制御文字]] ]]


* 歴史

[1] [CITE@en[Define isomorphic encode and decode]]
([[annevk]]著, [TIME[2017-08-16 01:53:57 +09:00]])
<https://github.com/whatwg/infra/commit/8d7447e5462f2cd104b7bbe7a719227be80921cf>

[16] [CITE@en[byte sequence <> string by annevk · Pull Request #146 · whatwg/infra]] ([TIME[2017-08-24 17:57:05 +09:00]]) <https://github.com/whatwg/infra/pull/146>

[17] 実装によっては [[ISO 8859-1]] や [[Latin1]] という名称の[[文字コード]]としてこの[[符号化]]と[[復号]]が実装されていることがありますが、
その意味には混乱があるため (例えば [[Web]] では [[Windows-1252]] の意)、
[[演算]]名に使うことは避けられているようです。

[21] [CITE@en[Define the HTTP Refresh header]]
([[annevk]]著, [TIME[2017-08-10 01:57:03 +09:00]])
<https://github.com/whatwg/html/commit/7e9f6b6ffe2119f43f909f71773a25a7e8a61ca7>

[23] [CITE@en[28339 – <meta refresh> Specify Refresh HTTP header]]
([TIME[2017-08-29 00:18:05 +09:00]])
<https://www.w3.org/Bugs/Public/show_bug.cgi?id=28339>

[24] [CITE@en[Allow Range header to be set by APIs]]
([[jakearchibald]]著, [TIME[2018-05-30 02:00:06 +09:00]])
<https://github.com/whatwg/fetch/commit/819d8c9d6617986a831ecd9cf21c34ba9589a890>

[25] [CITE@en[Editorial: replace UTF-8 encode with isomorphic encode]]
([[annevk]]著, [TIME[2018-05-28 21:03:01 +09:00]])
<https://github.com/whatwg/fetch/commit/ffbaefb5c4f68b9d619e9db6491fd665a30a2ffb>

[26] [CITE@en[Editorial: replace UTF-8 encode with isomorphic encode by annevk · Pull Request #742 · whatwg/fetch]]
([TIME[2018-06-02 09:00:47 +09:00]])
<https://github.com/whatwg/fetch/pull/742>

[27] [CITE@en[Add ASCII encode and decode algorithms]]
([[jyasskin]]著, [TIME[2018-07-31 02:48:57 +09:00]])
<https://github.com/whatwg/infra/commit/1d200b6e6f1d34114f18a4faaedd189291cf621f>

[32] [CITE@en[Add ASCII encode and decode algorithms. by jyasskin · Pull Request #209 · whatwg/infra]]
([TIME[2018-08-05 13:56:43 +09:00]])
<https://github.com/whatwg/infra/pull/209>

[33] [CITE@en[Add ASCII encode and decode algorithms. by jyasskin · Pull Request #209 · whatwg/infra]]
([TIME[2018-08-05 13:57:10 +09:00]])
<https://github.com/whatwg/infra/pull/209>

[34] [CITE@en[Editorial: use "isomorphic decode" for Refresh header steps]]
([[irrationalRock]]著, [TIME[2018-08-23 22:25:10 +09:00]])
<https://github.com/whatwg/html/commit/bef6f783084cdb6e591f2a9d8c731180413e8ef2>

[35] [CITE@en[Use "isomorphic decode" explicitly for Refresh headers · Issue #3924 · whatwg/html]]
([TIME[2018-09-04 16:38:15 +09:00]])
<https://github.com/whatwg/html/issues/3924>

[36] [CITE@en[Changed Comment to Mention "isomorphic decode" by irrationalRock · Pull Request #3941 · whatwg/html]]
([TIME[2018-09-04 16:38:43 +09:00]])
<https://github.com/whatwg/html/pull/3941>

[37] [CITE@en[Change query state slightly to better deal with non-UTF-8 encodings]]
([[annevk]]著, [TIME[2018-05-09 17:55:15 +09:00]])
<https://github.com/whatwg/url/commit/f0e4390bf882446445e944215524ff3877aac95a>