[1] [[HTML]] の [CODE(HTMLe)[[[form]]]] 要素の
[DFN[[CODE(HTMLa)[accept-charset]] 属性]]は、
[[フォーム処理エージェント]]が受け付ける [[charset]]
を指定します。

* 代替

[11] この[[属性]]自体は[[非推奨]]ではありませんが、 [[Web]]
上の[[文字コード]]は [[UTF-8]] とする[['''べき''']]とされているので、
それに従う限り、この[[属性]]の出番はありません。

[27] 古い[[サーバー]]に対する[[フォームの提出]]でやむを得ない場合 (ほとんど無さそうですが。)
を除き、この[[属性]]を使うべきではありません。

* 属性値

[7] この属性の値は [CODE(SGML)[%[[Charsets]]]] です。
つまり、 [[charset]] 名 ([CODE(SGML)[%[[Charset]]]])
を任意個、[[間隔]][[及び/又は]][[読点]]で分離したものです。
大文字・小文字は区別しません。 [[SGML]] 的には [CODE(SGML)[[[CDATA]]]] です。
[SRC[HTML 4 17.3]]

この値並びは、排他的論理和と解釈しなければなりません [SRC[HTML 4 17.3]]。
つまり、鯖は指定された charset のどれか1つを使って符号化することを要求しています。

