* 仕様書

[REFS[
- [14] [CITE@en[CSS Syntax Module Level 3]] ([TIME[2017-04-30 17:53:13 +09:00]]) <https://drafts.csswg.org/css-syntax/#input-byte-stream>
- [13] [CITE@en[CSS Syntax Module Level 3]] ([TIME[2017-04-30 17:53:13 +09:00]]) <https://drafts.csswg.org/css-syntax/#charset-rule>
-- [3] [CITE@en[CSS Syntax Module Level 3]]
( ([TIME[2013-07-26 07:52:42 +09:00]] 版))
<http://dev.w3.org/csswg/css-syntax/#the-charset-rule>
]REFS]

* [CODE[@charset]] 規則

** 文脈

[4] [CODE(CSS)@en[[[@charset]]]] は最初の[[規則]]でなければ[[非妥当]]です [SRC[>>3]]。

[5] [CODE(CSS)@en[[[@charset]]]] は[[スタイルシート]]の[[最上位]]になければ[[非妥当]]です [SRC[>>3]]。

* エスケープ

[12] [[escape (CSS)]] 参照。

* 歴史

** [CODE[@charset]] の実装状況

[53]
[CODE(CSS)@en[@[[charset]]]] [[規則]]を書ける場所にはいくつかの制約があります。
また、[[利用者エージェント]]は[[スタイル・シート]]の先頭以外にある
[CODE(CSS)@en[@[[charset]]]] [[規則]]を[[無視]]しなければならないことになっています。
ですが、 [[Firefox]] 2 も [[Opera]] 9 も、
少なくても [[CSSOM]] に [CODE(CSS)@en[@[[charset]]]]
に対応する [CODE(DOMi)@en[[[CSSRule]]]] を追加するかに関しては、
ほとんどの制約をチェックしていないようです。

;; ほとんどの制約は [[charset]] の自動検出を容易にするためのもので、
[[CSSOM]] の構築にはそもそも関係ないからでしょう。

;; [[WinIE 6]] はまったく [CODE(CSS)@en[@[[charset]]]]
を [[CSSOM]] に反映させません。 [CODE(DOMa)@en[[[cssText]]]]
にも出てきません。

[54]

