[7] [DFN[[RUBYB[[[文字符号化]]]@en[character encoding]]]]は、
[[文字]]を[[符号化]]する一連の規則の集合です。
「[[文字コード]]」と同じように曖昧に使われていますが、
「[[文字コード]]」とは違って単一の[[文字]]の[[符号化]]を指すことはあまりなく、
[[符号化]]の方式全体を指しているようです。

* 仕様書

[REFS[
- [14] [CITE@en-US[Encoding Standard]] ([TIME[2016-04-27 20:46:26 +09:00]] 版) <https://encoding.spec.whatwg.org/>
-- [15] [CITE@en-US[Encoding Standard]] ([TIME[2016-07-29 16:12:31 +09:00]]) <https://encoding.spec.whatwg.org/#encodings>
]REFS]

* 意味

[16] [DFN[[RUBYB[符号化]@en[encoding]]]]は、
[[スカラー値][Unicodeスカラー値]]の[[列]]から[[バイト列]]へ
(やその逆方向) の[[写像]]を定義するものです [SRC[>>15]]。

* 特性

[8] [[文字符号化]]は、次のような[[特性]]を持ちます。

[FIG(members list)[
: [F[名前][符号化名]] : [[Encoding Standard]] において[[符号化][文字符号化]]を識別する文字列です。
[[符号化][文字符号化]]は、[F[名前]]を1つ持ちます [SRC[>>15]]。
: [F[[[ラベル][符号化ラベル]]群]] : [[Encoding Standard]] において[[符号化][文字符号化]]に紐付けられた文字列群です。
[[符号化][文字符号化]]は、[[ラベル][符号化ラベル]]を1つ[[以上]]持ちます [SRC[>>15]]。
: [F[[[符号化器]]クラス]] :
: [F[[[復号器]]クラス]] :
]FIG]

[9] [[文字符号化]]には次のような分類があります。

[FIG(list short)[
- [[ASCII互換文字符号化]]
- [[レガシー符号化]]
- [[UTF-16符号化]]
]FIG]

[10] [[文字符号化]]は40種類あります。

** 単一バイト符号化

[18] [CITE[Encoding Standard]] の規定する[[符号化][文字符号化]]の多数は、
[[単一バイト符号化]]です。[[単一バイト符号化]]においては、
[[ASCIIバイト]]と[[ASCII文字]]に対応関係があり、
[[非ASCIIバイト]]に[[非ASCII文字]]が割り当てられています。
[SEE[ [[単一バイト符号化]] ]]

** 複数バイト符号化

[27] [[ISO-2022-JP]] 以外の複数バイトの[[符号化][文字符号化]]は、
[[スカラー値列]]を[[符号化]]したものと、
その[[スカラー値列]]を任意の[[スカラー値列]]の[[リスト]]に分割し、
それぞれを[[符号化]]してから連結したものが等しくなるという性質があります。

;; [29] ですから、 [[ISO-2022-JP]] 以外は、[[符号化器]]内の状態を保持せずとも、
[[文字]]の[[ストリーム]]を読み込みながら[[符号化]]した[[バイト]]を[[ストリーム]]に書き込んでいくことができます。

[30] 複数バイトの[[符号化][文字符号化]]は、
[[バイト列]]を[[復号]]したものと、
その[[バイト列]]を任意の位置で分割してから[[復号]]して連結したものが等しいとは限りません
(等しくならない場合が多いです)。