[2] この属性は省略可能です。省略時の既定値は予約値 [CODE[UNKNOWN]]
です (DTD 的には [CODE(SGML)[#[[IMPLIED]]]] となっています)。
[[UA]] は、これを[Q[その [CODE(HTMLe)[form]] を転送するのに使った文字符号化]]
と解釈しても構いません。 [SRC[HTML 4 17.3]]

ところで [SAMP[unknown]] 値を予約しているのは誰でしょうか。 HTML 4
でしょうか。少なくても [[IANAREG]] 
には予約されているというようなことは書かれていません。

[17]
[[HTML 4]] [[DTD]] では [CODE(HTMLa)[accept-charset]]
[[属性]]は [CODE(SGML)[%[[Charsets]]]]
型になっています。そして [[HTML 4]]
[[DTD]] の[[注釈]] (参考), [[XHTML 1]]
[[DTD]] の[[注釈]] (規定), [[XHTML m12n]]
[[抽象モジュール]]定義に於ける属性型の定義 (規定)
では[[間隔]]で分離するとしか説明がありません。
([[名無しさん]])

[23]
+ [[XHTML m12n]] [[DTDモジュール]]の[[注釈]] (規定)

** UA による利用

[4] この属性の値は、フォームの提出の際に文字符号化の決定に使われます。
詳しくはフォームの[[提出]]の説明を参照してください。

[5] UA は、利用者に [CODE(HTMLa)[accept-charset]] 属性値を助言して構いません。
また、 [CODE(HTMLa)[accept-charset]] に応じて認識できない文字
(特定の charset で表現できない文字のことか?) 
の入力を制限しても構いません。 [SRC[HTML 4 17.3]]

** 不思議解釈

[3] >>17 の通り、属性値内の charset 名は間隔と読点で分離します。
(実装はゆるく解釈して[[間隔]]文字ではなく[[空白]]としているかもしれません。)

しかし、世間一般には、 charset 名は間隔で区切らなければならないのだとか、
あるいは読点で区切らなければならないのだとかいう風説が流布しています。

** 関連

[6] '''[CODE(HTTP)[Accept-Charset:]] 頭欄''':
意味的に似ている [[HTTP]] の [CODE(HTTP)[[[Accept-Charset]]:]]
欄とは違って、 [CODE(HTTP)[[[q]]]] 値の指定はできません。
多くの UA は前から順に使えるかどうか調べている模様です。

[12] '''[CODE(HTMLa)[enctype]] 属性''':
[CODE(HTMLa)[accept-charset]] 属性が特に設けられる以前は、
[CODE(HTMLa)[[[enctype]]]] 属性の値の[[媒体型]]に
[CODE(MIME)[[[charset]]]] 引数として受付け charset
名 (1つだけ) を指定することが行われていました。

[9] '''提出''':
[[フォーム]]の[[提出]]処理との関係
([CODE(HTMLa)[[[action]]]], [CODE(HTMLa)[[[method]]]],
[CODE(HTMLa)[[[enctype]]]], [CODE(HTMLa)[[[accept]]]] などとの関係)、
特に指定された charset で表現できない文字の取扱いなどについては、
フォームの[[提出]]の説明を参照してください。

** 例

[18] 一般的な日本語用フォームの場合:
[PRE(HTML example code)[
<form accept-charset="UTF-8 ISO-2022-JP EUC-JP Shift_JIS" [INS[(略)]]>
]PRE]

近代的な[[日本語]]対応の[[フォーム処理エージェント]]は、
大抵この4種類の [[charset]] くらいには対応しているはずです。

[[Perl]] で [CODE(perl)[[[Encode]]]] や [CODE(perl)[[[Jcode]]]]
を使っている場合はこれが一番近いです。

[20] やや古めの日本語用フォームの場合:
[PRE(HTML example code)[
<form accept-charset="ISO-2022-JP EUC-JP Shift_JIS" [INS[(略)]]>
]PRE]

少々古めの[[日本語]]対応の[[フォーム処理エージェント]]は、
この3種類の [[charset]] には対応しているはずです。

[[Perl]] で [CODE(perl)[[[jcode.pl]]]]
を使っている場合はこれが適当です。

[19] [[Windows]] 向け日本語用フォームの場合:
[PRE(HTML example code)[
<form accept-charset="UTF-8 Windows-31J" [INS[(略)]]>
]PRE]

[[日本語]]対応の[[フォーム処理エージェント]]で、
標準的な[[シフトJIS]] ではなく [[Windows]]
の独自拡張である[[マイクロソフト標準キャラクターセット]]に対応している場合
[WEAK[([[NEC拡張文字]]や [[IBM拡張漢字]]などに対応している場合)]]
にこのようにします。

[21] [CODE(charset)[[[ISO-2022-JP]]]] で提出させる例:
[PRE(HTML example code)[
<form accept-charset="ISO-2022-JP" [INS[(略)]]>
]PRE]

[24]
[CITE@ja[Adobe: アドビの教育ソリューション:CS3 Web Premium]] ([CODE[2007-08-02 21:53:04 +09:00]] 版) <http://www.adobe.com/jp/education/products/creativesuite/web/?xNavEdu=jpWS>

>
[PRE(HTML example code)[
<form id="globalnav-search" class="ja" name="globalnav-search" method="get" action="/go/gn_search_jp" accept-charset="utf-8">
]PRE]

この[[文書]]自体も [[UTF-8]]。

* 歴史

** HTML4

[16] 仕様書:
- [[HTML 4]]
-- [CODE(HTMLe)[form]] 要素 [CODE(HTMLa)[accept-charset]] 属性
<IW:HTML4:"interact/forms.html#adef-accept-charset">
-- [CITE[HTML 4 Changes]]
<IW:HTML4:"appendix/changes.html#h-A.1.1.12">

* メモ

[22]
[CITE[「POST 時の文字符号化方式」]] <http://bakera.jp/hatomaru.aspx/htmlbbs/inthread/3223>
([[名無しさん]] [WEAK[2005-11-30 12:24:10 +00:00]])

[29] ところで、[[input]]要素の欄などで入力文字列に送信 charset で表せない文字が含まれていた場合、 [[HTML4]] で >>8 のように書かれている以外にはなんとも指定がありません。 [[WinIE]] や [[Mozilla]] の実装では、  ''&#[VAR[n]];'' と [[SGML]] の[[数値文字参照]]風に 
(もちろん [[UCS]] の[[符号位置]]で) 送ってきます。 ([CODE[&]] は [CODE[&amp;]] には'''しません'''。) この仕様は W3C/IETF の仕様書に規定されているものではなく、独自のエラー処理と考えられます。

[10] >>29 これ、 Opera とかは [CODE[?]] にするんで、
どうするべきかって w3c-i18n で話題になってましたね。

[13]
HTML 4 によれば、 [CODE(MIME)[[[application/x-www-form-urlencoded]]]] は ASCII 文字しか使えませんから、 [CODE(HTMLa)[accept-charset]] の効力も [CODE(HTML)[method=get]] の場合や [CODE(HTML)[post]] でも [CODE(MIME)[application/x-www-form-urlencoded]] の場合には効力がないであろうことが容易に推察できます。実際、 HTML 4 の該当部分では全然 [CODE(HTMLa)[accept-charset]] に触れていません。
- [14] しかしながら、現実の運用 (サーバー側の実装にしろ、 [[UA]] にしろ。) は [CODE(MIME)[application/x-www-form-urlencoded]] を任意のオクテット列として取り扱っています。そして多くの (全ての?) [CODE(HTMLa)[accept-charset]] を実装した UA は、 [CODE(HTML)[get]] や [CODE(MIME)[application/x-www-form-urlencoded]] の場合でも [CODE(HTMLa)[accept-charset]] を参照しています。サーバー側もそれを期待しています。
- [15] こと文字周りに関しては、 HTML の仕様書はほとんど当てになりません。長らく需要に追いついていなかったためです。 [[HTML2.0]] が出る以前から漢字とか実際には平気で使われてたのに、規格は HTML 4 でようやく追いついたくらいですから。[WEAK[余談だけど [[HTML3.2]] では日本語を扱えないから云々の類の話を聞くと嫌になっちゃうね。確かに厳密に [[SGML宣言]]まで見ればその通りだけど、一体それに何の意味があるのか。]]

[25] [[RFC 2070]] ではどの [CODE(HTMLe)@en[[[input]]]] [CODE(HTMLa)@en[type][<input type>]]
に適用されるのか不明確です。

[26] [CITE@en[Web Applications 1.0 r7647 Embrace the Encodings specification.]]
( ([TIME[2013-01-24 10:38:00 +09:00]] 版))
<http://html5.org/tools/web-apps-tracker?from=7646&to=7647>

[8] [CITE@en[Update integration with Encoding Standard · whatwg/html@6a31c26]]
([TIME[2016-02-14 18:48:45 +09:00]] 版)
<https://github.com/whatwg/html/commit/6a31c26cf12e39dab1a488e75dd56c03d6786d39>

[28] [CITE@en[Require utf-8 when specifying character encoding by sideshowbarker · Pull Request #3091 · whatwg/html]]
([TIME[2017-11-03 20:17:52 +09:00]])
<https://github.com/whatwg/html/pull/3091>

[30] [CITE@en[Require UTF-8 for accept-charset]]
([[annevk]]著, [TIME[2018-11-23 22:52:22 +09:00]])
<https://github.com/whatwg/html/commit/840e22fe5d9be9c3c8c712150c0b98c7a4c62933>

[31] [CITE@en[Consider restricting <form accept-charset> to utf-8 · Issue #3097 · whatwg/html]]
([TIME[2019-06-20 12:36:36 +09:00]])
<https://github.com/whatwg/html/issues/3097>

[32] [CITE@en[Require UTF-8 for accept-charset by annevk · Pull Request #4195 · whatwg/html]]
([TIME[2019-06-20 12:39:22 +09:00]])
<https://github.com/whatwg/html/pull/4195>

[33] [CITE@en[Editorial: add a missing double quote]]
([[annevk]]著, [TIME[2018-11-27 18:06:20 +09:00]])
<https://github.com/whatwg/html/commit/aecd40eb4e96ec2c1dcc168a4c9699af0c20205c>

[34] [CITE@en[Editorial: add a missing double quote by annevk · Pull Request #4207 · whatwg/html]]
([TIME[2019-06-20 20:15:58 +09:00]])
<https://github.com/whatwg/html/pull/4207>