- 適切な例 <https://suika.suikawiki.org/gate/2007/cssom/viewer?c=%40charset%20%22US-ASCII%22%3B;h=;p=n;x=style-element>
- Preferred MIME name でない例
<https://suika.suikawiki.org/gate/2007/cssom/viewer?c=%40charset%20%22ascii%22%3B;h=;p=n;x=style-element>
- IANA 名でない例
<https://suika.suikawiki.org/gate/2007/cssom/viewer?c=%40charset%20%22x-sjis%22%3B;h=;p=n;x=style-element>
- 構文的にも IANA 名でない例
<https://suika.suikawiki.org/gate/2007/cssom/viewer?c=%40charset%20%22%E3%82%B7%E3%83%95%E3%83%88%E7%AC%A6%E5%8F%B7%E5%8C%96%E8%A1%A8%E7%8F%BE%22%3B;h=;p=n;x=style-element>
- [CODE(char)[[[U+0020]]]] が2つ
<https://suika.suikawiki.org/gate/2007/cssom/viewer?c=%40charset%20%20%22US-ASCII%22%3B;h=;p=n;x=style-element>
- [CODE(char)[[[U+0020]]]] の代わりに[[改行]]
<https://suika.suikawiki.org/gate/2007/cssom/viewer?c=%40charset%0A%22US-ASCII%22%3B;h=;p=n;x=style-element>
- [CODE(CSS)[[[;]]]] の前に [CODE(char)[[[U+0020]]]]
<https://suika.suikawiki.org/gate/2007/cssom/viewer?c=%40charset%20%22US-ASCII%22%20%3B;h=;p=n;x=style-element>
- [CODE(CSS)[[[;]]]] の前に[[注釈]]
<https://suika.suikawiki.org/gate/2007/cssom/viewer?c=%40charset%20%22US-ASCII%22%2F**%2F%3B;h=;p=n;x=style-element>
- [CODE(CSS)[[["]]]] の代わりに [CODE(CSS)[[[']]]]
<https://suika.suikawiki.org/gate/2007/cssom/viewer?c=%40charset%20'US-ASCII'%3B;h=;p=n;x=style-element>
- [[charset]] 名に [[escape]]
<https://suika.suikawiki.org/gate/2007/cssom/viewer?c=%40charset%20%22US-%5C41SCII%22%3B;h=;p=n;x=style-element>
- [CODE(CSS)@en[@[[charset]]]] の部分に [[escape]]
<https://suika.suikawiki.org/gate/2007/cssom/viewer?c=%40ch%5C61%20rset%20%22US-ASCII%22%3B;h=;p=n;x=style-element>
- [CODE(CSS)@en[@[[charset]]]] が[[大文字]]
<https://suika.suikawiki.org/gate/2007/cssom/viewer?c=%40CHARSET%20%22US-ASCII%22%3B;h=;p=n;x=style-element>
- [CODE(CSS)@en[@[[charset]]]] の前に[[空白]]
<https://suika.suikawiki.org/gate/2007/cssom/viewer?c=%20%40charset%20%22US-ASCII%22%3B;h=;p=n;x=style-element>
- [CODE(CSS)@en[@[[charset]]]] の前に[[改行]]
<https://suika.suikawiki.org/gate/2007/cssom/viewer?c=%0D%0A%40charset%20%22US-ASCII%22%2F**%2F%3B;h=;p=n;x=style-element>
- [CODE(CSS)@en[@[[charset]]]] の前に[[注釈]]
<https://suika.suikawiki.org/gate/2007/cssom/viewer?c=%2F**%2F%40charset%20%22US-ASCII%22%2F**%2F%3B;h=;p=n;x=style-element>

[55]

- [CODE(CSS)@en[@[[charset]]]] の前に [CODE(CSS)[[[CDO]]]]
<https://suika.suikawiki.org/gate/2007/cssom/viewer?c=%3C!--%40charset%20%22US-ASCII%22%3B%0A;h=%3Cp%3EXXXXXX;p=n;x=style-element>
- [CODE(CSS)@en[@[[charset]]]] の後に [CODE(CSS)[[[CDC]]]]
<https://suika.suikawiki.org/gate/2007/cssom/viewer?c=--%3E%40charset%20%22US-ASCII%22%3B;h=%3Cp%3EXXXXXX;p=n;x=style-element>
([[名無しさん]])

[56]
[CODE(CSS)@en[[[;]]]] がない:
<https://suika.suikawiki.org/gate/2007/cssom/viewer?c=%40charset%20%22US-ASCII%22;h=%3Cp%3EXXXXXX;p=n;x=style-element>
は [[Firefox]] 2 でも [[Opera]] でも無視して空の[[スタイル・シート]]と同じに扱うようです。
([[名無しさん]])

[57]
[CODE(char)[[[U+0020]]]] なし:
<https://suika.suikawiki.org/gate/2007/cssom/viewer?c=%40charset%22US-ASCII%22%3B;h=%3Cp%3EXXXXXX;p=n;x=style-element>
でも [[Firefox]] 2、[[Opera]] 9 とも [[CSSOM]]
に現れます。
([[名無しさん]])

[58]
[CODE(CSS)@en[@[[charset]]]] の前に未知の [[@規則]]
- <https://suika.suikawiki.org/gate/2007/cssom/viewer?c=%40a%3B%40charset%22US-ASCII%22%3B;h=%3Cp%3EXXXXXX;p=n;x=style-element>
- <https://suika.suikawiki.org/gate/2007/cssom/viewer?c=%40a%7B%7D%40charset%22US-ASCII%22%3B;h=%3Cp%3EXXXXXX;p=n;x=style-element>

[[Firefox]] 2、[[Opera]] 9 とも [[CSSOM]] 上に
[CODE(CSS)@en[@[[charset]]]] が ([[Opera]] 9 では
[CODE(CSS)@en[@a]] も) 現れます。
([[名無しさん]])

[59]
以下のように [CODE(CSS)@en[@[[charset]]]] を[[無視]]するべき場合に、
[[Firefox]] 2 は [[CSSOM]] 上に [CODE(DOMi)@en[[[CSSCharsetRule]]]]
を追加しませんが、 [[Opera]] 9 はします:
- [CODE(CSS)@en[@[[media]]]] がある
<https://suika.suikawiki.org/gate/2007/cssom/viewer?c=%40media%20all%7B%7D%40charset%20%22US-ASCII%22%3B%0D%0A;h=%3Cp%3EXXXXXX;p=n;x=style-element>
- [CODE(CSS)@en[@[[charset]]]] がある
<https://suika.suikawiki.org/gate/2007/cssom/viewer?c=%40charset%20%22US-ASCII%22%3B%40charset%20%22US-ASCII%22%3B;h=%3Cp%3EXXXXXX;p=n;x=style-element>
- [CODE(CSS)@en[@[[namespace]]]] がある
<https://suika.suikawiki.org/gate/2007/cssom/viewer?c=%40namespace%20''%3B%40charset%20%22US-ASCII%22%3B;h=%3Cp%3EXXXXXX;p=n;x=style-element>
- [CODE(CSS)@en[@[[import]]]] がある
<https://suika.suikawiki.org/gate/2007/cssom/viewer?c=%40import%20'style'%3B%40charset%20%22US-ASCII%22%3B;h=%3Cp%3EXXXXXX;p=n;x=style-element>
- [[規則集合]]がある
<https://suika.suikawiki.org/gate/2007/cssom/viewer?c=p%7B%7D%40charset%20%22US-ASCII%22%3B;h=%3Cp%3EXXXXXX;p=n;x=style-element>

([[名無しさん]])

[60]

- <https://suika.suikawiki.org/gate/2007/cssom/viewer?c=%40charset%3B%40charset%20%22US-ASCII%22%3B;h=%3Cp%3EXXXXXX;p=n;x=style-element>

([[CSSOM]] 的に)
[[Firefox]] は全部無視、 [[Opera]] 9 は1つ目だけ無視。

([[名無しさん]])

[61]
<https://suika.suikawiki.org/gate/2007/cssom/viewer?c=%40charset%20%22%0D%0A%40charset%20%22US-ASCII%22%3B;h=%3Cp%3EXXXXXX;p=n;x=style-element>

([[CSSOM]] 的に) [[Firefox]] 2 も [[Opera]] 9 も全部無視。
([[名無しさん]])

[62]
<https://suika.suikawiki.org/gate/2007/cssom/viewer?c=%40charset%20%22%0A%3B%40charset%20%22US-ASCII%22%3B;h=%3Cp%3EXXXXXX;p=n;x=style-element>

([[CSSOM]] 的に)
[[Firefox]] 2 も [[Opera]] 9 も、1つ目''だけ''無視。
([[名無しさん]])

[63]
[[charset]] 名の閉じ[[引用符]]がない:
- <https://suika.suikawiki.org/gate/2007/cssom/viewer?c=%40charset%20%22xxxx;h=%3Cp%3EXXXXXX;p=n;x=style-element>
- <https://suika.suikawiki.org/gate/2007/cssom/viewer?c=%40charset%20%22US-ASCII%0A%3B%0A;h=%3Cp%3EXXXXXX;p=n;x=style-element>

[[Firefox]] 2、[[Opera]] 9 のどちらも、全部無視。
([[名無しさん]])

[64]
>>54 
[CODE(CSS)@en[@[[charset]]]] の部分に [[escape]]
<https://suika.suikawiki.org/gate/2007/cssom/viewer?c=%40ch%5C61%20rset%20%22US-ASCII%22%3B;h=;p=n;x=style-element>
は、 [[Opera]] 9 では [CODE(DOM&#169;)@en[[[UNKNOWN_RULE]]]]
扱いでした。

;; そもそも [[Opera]] 9 は [CODE(CSS)@en[[[ATKEYWORD]]]]
中の [[escape]] に ([CODE(CSS)[[[\0]]]] も含めて) 対応していませんでした。

([[名無しさん]])

[65]
>>59 壊れた [CODE(CSS)@en[@[[namespace]]]] が前にある
<https://suika.suikawiki.org/gate/2007/cssom/viewer?c=%40namespace%3B%40charset%20%22US-ASCII%22%3B;h=%3Cp%3EXXXXXX;p=n;x=style-element>


[6] >>4 最初の[[規則]]といいますが、 [[Chrome]] でも [[Firefox]] でも、[[空白]]や[[注釈]]は数に入っていません。
[[Firefox]] では[[非妥当]]な[[規則]]や [CODE(CSS)@en[[[CDO]]]] や [CODE(CSS)@en[[[CDC]]]]
があっても構いません。 [[Chrome]] ではこれらがあると[[非妥当]]とみなされます。 [TIME[2013-08-11T05:33:22.500Z]]

[REFS[
-[1] [CITE[IRC logs: freenode / #whatwg / 20121108]]
( ([TIME[2012-11-25 23:14:53 +09:00]] 版))
<http://krijnhoetmer.nl/irc-logs/whatwg/20121108>
-[2] [CITE@en-US[csswg: changeset 8744:efa135e27361]]
( ([TIME[2013-07-27 10:31:02 +09:00]] 版))
<https://dvcs.w3.org/hg/csswg/rev/efa135e27361>
]REFS]

[7] [CITE@en[Re: ''''''[''''''cssom'''''']'''''' Rationale for including (or not) CSSCharsetRule]]
( ([[Tab Atkins Jr.]] 著, [TIME[2013-05-30 06:15:25 +09:00]] 版))
<http://lists.w3.org/Archives/Public/www-style/2013May/0758.html>

[8] [CITE[Chromium Dashboard]]
( ([TIME[2014-09-02 01:43:21 +09:00]] 版))
<http://www.chromestatus.com/metrics/feature/timeline/popularity/426>

[9] [CITE[IRC logs: freenode / #whatwg / 20140901]]
( ([TIME[2014-09-02 01:43:52 +09:00]] 版))
<http://krijnhoetmer.nl/irc-logs/whatwg/20140901#l-253>

[10] [CITE@en-US[csswg: changeset 14817:86a5f6f5df18]]
( ([TIME[2014-11-27 22:32:50 +09:00]] 版))
<https://dvcs.w3.org/hg/csswg/rev/86a5f6f5df18de3c6b7a34d4bd91862298bfb0dd>

[11] [CITE@en[CSS 2.1 @charset tests invalidated by Level 3]]
( ([[Henri Sivonen]] 著, [TIME[2012-12-04 02:10:14 +09:00]] 版))
<http://lists.w3.org/Archives/Public/public-css-testsuite/2012Dec/0000.html>