[FIG(table)[ [28] 複数バイト符号化の一覧
:n: [[名前][符号化名]]
:ds: [[復号器]]の状態

:n: [[UTF-8]]
:ds: [[符号位置]] (21ビット整数)、状態 (数ビット)

:n: [[GBK]]
:ds: 先導バイト ([[8ビット整数]])、第2バイト ([[8ビット整数]])、第3バイト ([[8ビット整数]])

:n: [[gb18030]]
:ds: 先導バイト ([[8ビット整数]])、第2バイト ([[8ビット整数]])、第3バイト ([[8ビット整数]])

:n: [[Big5]]
:ds: 先導バイト ([[8ビット整数]])

:n: [[EUC-JP]]
:ds: 先導バイト ([[8ビット整数]])、第2バイト ([[8ビット整数]])

:n: [[ISO-2022-JP]]
:ds: 先導バイト ([[8ビット整数]])、状態 (数ビット分)

:n: [[Shift_JIS]]
:ds: 先導バイト ([[8ビット整数]])

:n: [[EUC-KR]]
:ds: 先導バイト ([[8ビット整数]])

:n: [[UTF-16BE]]
:ds: 先導バイト ([[8ビット整数]]か [CODE[null]])、先導サロゲート ([[16ビット整数]]か [CODE[null]])

:n: [[UTF-16LE]]
:ds: 先導バイト ([[8ビット整数]]か [CODE[null]])、先導サロゲート ([[16ビット整数]]か [CODE[null]])
]FIG]

** 特別な符号化

[11] いくつかの[[符号化][文字符号化]]は、[[ラベル][符号化ラベル]]が指定されても他の[[符号化][文字符号化]]と読み替えるとの特別な扱いが規定されています。

;; [[符号化の取得]]を参照。

[HISTORY[
[26] [[符号化][文字符号化]]の[[名前][符号化名]]は、
[[ラベル][符号化ラベル]]の1つになっています。
かつては [[replacement]] だけは、 [[replacement]] 
という[[ラベル][符号化ラベル]]が存在していませんでした。
]HISTORY]

** 同型符号化・同型復号

[13] 
[[同型符号化]]、[[同型復号]]は他の[[文字符号化]]と違う特殊な性質があり、
[CITE[Encoding Standard]]
でなく
[CITE[Infra Standard]]
で規定されています。

* 演算

[31] [[符号化を取得]]により、[[符号化ラベル]]から[[文字符号化]]を得ることができます。

[17] [[符号化器]]、[[復号器]]も参照。

* 他の定義

[5] [[RFC 7303]] では、特定の [[XML MIME実体]]で実際に用いられている [[MIME charset]]
のことを[DFN[[RUBYB[[[文字符号化]]]@en[character encoding]]]] 
(文脈で明確な場合は[DFN[[RUBYB[[[符号化]]]@en[encoding]]]]) と呼んでいます [SRC[>>4]]。

;; [6] [CODE(MIME)@en[[[charset]]]] [[引数]]や [CODE(XMLa)@en[[[encoding]]]]
[[擬似属性]]に指定されている値ではなく、実際に[[符号化]]に用いられているものを指しています。

[REFS[
- [4] [CITE@en[RFC 7303 - XML Media Types]] ([TIME[2014-07-07 20:56:43 +09:00]] 版) <http://tools.ietf.org/html/rfc7303#section-2.2>
]REFS]

* 歴史

[1] [CITE@en[(X)HTML5 Tracking]]
([TIME[2009-10-24 10:48:55 +09:00]] 版)
<http://html5.org/tools/web-apps-tracker?from=4306&to=4307>

[2] [CITE@en[Character Model for the World Wide Web 1.0: Fundamentals]]
( ([TIME[2005-02-15 14:24:00 +09:00]] 版))
<http://www.w3.org/TR/charmod/#def-CES>

[3] [CITE[Core:Character Encodings]]
( ([TIME[2014-07-22 10:45:59 +09:00]] 版))
<http://alcme.oclc.org/openurl/servlet/OAIHandler?verb=ListRecords&metadataPrefix=oai_dc&set=Core:Character+Encodings>

[12] [CITE@en[Describe the relationship between encodings and Unicode encoding schemes]]
([[hsivonen]]著, [TIME[2018-08-23 22:57:39 +09:00]])
<https://github.com/whatwg/encoding/commit/6f9a41f3d9dbc7ba6d88f65f7ef1c139fb08d4be>