[2] 
[[Web]] ではいろいろな[[文字コード]]が使われています。

* 仕様書

[REFS[

- [177] 
[CITE@en-US-x-hixie[HTML Standard]], [TIME[2025-12-02T11:20:51.000Z]], [TIME[2025-12-07T11:08:56.643Z]] <https://html.spec.whatwg.org/#character-encodings>
- [104] 
[CITE@en-US-x-hixie[HTML Standard]], [TIME[2025-11-04T10:59:41.000Z]], [TIME[2025-11-09T01:33:40.054Z]] <https://html.spec.whatwg.org/#determining-the-character-encoding>

]REFS]

* Web と文字コードの現在

[FIG(middle list)[ [1] [[Web]] と[[文字コード]]
- [CODE[DOMString]]
- [CODE[USVString]]
- [[文字コード指定メニュー]]
- [[HTTPにおける文字コード]]
- [CODE[charset]]
- [CODE[inputEncoding]]
- [CODE[xmlEncoding]]
- [CODE[document.charset]]
- [CODE[document.characterSet]]
- [CODE[TextEncoder]]
- [CODE[TextDecoder]]
- [[HTMLにおける文字コード]]
- [[XMLにおける文字コード]]
- [[CSSにおける文字コード]]
- [[OpenTypeにおける文字コード]]
- [[JSONにおける文字コード]]
- [[US-ASCII]]
- [[ISO-8859-1]]
- [[参照処理モデル]]
- [CITE[[[Encoding Standard]]]]
- [[UTF-8]]
- [[WTF-8]]
- [[UTF-16]]
- [[文字参照]]
- [[charset sniffing]]
- [[UniversalCharDet]]
- [[同型符号化]]
- [[欄値]]
- [[符号化語]]
- [[RFC 5987]]
- [[文字参照]]
- [[Punycode]]
- [CODE[\u]]
- [[CSS escape]]
- [[パーセント符号化]]
- [CODE[unicode-range]]
- [[URLにおける文字]]

]FIG]

[FIG(short list)[ [6] [[Web]] と[[文字コード]]の関連記事
- [CODE(charname)@en[NULL]]
]FIG]


* 著者に対する要件

[182] 
現在の多くの仕様は [[UTF-8]] の利用を[[著者]]に求めています。
[SEE[ [[HTMLにおける文字コード]], [[CSSにおける文字コード]], [[JavaScriptにおける文字コード]], [[WebVTT]], [CODE[text/event-stream]], [CODE[text/ping]] ]]

[183] 
仕様で求められていなくても、多くの場合は [[UTF-8]] が使われています。
[SEE[ [[JSON]], [[XMLにおける文字コード]] ]]

[184] 
過去の仕様ではそれ以外の[[文字コード]]の利用も認められ、実際にいろいろが使われていました。
[SEE[ [[HTMLにおける文字コード]], [[CSSにおける文字コード]], [[JavaScriptにおける文字コード]], [[XMLにおける文字コード]] ]]

* バイト列から文字列への変換


[72] [[復号][復号 (符号化)]]操作は、次の場面で使われています。

[FIG(table)[ [73] [[バイト列]]を[[復号]]して[[文字列]]を得る場面

:c: 場面
:spec: [[仕様書]]上の操作
:stream: ストリーム出力
:legacy: 非 [[UTF-8]]
:bom: [[BOM]]
:user: 上書き指定
:ctmeta: [[内容型メタデータ]]
:sniffing: [[charset sniffing]]
:default: 既定の[[符号化][文字符号化]]
:change: [[符号化の変更]]
:error: [[誤りモード]]

:c: [CODE(DOMi)@en[TextDecoder]]
:spec: [CODE(DOMi)@en[TextDecoder]]
:stream: ○
:legacy: ○
:error: 指定可

:c: [CODE(DOMi)@en[TextDecoder]] ([CODE[ignoreBOM]])
:spec: [CODE(DOMi)@en[TextDecoder]]
:stream: ○
:legacy: ○
:bom: 除去
:error: 指定可

:c: [[HTML構文解析器]]
:spec: [[復号][復号 (符号化)]]
:stream: ○
:legacy: ○
:bom: [[sniffing][BOM sniffing]]
:ctmeta: ○
:sniffing: [[HTML][HTML encoding sniffing]]
:user: ○
:default: 
1. [[親閲覧文脈]]
2. [[UA]]依存
:change: ○
:error: [CODE[replacement]]

:c: [[XHR]] [[文書応答]] ([[HTML]])
:spec: [[復号][復号 (符号化)]]
:legacy: ○
:ctmeta: ○
:user: ○
:bom: [[sniffing][BOM sniffing]]
:sniffing: [[XHR]] [[HTML]]
:default: [[UTF-8]]
:error: [CODE[replacement]]

# [[HTML Imports]]

:c: [[XML構文解析器]]
:stream: ○
:legacy: ○
:bom: [[sniffing][BOM sniffing]]
:ctmeta: ○
:sniffing: [[XML][XML encoding sniffing]]
:default: [[UTF-8]]
:user: ○
:error: ([CODE[fatal][fatal (符号化)]])
:#: navigate, XSLT, responseXML, document.load

:c: [[CSS構文解析器]] ([[文書]]から)
:spec: [[復号][復号 (符号化)]]
:legacy: ○
:bom: [[sniffing][BOM sniffing]]
:ctmeta: ○
:sniffing: [[CSS][CSS encoding sniffing]]
:default:
1. [CODE[charset][<link charset>]]
2. [[文書][文書の文字符号化]]
:error: [CODE[replacement]]

:c: [[CSS構文解析器]] ([[CSS]] から)
:spec: [[復号][復号 (符号化)]]
:legacy: ○
:bom: [[sniffing][BOM sniffing]]
:ctmeta: ○
:sniffing: [[CSS][CSS encoding sniffing]]
:default:
[[CSS]]
:error: [CODE[replacement]]

:c: [[CSS構文解析器]] ([CODE(HTTP)@en[Link:]] から)
:spec: [[復号][復号 (符号化)]]
:legacy: ○
:bom: [[sniffing][BOM sniffing]]
:ctmeta: ○
:sniffing: [[CSS][CSS encoding sniffing]]
:default: [[UTF-8]]
:error: [CODE[replacement]]

:c: [[テキストファイルのDOM構築]]
:stream: ○
:legacy: ○
:bom: [[sniffing][BOM sniffing]]
:ctmeta: ○
:sniffing: [[MIME型]]依存
:default: [[MIME型]]依存
:user: ○
:error: [CODE[replacement]]

:c: [[XHR]] [[テキスト応答]] ([[XML]])
:spec: [[復号][復号 (符号化)]]
:stream: △
:legacy: ○
:bom: [[sniffing][BOM sniffing]]
:ctmeta: ○
:sniffing: [[XML][XML encoding sniffing]]
:default: [[UTF-8]]
:user: ○
:error: [CODE[replacement]]

:c: [[XHR]] [[テキスト応答]] (非 [[XML]])
:spec: [[復号][復号 (符号化)]]
:stream: △
:legacy: ○
:bom: [[sniffing][BOM sniffing]]
:ctmeta: ○
:default: [[UTF-8]]
:sniffing: [[BOM][BOM sniffing]]
:user: ○
:error: [CODE[replacement]]

:c: [[fetch]] [[package data]] [[テキスト][テキストファイル]]
:spec: [[UTF-8復号]]
:bom: 除去
:error: [CODE[replacement]]

:c: [CODE(URI)@en[view-source:]]
:stream: ○
:legacy: ○
:bom: [[sniffing][BOM sniffing]]
:ctmeta: ○
:sniffing: [[MIME型]]依存
:default: [[MIME型]]依存
:user: ○
:error: [CODE[replacement]]

:c: [[クリップボード]]から[[貼り付け]]
:legacy: [[MIME型]]と[[プラットフォーム]]依存
:sniffing: [[MIME型]]と[[プラットフォーム]]依存
:default: [[MIME型]]と[[プラットフォーム]]依存

:c: [[古典スクリプトのfetch]]
:spec: [[復号][復号 (符号化)]]
:stream: △
:legacy: ○
:bom: [[sniffing][BOM sniffing]]
:ctmeta: ○
:sniffing: [[BOM][BOM sniffing]]
:default:
1. [CODE[<script charset>]]
2. [[文書][文書の文字符号化]]
:error: [CODE[replacement]]

:c: [[スクリプトのfetch]] [WEAK[([[古典スクリプトのfetch]]以外)]]
:spec: [[UTF-8復号]]
:stream: △
:bom: 除去
:error: [CODE[replacement]]

:c: [CODE(JS)@en[javascript:]]
:spec: [[UTF-8復号]]
:bom: 除去
:error: [CODE[replacement]]

:c: [[XHR]] [[JSON応答]]
:spec: [[UTF-8復号]]
[WEAK[([[バイト群からJSONを構文解析]])]]
:bom: 除去
:error: [CODE[replacement]]

:c: [[fetch]] [[package data]] [[JSON]]
:spec: [[UTF-8復号]]
[WEAK[([[バイト群からJSONを構文解析]])]]
:bom: 除去
:error: [CODE[replacement]]

:c: [CODE(MIME)@en[application/manifest+json]]
:spec: [[UTF-8復号]]
:bom: 除去
:error: [CODE[replacement]]

:c: [CODE[payment-method-manifest]]
:spec: [[UTF-8復号]]
:bom: 除去
:error: [CODE[replacement]]

:c: [CODE[PushMessageData][bytes (PushMessageData)]]
:spec: [[UTF-8復号]]
:bom: 除去
:error: [CODE[replacement]]


:c: [[WebDriver]] [[要求]] [[JSON]]

:c: [[Source Map]]

:c: [CODE(JS)@en[document.cookie]]
:spec: [[BOMなしUTF-8復号]]
:error: [CODE[replacement]]

:c: [[challenge]] [CODE(HTTP)@en[realm]]

:c: [CODE(HTTP)@en[Content-Disposition:]] [CODE(MIME)@en[filename]]

:c: [[Closeフレーム]] [CODE(DOMa)@en[reason]]
:spec: [[BOMなしUTF-8復号]]
:error: [CODE[replacement]]

:c: [CITE[Web Transport Processing]] [[WebSocket]] [[テキストフレーム]]
:spec: [CODE(DOMi)@en[TextDecoder]]
:stream: ○
:bom: 除去
:error: [CODE[replacement]]

:c: [CODE(MIME)@en[text/event-stream]]
:spec: [[UTF-8復号]]
:stream: ○
:bom: 除去
:error: [CODE[replacement]]

:c: [[ホスト構文解析器]]
:spec: [[BOMなしUTF-8復号]]
([[BOMなしUTF-8復号または失敗]])
:error: [CODE[replacement]]
([CODE[fatal][fatal (符号化)]])

:c: [[パーセント復号]]
:spec: [[BOMなしUTF-8復号]]
:error: [CODE[replacement]]

:c: [CODE(JS)@en[decodeURI]]
:spec: [CODE[Decode()]]
:error: [CODE(JS)@en[URIError]]

:c: [CODE(JS)@en[decodeURIComponent]]
:spec: [CODE[Decode()]]
:error: [CODE(JS)@en[URIError]]

:c: [[文書の示された部分]]決定
:spec: [[BOMなしUTF-8復号]]
:error: [CODE[replacement]]

:c: [CODE(URI)@en[file:]] [[URL path]]

:c: [CODE(MIME)@en[application/x-www-form-urlencoded]]
:spec: [[BOMなしUTF-8復号]] [WEAK[(旧: [[復号][復号 (符号化)]])]]
:legacy: △
:error: [CODE[replacement]]

:c: [[媒体素片]]
:spec: [[UTF-8]] で[[復号]]
:error: [CODE[fatal][fatal (符号化)]]

:c: 
[91] 
[CODE(MIME)@en[multipart/form-data]]
:spec: [[BOMなしUTF-8復号]]
:stream: △
:legacy: △
:bom: 除去
:error: [CODE[replacement]]

:c: [[parse a manifest]]
:spec: [[UTF-8復号]]
:bom: 除去
:error: [CODE[replacement]]

:c: [CODE[m3u8]]

:c: [[WebVTT構文解析器]]
:spec: [[UTF-8復号]]
:stream: △
:bom: 除去
:error: [CODE[replacement]]

:c: [[文字列 (X.500)]]

:c: [[MIME型をバイト列から構文解析]]
:spec: [[同型復号]]

:c: [[URL構文解析器]]
:spec: [[同型復号]]

:c: [[[CODE[data:]] URL処理器]]
:spec: [[同型復号]]

:c: [CODE[Refresh:]]
:spec: [[同型復号]]

:c: [[get, decode, and split]] ([CODE[Content-Type:]], [CODE[X-Content-Type-Options:]] など)
:spec: [[同型復号]]

:c: [CODE[atob]]
:spec: [[同型復号]]

:c: [CITE[Web Transport Processing]] [[環境変数]]の値
:spec: [[復号][復号 (符号化)]]
:legacy: △
:bom: 除去
:error: [CODE[replacement]]

]FIG]

** encoding sniffing algorithm


[69] [DFN[encoding sniffing algorithm]] ([[charset sniffing]]) は、
[[バイト列]]からその[[符号化][文字符号化]]を推定する[[アルゴリズム]]です。

[64] [[文書形式]]や [[API]] ごとに似て非なるものが各[[仕様書]]で分散して規定されています。

- [[BOM sniffing]]
- [[HTML encoding sniffing]]
- [[XML encoding sniffing]]
- [[CSS encoding sniffing]]

[80] [[HTML]], [[XHR]] [[文書応答]] [[HTML]],
[[XML]], [CODE(HTMLe)@en[script]] ([[古典スクリプト]]), [[CSS]],
[[テキスト文書]], [[XHR]] [[テキスト応答]]などの各場面での[[文字コード]]の判定方法をまとめると、
次のようになります。

[FIG(steps)[

= [47] 決定的指定
=- [ [CODE[TextDecoder]] ] [[著者]]の指示 (certain)
=- [58] [HTML, XML, テキスト文書] [[利用者]]の指示 (certain)  [ [[意図的違反]] ]
=- [60] [HTML] [[符号化の変更]]の結果 (certain)
= [[BOM sniffing]] (certain)
= [56] 上書き指定
=- [57] [HTML, XML, テキスト文書] [[利用者]]の指示 (certain)  [仕様上]
=- [XHR 文書応答 HTML] [[override charset]] (certain)
=- [XHR テキスト応答] [[override charset]]
=- [61] ([HTML] [[a known definite encoding]] (certain) - [[XHR]] [[文書応答]]で使われる)
= [[HTTP]] [CODE(MIME)@en[charset]] (certain)
= [[prescan]]
== [HTML] [[prescan]] (tentative)
== [XHR 文書応答 HTML] [[XHR]] [[HTML]] prescan (certain)
== [XML] [[XML]] prescan
== [CSS] [[CSS]] prescan
= [[環境符号化]] (明示的)
== [script] [CODE(HTML)[<script charset>]]
== [CSS] [CODE(HTML)[<link charset>]]
== [CSS] [CODE(XML)[<?xml-stylesheet charset?>]]
= [[環境符号化]] (暗示的)
== [HTML] [[親閲覧文脈]] (tentative)
== [HTML] [[履歴]] (tentative)
== [CSS] 読み込み元[[スタイルシート]]の[[符号化][文字符号化]]
== [CSS, script] [[文書の[F[文字符号化]]]]
= [126] [HTML, テキスト文書] [[頻度解析等の手法]] (tentative)
== [127] [[UTF-8]] の検出
== [128] [[フォント依存符号化]]の検出
== [130] [[符号構造]]やバイト出現頻度などによる推定
= [HTML, テキスト文書] [[利用者]]の[[ロケール]] (tentative)
= [[UTF-8]]
== [HTML, テキスト文書] (tentative)
== [XHR 文書応答 HTML] (certain)
]FIG]

[94] 
対象となる[[ファイル]]の種別ではなく、どこで使われるかによって処理の方法が異なることに注意が必要です。
同じ [[HTML文書]]でも、 [[navigate]] で開かれるときと [CODE[responseXML]]
で開かれるときとで[[文字コードの判定]]の方法が異なるのです。

[95] 
[[ソース表示]] ([CODE[view-source:]]) について規定する[[仕様書]]はありませんが、
少なくても [CITE[Firefox]] では通常の [[HTML文書]]の [[navigate]]
と異なる判定を行っています。 ([[平文文書]]の [[navigate]] と 
[[HTML文書]]の [CODE[view-source:]] の判定方法が同じか異なるかは不明です。)
[TIME[2025-11-09T00:40:47.400Z]]


[89] [[charset sniffing]] に使うデータの長さについては、
>>121 や[[資源ヘッダー]]を参照。

[SEE[ [[文字コードの指定]], [[文字コードの判定]] ]]



*** 明示的な指定

[10] 
[[著者]]や[[利用者]]が明示的に[[文字符号化]]を指定する方法はいくつかあります。
どれがどの程度の重みで使われるかが少しずつ違います。

[99] 
古典的な [[Webブラウザー]]は [[GUI]] に[[文字コード指定メニュー]]を実装していました。
[[CUI]] ツールの多くは[[コマンドラインオプション]]等の方法で同様の機能を提供しています。
[[encoding sniffing algorithm]] とその実装は完全ではないので、
こうした機能は [[Web互換性]]のために必須です。
[SEE[ [[文字コード指定メニュー]] ]]

**** a known definite encoding

[82] [CITE[HTML Standard]] の [[HTML構文解析器]]は [DFN[a known definite encoding]]
を指定可能であり、 [[XHR]] の[[文書応答]]が [[HTML]] の場合にこれが使われます。
[[文書応答]]は、 [[HTML構文解析器]]の標準の ([[navigate]] で使われる)
[[encoding sniffing algorithm]] のかわりに、独自の簡略化されたアルゴリズムを使っています。

- [85] [[XHR]] は先頭1024バイトから [[prescan]] することを求めており、
[[HTML]] はより広い選択肢を提供しています。
- [87] [[XHR]] は [[UTF-8]] を既定値としていますが、
[[HTML]] は文脈からの推測、 [[UnivCharDet]] や[[ロケール]]依存の既定値を使います。
- [88] [[HTML]] では[[符号化の変更]]が起こることがありますが、
[[XHR]] では起こりません。
- [86] [[XHR]] が [[a known definite encoding]] に指定する値である [[final charset]]
は[[符号化ラベル]] (かもしれないしそうでないかもしれないもの) であって[[符号化][文字符号化]]ではないのですが、
[[XHR]] 側でも [[HTML]] 側でもなぜかその検査もしていません。


[144] 
[CITE@en[Web Applications 1.0 r8073 Provide a hook for XHR and web components to incrementally decode with a known encoding]]
( ([TIME[2013-07-20 03:35:00 +09:00]] 版))
<http://html5.org/tools/web-apps-tracker?from=8072&to=8073>



*** [CN[BOM]] による判定

[96] 
[CN[BOM]] による判定は、それのみを行う[[復号][復号 (符号化)]]操作 ([[BOM sniffing]])
を始め、多くの操作が採用しています。

-*-*-

[74] 
仕様上 [CN[BOM]] は他の指定よりも優先されることになっています。 
これは [[Trident]], [[WebKit]], [[Chromium]] の挙動に合わせて変更されたものです。
[SRC[>>70]]

[77] 
ただその根拠として示されている [SRC[>>71]] ページについて、現在
[[Internet Archive]] に保存されているものは、確かに [[HTTPヘッダー]]に誤った
[CODE[charset]] が指定されており、実態および [CODE[<meta charset>]]
と矛盾していますが、 [CN[BOM]] は見当たりません [SRC[>>75]]。
同じサイトの議論より少し前の状態 [SRC[>>76]] では [[HTTP]] [CODE[charset]] がなく、
議論の頃には誤った [[HTTP]] [CODE[charset]] があり、
その少し後には [[HTTP]] [CODE[charset]] がないのですが、
どの状態も [CN[BOM]] のない [[UTF-8]] です。
あるいは [CODE[User-Agent:]] 等によって出し分けがなされていたのでしょうか。

;; [78] 
[[IE]] や [[Safari]] や [[Chrome]] の挙動がそうなっていたというからには、
このサイト以外にもこの挙動に依存したサイトは存在していたのでしょうが...

;; [81] 
議論は白熱していますが [SRC[>>68, >>70]]、 [[XML]] 世界の神学的「正しさ」などに注目が集まりながら、
報告者の [[Anne]] と [[Ian Hickson]] 以外誰も実サイトの状況に関心を払っていないのは、
[[統計的手法][Webの統計]]などが成熟する前の時代なので致し方ないのかもしれませんが...
仕様書に影響する [[URL]] を記入した [[Ian Hickson]] 
は間違いなく当時のサイトにアクセスしているはずで、
きっと報告通り [CN[BOM]] があると確認していると信じたいところですが、
他の誰も追試報告をしていないんですよね...


[59] 
[CITE[HTML Standard]] は[[利用者]]の指示よりも [CN[BOM]] を最優先としていますが、
[[文字コード指定メニュー]]は [CN[BOM]] の誤認を[[上書き]]出来るべきと思われます。
[[IE]] や [[Safari]] や [[Chrome]] の挙動に合わせた規定のようです [SRC[>>68]]
が、十分に検討されずに仕様が追随しただけのようです。

[REFS[

- [67] 
[CITE@en[12897 – In some parsers, UTF-8 BOM trumps the HTTP charset attribute (Encoding sniffing algorithm)]], [TIME[2019-04-02T04:48:11.000Z]], [TIME[2025-11-08T15:21:29.731Z]] <https://www.w3.org/Bugs/Public/show_bug.cgi?id=12897>
- [68] [CITE@en[15359 – Make BOM trump HTTP]], [TIME[2019-04-02T04:48:11.000Z]], [TIME[2025-11-08T15:21:54.519Z]] <https://www.w3.org/Bugs/Public/show_bug.cgi?id=15359>
- [70] [CITE@en[17810 – Make BOM trump HTTP]], [TIME[2019-04-02T04:48:11.000Z]], [TIME[2025-11-08T15:22:02.701Z]] <https://www.w3.org/Bugs/Public/show_bug.cgi?id=17810>
- [71] 
[CITE@en['''['''giow''']''' (3) Make a BOM override HTTP headers. · whatwg/html@947be85 · GitHub]], [TIME[2025-11-08T15:22:44.000Z]] <https://github.com/whatwg/html/commit/947be85f5d985de120a58c7832bf428cdf36e222#diff-41cf6794ba4200b839c53531555f0f3998df4cbb01a4d5cb0b94e3ca5e23947d>
- [76] 
[CITE[现代快报多媒体数字报刊平台]], [TIME[2025-11-08T15:26:17.000Z]], [TIME[2010-12-05T14:53:27.450Z]] <https://web.archive.org/web/20101205144422/http://kb.dsqq.cn/html/2010-12/05/node_193.htm>
- [75] [CITE[鐜颁唬蹇姤澶氬獟浣撴暟瀛楁姤鍒婂钩鍙�]], [TIME[2025-11-08T15:28:54.000Z]], [TIME[2012-11-27T06:52:48.924Z]] <https://web.archive.org/web/20121127065239im_/http://kb.dsqq.cn/html/2012-09/16/node_193.htm>


]REFS]

@@
[166] 
[CITE@en[716579 - BOM should override HTTP-level charset]], [TIME[2025-12-01T08:13:10.000Z]] <https://bugzilla.mozilla.org/show_bug.cgi?id=716579>


*** HTTP/MIME [CODE[charset]]

[138] 
[[encoding sniffing algorithm]] は[[転送プロトコル]]の[[文字符号化]]を使います。
[SRC[>>104]]

[139] 
[CITE[HTML Standard]] は抽象化して明言していませんが、
[[HTTP]] や [[MIME]] の [CODE[Content-Type:]] [[ヘッダー]]の [[MIME型]]の
[CODE[charset]] [[引数]]の記載がこれに該当します。

;; [140] 理論上は他の[[プロトコル]]の同様の指定も該当し得ますが、
実例があるのかは不明です。

[141] 
ただし [[Webブラウザー]]の実装上は[[転送プロトコル]]や [[MIME型]]の個々の規定は尊重されず、
およそ一律に [CITE[Encoding Standard]] の[[符号化ラベル]]とみなされているようです。
[SEE[ [[charset]], [[文字コードの決定]], [[x-user-defined]] ]]

*** 本文内の文字コード宣言


**** [CODE[<meta chaset>]]

[SEE[ [[<meta charset>]] ]]

**** XML 符号化宣言

[SEE[ [[encoding=""]] ]]

[153] [CITE@en[673087 - XML declaration in text/html not used as an internal character encoding declaration (due to WHATWG HTML compliance)]], [TIME[2025-11-23T03:40:09.000Z]] <https://bugzilla.mozilla.org/show_bug.cgi?id=673087>



*** 環境からの継承

[131] 
明示的な指定がないときに呼び出し元の[[文字符号化]]の情報、
すなわち[DFN[環境符号化]]が使われることがあります。

[66] 
[CITE[Firefox]]
は[[フレーム]]内の[[文書]]について (他の指定がないとき) [[親閲覧文脈]]の[[文字符号化]]を継承します。
これは親と子が同じ[[文字コード]]のとき有効な推定ですが、
意外な罠があって、[[フレーム文書]]は [[ASCII文字]]のみで構成されることが意外と多く、
そのために[[フレーム]]内が[[文字化け]]する事例が散見されます。
[[Windows-1252]] は継承しないという配慮が必要なのでしょう。


[147] >>66 [CITE[Chrome]]
は同じように[[フレーム文書]]が[[ASCII文字]]だけで [[Windows-1252]]
と判定されているときでも、
[[フレーム]]内は [[Windows-1252]] と判断しないで内容で判断しているようです。
妥当な挙動でしょう。


@@
[BOX[

- [149] 
[CITE@en[6118 – Investigate not using the frameset charset as a default for frames]], [TIME[2025-11-16T05:54:03.000Z]] <https://bugs.webkit.org/show_bug.cgi?id=6118>
- [148] [CITE@en[14683 – Incorrect charset at http://star.vnet.cn]], [TIME[2025-11-16T05:53:31.000Z]] <https://bugs.webkit.org/show_bug.cgi?id=14683>
-[143] [CITE@en[Web Applications 1.0 r7544     More detail on the inheritance of encodings from parent browsing contexts.]]
( ([TIME[2012-11-25 14:33:00 +09:00]] 版))
<http://html5.org/tools/web-apps-tracker?from=7543&to=7544>

[159] 
[CITE[Javascriptの外部ファイル内でdocument.writeしたら文字化け(Mac IE 4.5編)]], [TIME[2020-08-20T23:49:04.000Z]], [TIME[2025-11-23T05:59:03.222Z]] <https://www.shtml.jp/mojibake/macie45.html>

[160] 
[CITE[JSファイル内でdocument.writeしたら文字化け(Macネスケ4.7編)]], [TIME[2020-08-20T23:49:06.000Z]], [TIME[2025-11-23T06:00:09.388Z]] <https://www.shtml.jp/mojibake/mac_euc_js.html>


]BOX]

**** 異なる起源からの継承

[132] 
限定的な状況で、[[異なる起源]]で指定された[[文字符号化]]の情報が使われます。
他の[[起源]]への情報漏洩ですから、注意が必要です。

@@
- 他の[[起源]]の[[文字符号化]]の情報の流出
- 他の[[起源]]による[[資源]]の[[文字符号化]]の指定

*** 文字出現頻度解析等の手法

[105] 
[[HTML]] や[[平文文書]]の [[navigate]] のための[[判定][文字コードの判定]]の処理
([[encoding sniffing algorithm]])
では、
[DFN[頻度解析等の手法]] (frequency analysis or other algorithms)
を適用することが[MAY[認められています]]。
[SRC[>>104]]

[107] 
[CITE[HTML Standard]] は、[[ネットワーク]]から取得した[[資源]]の[[符号化]]を[[自動判定][文字コードの判定]]しようとすることは、
[RUBYB[一般に勧められない][generally discouraged]]、なぜならば本質的に[[相互運用可能]]ではない[[発見的手法]]に拠ることになるからだ、としています。 [SRC[>>104]]
[[仕様書]]が[[頻度解析等の手法]]を[MAY[認める]]だけで[MUST[必須]]とはしていないのは、
これが理由ということなのでしょう。確かに、 [[HTTP]] [CODE[charset]] 
や [CODE[<meta charset>]] の処理と違って[[頻度解析等の手法]]を[[標準化]]するのは困難で、
従ってあるデータがどう解釈されるかが[[実装依存]]にならざるを得ません。

[106] しかし、現実の [[Web]] には [[HTTP]] [CODE[charset]] も 
[CODE[<meta charset>]] も指定されてない [[Webページ]]が散見されるのであり、
[[頻度解析等の手法]]は[[Web互換性]]のため事実上[MUST[必須]]の処理です。
[[仕様書]]が何と言おうと、[[実装]]は[[頻度解析等の手法]]を適用する以外の選択肢を持ちません。

;; [108] あたかも[[頻度解析等の手法]]を実装しないことが好ましいような記述が[[仕様書]]に含まれてしまっているせいで新規の実装が却って[[相互運用性]]の低い状態に誘導されてしまうリスクがあり、不適切といえます。

-*-*-

[110] 
[[頻度解析等の手法]]について、 [CITE[HTML Standard]] は [[UNIVCHARDET]]
を [[non-normative reference]] として提示しています。
[SRC[>>104]]
実装方法はこれに限定されていません。

- [111] [CITE[IE]] は独自の方法を実装していました。
- [112] [CITE[Mozilla Suite]] / かつての [CITE[Firefox]] は [[chardet]] を使っており、
その後 [[UNIVCHARDET]] を使い始めました。
- [113] [CITE[WebKit]] は [CITE[ICU]] の[[文字コードの判定]]を使っています。
- [114] [CITE[Chrome]] は [CITE[Compact Encoding Detection]] を使っています。
- [115] 現在の [CITE[Firefox]] は [CITE[chardetng]] を使っています。


[109] 
[[頻度解析等の手法]]は、対象となるデータの[[バイト列]]の他に、
[[文書の番地]]その他の[[メタ情報]]を使うことができます。
[SRC[>>104]]
実際に [[Webブラウザー]]の[[文字コードの判定]]の実装は [[URL]]
やその [[TLD]] を判定条件の1つとして使っています。

[116] 
[[頻度解析'''等'''の手法]]の選択肢について具体的な限定はありません。
[[バイト]]の出現頻度の他に、
[[符号構造]]、
[[ASCII文字]]状[[バイト列]]の出現状態、
[[HTMLタグ]]状[[バイト列]]の出現状態、
[[URL]]、
[[ロケール]]設定などを総合的に勘案できます。
[SEE[ [[文字コードの判定]] ]]

[63] 
[CODE[-*- coding -*-]]
のような [[Web]] 以外の[[文字コードの指定]]の方法
[SEE[ [[文字コードの判定]] ]]
を[[頻度解析等の手法]]の一種として採用することも可能と考えられます。
[[HTML文書]]では効果も薄いでしょうが、
[[テキストファイル]]への [[navigate]] 
では有効な場合がありそうです。

[121] 
[[頻度解析等の手法]]の対象範囲となる長さについては規定がありません。
[CODE[<meta charset>]] は1024バイトが目安となっていますが [SEE[ [[資源ヘッダー]] ]]、
[CODE[head]] が大きい場合など 1024 バイトでは[[頻度解析等の手法]]にとって十分な長さでないことが多いです。

;; [123] 特に [[Internet Archive]] は文書の先頭付近にメニューを挿入するため、
本体部分がかなり後ろの方にずれてしまいます。


**** UTF-8 の検知

[93] 
[[頻度解析等の手法]]によって [[UTF-8]] を判定することについては、
技術的問題から離れた主義主張があるようで、いくらか混乱した状態になっています。

[100] 
ほとんどの[[プラットフォーム]]において[[ローカルファイル]]の[[文字コード]]は[[ファイルシステム]]等から確定的な情報を得ることが不可能ですから、
[CODE[file:]] [[URL]] から取得した[[ファイル]]の処理では[[頻度解析等の手法]]の適用が必須となります。
ただ、[[仕様書]]は [CODE[file:]] の挙動を定めておらず、各実装の処理にも差異があります。

[101] 
一般論として、[[ファイル]]の全体が読める場合、それが [[UTF-8]] 
かどうかは高い確度で判定できます。現代の[[テキストファイル]]の大部分が [[UTF-8]]
ですから、[[ローカルファイル]]の先頭の十分な大きさを取得し、 [[UTF-8]]
らしさが高ければ、これを [[UTF-8]] と判定するのが良いと考えられます。
大きすぎるファイルや長さが確定していない 
(書き込み中ないし無限の長さのストリームを扱える[[プラットフォーム]]における)
[[ファイル]]のときは、適当な長さで打ち切る必要があります。

[102] 
[[ローカルファイル]]は [[Unicode]] 以前の[[文字コード]]のファイルの可能性も高く、
頻度解析等の手法によって判定する必要があります。
[[Linux]]、 [[Mac OS X]]、 [[Cygwin]] 等では [[POSIXロケール]]の[[符号集合]]が使われている可能性があります
(ただし現代ではこれも [[UTF-8]] のことが多いです)。
[[Windows]] では [[ANSIコードページ]]や [[OEMコードページ]]が使われている可能性があります。
更に、 [[Webブラウザー]]や [[OS]] の[[言語設定]]に応じた当地の[[文字コード]]の可能性があります。

[EG[
[103] 例えば[[日本語]] ([[言語タグ]] [CODE[ja]], [[POSIXロケール]] [CODE[ja_JP]])
が設定されている環境では、 [[UTF-8]] の他に[[シフトJIS]]や[[日本語EUC]]や [[ISO-2022-JP]]
の[[ファイル]]がある可能性が少なくないので、これらを優先的に判定するのが望ましいと考えられます。
]EG]

[155] 
なお、これに関する被害報告は[[Webブラウザーによる文字コード判定の失敗事例集]]参照。

[REFS[

-
[11] [CITE@en[815551 – Autodetect UTF-8 by default]]
( ([TIME[2014-05-05 08:06:31 +09:00]] 版))
<https://bugzilla.mozilla.org/show_bug.cgi?id=815551>
-
[12] [CITE@en[Bug 25534 – HTML spec should not encourage to auto-detect UTF-8]]
( ([TIME[2014-05-05 08:06:57 +09:00]] 版))
<https://www.w3.org/Bugs/Public/show_bug.cgi?id=25534>
-
[90] 
[CITE@en[1071816 - Support loading BOMless UTF-8 text/plain files from file: URLs]], [TIME[2025-11-08T11:42:26.000Z]] <https://bugzilla.mozilla.org/show_bug.cgi?id=1071816>
-
[92] 
[CITE@en[760050 - Character encoding auto-detect fails on UTF-8 text file (regarded as TIS-620)]], [TIME[2025-11-08T11:44:44.000Z]] <https://bugzilla.mozilla.org/show_bug.cgi?id=760050>
- [146] 
[CITE['''['''whatwg''']''' Guessing the fallback encoding from the top-level domain name before trying to guess from the browser localization]], [TIME[2025-09-26T07:05:54.000Z]], [TIME[2025-11-09T09:18:54.675Z]] <https://lists.whatwg.org/pipermail/whatwg-whatwg.org/2013-December/041819.html>
- [145] 
[CITE@en[GitHub - hsivonen/chardetng: A character encoding detector for legacy Web content.]], [TIME[2025-11-09T09:18:18.000Z]] <https://github.com/hsivonen/chardetng?tab=readme-ov-file#notes-about-encodings>
- [151] 
[CITE@en[charset / encoding detection can't decode UTF-8 without BOM correctly '''['''40512321''']''' - Chromium]], [TIME[2025-11-23T03:21:23.000Z]] <https://issues.chromium.org/issues/40512321>
- [152] 
[CITE@en[Use UTF-8 as default for plaintext content '''['''41352127''']''' - Chromium]], [TIME[2025-11-23T03:25:41.000Z]] <https://issues.chromium.org/issues/41352127>
- [154] [CITE@en[1497037 - Default Firefox encoding should be Unicode (UTF-8) and not Western]], [TIME[2025-11-23T03:49:27.000Z]] <https://bugzilla.mozilla.org/show_bug.cgi?id=1497037>


]REFS]

[158] 
[CITE[Googleの検索結果のサマリーが文字化け]], [TIME[2020-08-20T23:48:51.000Z]], [TIME[2025-11-23T05:52:33.311Z]] <https://www.shtml.jp/mojibake/google.html>


**** フォント依存符号化の検知

[117] 
[[8ビット符号]]系の[[フォント依存符号化]]を使った [[Webページ]]の多くは、
[[Windows-1252]] として処理されることを前提とした[[フォント]]を使っています。
[SEE[ [[フォント依存符号化]] ]]

[118] 
[[encoding sniffing algorithm]] は、そうした[[HTML文書]]を他の[[文字コード]]ではなく
[[Windows-1252]] と判定する必要があります。

[119] 
[CODE[<meta charset>]] として [CODE[ISO-8859-1]], [CODE[Windows-1252]],
[CODE[x-user-defined]] が指定される場合には、 [[Windows-1252]] として処理されるので、
特に問題となりません。

[120] 
[CODE[<meta charset>]] にその他の値 (当該[[フォント依存符号化]]を表す
[CITE[Encoding Standard]] の[[符号化ラベル]]ではない値など)
が指定された場合や、 [CODE[<meta charset>]] 等が存在しない場合には、
[[頻度解析等の手法]]の対象となりますが、ここで [[Windows-1252]]
''以外''と判定してしまうと、[[文字化け]]になります。

[125] 
すべての[[フォント依存符号化]]をバイト出現頻度によって検知することは困難なので、
現実的な手法としては、 [CODE[<meta charset>]] の prescan と同様の方法によって
[CODE[<font face>]] を検出し、[[フォント名]]が既知の[[フォント依存符号化]]の[[フォント]]であるとき、
[[フォント依存符号化]]が使われているとみなしてバイト出現頻度による推定を無効化することになります。
ただし、 [[UTF-8]] の検知はそれよりも優先させるべきです。


**** ASCII の検知

[133] 
[[頻度解析等の手法]]が [[ASCII文字]]のみを検知したときの扱いは注意が必要です。

[134] 
[[復号]]だけを目的とするなら [[Windows-1252]] や [[UTF-8]] と検知しても問題にはなりませんが、
[[環境符号化]]や[[文書の文字符号化]]という形で[[非ASCII文字]]の扱いに間接的に寄与することがあります。

[EG[
[135] 実際に >>66 のような事例があります。
]EG]

[136] 
例えば[[日本語]]の [[HTML文書]]がたまたま短くて[[非ASCII文字]]を含まないときは、
[[Windows-1252]] と判定するより、[[シフトJIS]]と判定した方が有益な可能性があります。
そのためには、 [[ASCII文字]]のみの入力に対し、[[頻度解析等の手法]]は結果を返さず、
後続の[[ロケール]]依存の既定値を設定する手順に進ませるのが良いと考えられます。

[137] 
[[Web]] 以外の用途を想定した判定器はこうした状況を考慮していないことがあるので、
[[encoding sniffing algorithm]] の実装時には判定器の選択や設定に注意が必要となります。


*** x-user-defined の読み替え

[SEE[ [[x-user-defined]] ]]

*** ロケール依存の既定値

[142] 
他の方法で決められないときの既定値は[[ロケール]]依存とされています。
[SEE[ [[文字コードの決定]] ]]


** 事例

[SEE[ [[Webブラウザーによる文字コード判定の失敗事例集]] ]]

[65] 
[[文字コードの判定]]を助けるため、紛らわしい他の[[文字コード]]に出現しない[[文字]]を含める技法を使うことがあります。
[SEE[ [[文字コードの判定]] ]]


** セキュリティー

[SEE[ [[sniffing]] ]]

[SEE[ [[文字のセキュリティー]] ]]


*** Web ブラウザー個別の詳細

[SEE[ [[BBB]] ]]


** 歴史

[62] [CITE@en[Editorial: further cleanup "abort these steps"]]
([[shreyateeza]]著, [TIME[2018-01-09 20:22:36 +09:00]])
<https://github.com/whatwg/html/commit/99e2cdfc484c2ff14cbf5c38b859f4d6da17e64c>


[84] 
[CITE@en[1280556 – Encoding detection mismatch on http://www.idpf.org/epub/pgt/]]
([TIME[2016-06-25 20:58:34 +09:00]])
<https://bugzilla.mozilla.org/show_bug.cgi?id=1280556>






[FIG(quote)[
[FIGCAPTION[
[122] [CITE[IRC logs: freenode / #whatwg / 20150803]]
([TIME[2015-08-04 13:28:24 +09:00]] 版)
<http://krijnhoetmer.nl/irc-logs/whatwg/20150803>
]FIGCAPTION]

> 
> # '''['''17:23''']''' <hsivonen> SimonSapin: I can't recall why I implemented the late <meta> thing in the new parser
> # '''['''17:23''']''' <hsivonen> SimonSapin: initially, I make the detectors see at most 1024 bytes so that they couldn't trigger a reload
> # '''['''17:23''']''' <hsivonen> SimonSapin: but that broke Japanese Planet Debian
> # '''['''17:24''']''' <hsivonen> SimonSapin: and people get really nervous if you break a Japanese site

]FIG]


[124] [CITE@en[Let the Encoding standard deal with the BOM · whatwg/html@83ebb72]]
([TIME[2016-02-10 22:46:18 +09:00]] 版)
<https://github.com/whatwg/html/commit/83ebb728198801e2f1a32b80ec7d7a2e7dccc593>

[129] >>124 の変更により、[[利用者]]の指示や [[XHR]] の指示などによる上書きよりも
[[BOM]] が最優先されるようになりました。また、 [[BOM]] があると [F[confidence]]
が [[certain]] に設定されていたのがなくなったので、 [[BOM]]
があっても他の指定が優先されたり、[[符号化の変更]]が実行されたりするようになりました
(もっとも結局 [[BOM]] が最優先されるので、最終的な結果は変わりません)。

[83] >>129 この不具合はその後修正されています。


[167] 
[CITE@en[White spots in HTML5's encoding sniffing algorithm | Målform]], [TIME[2025-12-01T08:13:43.000Z]] <https://malform.no/blog/white-spots-in-html5-s-encoding-sniffing-algorithm>



* 文字列からバイト列への変換


[42] [[符号化]]は、次の場面で用いられます。

[FIG(list middle)[ [79] [[符号化]]が呼び出される場面
- [[UTF-8符号化]]
- [[URL構文解析器]]の [[query][URL query]]
- [CODE(MIME)@en[application/x-www-form-urlencoded]] の[[符号化]]
- [CODE[multipart/form-data]] の[[符号化]]


]FIG]

[45] 
[[UTF-8符号化]]ではない[[符号化]]操作は、 [[UTF-8]] 以外の[[文字コード]]の[[符号化器]]を呼び出すことがあるものです。


[43] 
[[Webプラットフォーム]]において[[文字列]]が[[バイト列]]に変換される操作は多いですが、
その大部分は [[UTF-8符号化]]を使っています。
[[ASCII文字]]のみで[[同型符号化]]を使う操作も多いです。

[44] 
それ以外で[[符号化]]が呼び出される場面はごくわずかですが、
実行回数でいえばかなり多くなるはずです。

;; [46] 
なお [CODE[TextEncoder]] は [[UTF-8]] 以外に対応していません。


* 時代区分

[168] 
[[Webにおける文字コード]]の利用に着目すると4期に[[時代区分]]できます。

= [169] 第I期 : 各地の在来[[文字コード]]体系が混沌と利用された時代
= [170] 第II期 : 各地の在来[[文字コード]]の主要なものへと収束しつつ
[CODE[charset]] の明示が基本となった時代
= [171] 第III期 : [[UTF-8]] への切り替わりが進んだ時代
= [172] 第IV期 : [[UTF-8]] が基本となった時代

[173] [[時代]]の移り変わりは[[地域]]と[[言語]]によって差があります。
この大枠とは少し違った変化を経た地域もあります。
[[欧米]]の[[Webブラウザー事業者]]が積極的に扱った[[欧米]]や[[東アジア]]と、
それがなく地元民の自助的取り組みに依存していた[[アジア]]の多くの地域とでも違いがあります。

[174] 
全世界的に見れば、ちょうど[[平成時代]]までが第III期に属し、
[[令和時代]]が第IV期といえます。

[175] 
各時代によって [[Webプラットフォーム]]関連仕様の理論的な考え方、
[[Webブラウザー]]の実装の構造、
[[Webページ]]の実態、
[[Web開発]]の現場での取り扱いの方法が変化しています。

[176] 
[[Web]] の世界の内部の事情による変化や [[Webアプリケーション]]の流行に伴う変化もあれば、
[[OS]] や [[Unicode]] の変化、人気の[[プログラミング言語]]の変化などに伴うものもあり、
複合的に作用しています。



* なかったことにされている Web 草創期の文字コード

[3] 
現在の[[Webブラウザー]]が対応していない[[文字コード]]規格も過去には各種いろいろ使われていました。

[4] 
今でも、古くから残っている[[ウェブサイト]]や [[Internet Archive]]
でたまに見かけるのですが、残念ながら通常の
[[Webブラウザー]]では[[文字化け]]にしか見えません。

[FIG(short list)[ [5] [CITE[[[Encoding Standard]]]] にない[[Web]]の[[文字コード]]
- [[MacJapanese]]
- [[シフトJIS (iモード)]]
- [[シフトJIS (au)]]
- [[シフトJIS (SoftBank)]]
- [[Shift_JISX0213]]
- [[Haddis]]
- [[CP852]]
- [[ISO646-YU]]
- [[CROASCII]]
- [[PASCII]]
- [[JISエチオピア文字]]
- [[SERA]]
- [[HZ]]
- [[VIQR]]
- [[VSCII]]
- [[VISCII]]
- [[ISO-2022-CN]]
- [[ISO-2022-KR]]
- [[7ビットISO 2022]]
- [[Big5-UAO]]
- [[TAB]]
- [[TAM]]
- [CODE[GEO8-GOV]]
- [[Unicode 1.1]]
- [[Zawgyi]]
- [[UTF-7]]
- [[UTF-32]]
- [[EBCDIC]] 各種
- [[フォント依存符号化]]各種
- [[EUDC]], [[PUA]] 各種
- [[テキスト形式TRONコード]]
- [[シフトJIS文字参照]]
- [[文字コードの混在]]
]FIG]

[97] 
20世紀末から21世紀初頭に作られた膨大な人類の遺産が切り捨てられている現状は実に嘆かわしいものです。

[98] 
[[Internet Archive]] にしか残っていないようなものはさすがに仕方がないとしても、
まだ現役の普通のウェブサイトにあるページすら読めないものが出てきているのは、
本当に困ったものです。

[SEE[ [[読めなくなったファイル]] ]]


[178] 
現在の [CITE[HTML Standard]] は、 [[利用者エージェント]]に対し、
[CITE[Encoding Standard]]
の[[符号化]]に対応し[MUST[なければならない]]こと、
それ以外の[[符号化]]に対応しては[MUST[ならない]]ことを定めています。
[SRC[>>177]]

[179] 
しかし忠実にこれに従うと、現実の [[Webサイト]]に存在する [[HTML文書]]で読めないものがでてきます。
つまりこの規定は[[Web互換]]ではありません。

[180] 
実際の [[Webブラウザー]]の中にもいくつか他の[[文字符号化]]に対応しているものがあります。

[181] 
[[Webブラウザー]]以外の[[利用者エージェント]]の中には更に多くの[[文字符号化]]に対応しているものがあります。


-*-*-


[185] 
[CITE[Encoding Standard]] は個々の事情を無視して強引に開発された雑な面があり、
態度が一貫していない箇所も散見されます。

[186] 
[[GBK]] はなぜか [[gb18030]] と別で特別扱いされています。
互換性のためと説明されていますが、他の[[文字符号化]]にも同様の事情があっても無理に統合しているものがいくつもあるわけで、
筋は通っていません。


* 歴史

** Web の日本語化


- [13] [CITE[WWW Browsers that can display Japanese]], [TIME[2024-08-30T09:26:30.000Z]], [TIME[1998-02-08T02:07:51.085Z]] <https://web.archive.org/web/19980208020014/http://www.ntt.co.jp/japan/note-on-JP/browsers.html>
-- [14] [CITE[Japanese Encoding Methods]], [TIME[2024-08-30T09:26:52.000Z]], [TIME[1998-02-08T02:08:21.329Z]] <https://web.archive.org/web/19980208020006/http://www.ntt.co.jp/japan/note-on-JP/encoding.html>
- [15] [CITE[netscape-j.info.eng file]], [TIME[2024-08-30T09:27:03.000Z]] <https://web.archive.org/web/19961128190942/http://condor.stcloud.msus.edu:20020/netscape.html>
- [16] [[ISO-2022-JP]] にも関連事項

[17] 
[[Dan Connolly]] の過去ファイルアーカイブ ([SEE[ [[HTMLの仕様書]] ]])
にある 
[CODE[MarkUp.html,v]]
によるとかつて [CODE[info.cern.ch]] にあった [[HTMLの仕様書]]には[TIME[1994-04-12]]時点で

>
[PRE[
<H2>For developers</H2>
<DL>
[SNIP[]]
<DT><A
NAME="z40" HREF="http://www.ntt.jp/japan/note-on-JP/encoding.html">Japanese encoding</A>
<DD> How Japanese characters
have been encoded within HTML
]PRE]

と [[NTT]] ウェブサイトへの参照があったようです。

[19] このリンクがいつまで残っていたのかわかりません。

[20] [[JPドメイン]]の再編で [[URL]] が変わってからもしばらくは参照先の頁は残っていたようで、
>>18 に[TIME[平成9(1997)年][1997]]時点の参照が、
>>14 に[TIME[平成10(1998)年][1998]]時点の複製があります。

[REFS[

- [18] [CITE[TLUG Mailing List]], [[Jim Schweizer - webmaster TLUG]], [TIME[2007-05-20T03:27:20.000Z]], [TIME[2024-08-30T09:29:37.681Z]] <https://lists.tlug.jp/ML/9711/msg00112.html>

]REFS]


[156] 
[CITE[Yahoo! JAPAN - 文字化け対策]], [TIME[2025-11-23T05:40:32.000Z]], [TIME[2003-02-12T18:00:31.619Z]] <https://web.archive.org/web/20030212174858/http://docs.yahoo.co.jp/docs/help/mojibake/index.html>


[157] 
[CITE[Yahoo! JAPAN - Netscape 3.xをお使いの方へ]], [TIME[2025-11-23T05:42:13.000Z]], [TIME[2003-02-12T20:18:13.903Z]] <https://web.archive.org/web/20030212201640/http://docs.yahoo.co.jp/docs/help/mojibake/space.html>

[164] 
[CITE[Yahoo!]], [TIME[2025-11-26T05:54:24.000Z]], [TIME[1999-01-17T06:24:22.615Z]] <https://web.archive.org/web/19990117062145/http://www.yahoo.com/docs/info/bridge.html>

[165] 
[CITE[Yahoo!]], [TIME[2025-11-26T05:55:39.000Z]], [TIME[1999-01-17T03:02:28.012Z]] <https://web.archive.org/web/19990117025838/http://www.yahoo.com/docs/info/kbridge.html>


** Web の多言語化、初期の試み

[40] 
[CITE[Sample Pages for Various Character Sets]], [TIME[2025-06-17T02:23:42.000Z]], [TIME[2006-05-12T03:58:22.300Z]] <https://web.archive.org/web/20060512035632/http://vancouver-webpages.com/multilingual/>

[41] [CITE[Une indigestion de jeux de caractères]], [TIME[2025-06-20T11:52:03.000Z]], [TIME[1997-05-02T05:03:35.837Z]] <https://web.archive.org/web/19970502020520/http://www.ics.uci.edu/pub/ietf/html/multilingual.html>



[54] 
[CITE@ja[IE3.01 MojiBake]], [TIME[2025-11-02T12:39:40.000Z]] <https://groups.google.com/g/fj.net.infosystems.www.browsers/c/wnawyNwhm_I/m/CD7Ej3R0UOMJ>

>
[PRE[
おかしな実装の例としては、(私の場合、全て MS-Windows95 での話ですが、)
Netscape Navigator の Version 2 が、そうなっていました。
x-sjis は解釈できるが、Shift_JIS では文字化けしました。
Version 3/4 では、Shift_JIS を正しく解釈します。


但し、Version 4.0 Preview Release 2 には、Navigator の Encoding と、
META タグで指定された charset とが一致していない場合に、
<H3>Transfer Interruped !</H3>
(もう記憶があいまいですが、確かこうだった)
というものを、その時受けていたページの中に埋め込んでしまいます。
埋め込んだまま、cache に記録してしまうので、reload しても消えません。

私のページの場合、それがちょうど、表 <TABLE> - </TABLE> の中に入ってしまって、
表の表示がメチャクチャになってしまいました。

Version 4.0 Preview Release 3 では、そういうバグはありません。


それから、MS-IE 3.0/3.01 では、
META タグで charset を指定すると、かえって文字化けしやすくなる様です。
MS-IE 3.02/4.0では試していません。


さらに、Win32 版 Lynx の先月のバージョンでは、
META タグで charset を指定すると、必ず文字化けします。
もっともこれは、私が Lynx の設定をちゃんとしていないからかもしれません。
]PRE]

[55] 
<https://groups.google.com/g/fj.net.infosystems.www.browsers/c/wnawyNwhm_I/m/HURaRZwFLwYJ>

>
[PRE[
Win32 Lynx の名誉のために自分でフォローしときます。

META指定無し


<META HTTP-EQUIV="Content-Type" CONTENT="text/html; charset=Shift_JIS">

<META HTTP-EQUIV="Content-Type" CONTENT="text/html; charset=iso-2022-jp">
では、文字化けしません。

<META HTTP-EQUIV="Content-Type" CONTENT="text/html; charset=x-sjis">
だと、文字化けします。

なお、LYNX.EXE の作成日時は、97/03/14 18.19 です。
]PRE]

-[161] [CITE[Netscape Lietuvinimas]], [TIME[2025-11-24T04:37:29.000Z]] <https://hebris.tripod.com/disc2_toc.htm>
-[163] [CITE[Netscape Lietuvinimas]], [[Artūras Miežlaiškis]], [TIME[2025-11-24T04:38:57.000Z]] <https://hebris.tripod.com/bookmark/netscape/skaitom.html>


[162] 
>>161 >>163 は当時の[[リトアニア語]]処理の混沌とした状況


**

[31] 
[CITE[Charsets in Microsoft Internet Explorer 4]], [TIME[2007-11-14T17:53:13.000Z]], [TIME[2025-05-19T13:18:22.236Z]] <https://www.w3.org/International/ms-charset.html>


[21] [CITE[Re: proposed registration of type 'text/html' for MIME]], [TIME[2003-08-04T15:50:20.000Z]], [TIME[2024-09-29T07:28:49.747Z]] <https://lists.w3.org/Archives/Public/www-talk/1992NovDec/0035.html>

[22] >>21 この時点で [[TimBL]] は [[HTML]] は7ビットデータにしたがっていた。


- [29] [CITE@ja[Hebrew in xgopher and xmosaic]], [TIME[2024-10-07T08:58:55.000Z]] <https://groups.google.com/g/comp.windows.x.apps/c/rxYwpVeG5Mk/m/r-C__uoThWYJ>


- [24] [CITE[Greek Mosaic]], [TIME[2024-10-07T08:15:46.000Z]], [TIME[1997-06-07T11:12:48.666Z]] <https://web.archive.org/web/19970607111220/http://expert.cc.purdue.edu/~hsa/Mosaic.html>
- [25] [CITE[Greek Netscape]], [TIME[2024-10-07T08:16:12.000Z]], [TIME[1997-06-07T11:13:35.680Z]] <https://web.archive.org/web/19970607111227/http://expert.cc.purdue.edu/~hsa/Netscape.html>

[26] >>24 >>25 リンク先は残念ながら未所蔵。

[28] [CITE@ja[Internationalized HTTP?]], [TIME[2024-10-07T08:29:30.000Z]] <https://groups.google.com/g/comp.infosystems.www/c/htw5XLv4Hj0/m/wPr5IAol_EIJ>

[23] 
[CITE@ja[What is standard for cyrllic HTML ? Hebrew ? Arabic ?]], [TIME[2024-10-07T07:59:17.000Z]] <https://groups.google.com/g/comp.infosystems.www.providers/c/lBJKtyujAk4/m/yRxsWMDGpZUJ>

[27] [CITE@ja[WWW and cyrillic]], [TIME[2024-10-07T08:26:42.000Z]] <https://groups.google.com/g/relcom.tcpip/c/dUBIIAE-MnM/m/i_YJic8dqjUJ>

[48] 
[CITE@en[Official Google Blog: Unicode nearing 50% of the web]], [TIME[2025-10-14T07:48:09.000Z]], [TIME[2025-10-19T12:59:41.663Z]] <https://googleblog.blogspot.com/2010/01/unicode-nearing-50-of-web.html>




- [7] [CITE@en[[[RFC 4329]]: Scripting Media Types]], [TIME[2022-11-22T07:32:55.000Z]] <https://www.rfc-editor.org/rfc/rfc4329.html#section-4>
- [9] [CITE@en[[[RFC 9239]]: Updates to ECMAScript Media Types]], [[Matthew A. Miller]], [TIME[2022-11-22T08:24:07.000Z]] <https://www.rfc-editor.org/rfc/rfc9239#section-4>

[8] >>7 [[JavaScript MIME型]]の[[文字コード]]処理 (実装された例があるかは疑わしい)



[30] 
詳しい条件は不明ながら、 [[Chrome]] はメモリー不足だと文書中から読み込むファイル ([[CSS]] 
など) の[[文字コード]]判定に失敗して [[Windows-1252]] として読み込んじゃう(ことがある)っぽいなあ。
[TIME[2024-11-08T02:11:07.500Z]]



[32] [CITE@en[compact_enc_det/util/encodings/encodings.cc at master · google/compact_enc_det · GitHub]], [TIME[2025-05-19T14:51:44.000Z]] <https://github.com/google/compact_enc_det/blob/master/util/encodings/encodings.cc>



[33] [CITE@en[Usage Statistics and Market Share of Character Encodings for Websites, June 2025]], [TIME[2025-06-15T00:41:19.000Z]] <https://w3techs.com/technologies/overview/character_encoding>


[34] 
>>33 現在表示されているデータでは 

>
UTF-8 is used by 98.7% of all the websites whose character encoding we know.

となっている。


[35] 
>>34 の通り [[UTF-8]] が今や圧倒的に多いのだろうが、古くから残る頁はこうした統計の対象になりにくいことが多いので漏れてしまう。
また、少ないデータは精度が落ちる。

[36] [[EUC-JP]] が 0.1%、 [[Shift JIS]] が 0.1% 未満となっていて [[EUC-JP]] の方が優勢になっているが、
にわかに信じがたい。 [[Shift JIS]] の頁を見ると、
[TIME[2024-09-01]]まで 0.25% と 0.3% の間だったのが[TIME[2024-12-01]]には0.05%と急激に落ちているが、その前後はほとんど横ばい。
こういう結果が出ているということは、どこか特定のサイトが [[UTF-8]] に一括変更したか、
調査対象から外れたことが疑われる。


[38] 
>>36 
[[WIndows-31J]] も同じ時期に 0.0008% から 0.0002% に減少しているのはなんか怪しい。



[37] 
また、割合が少ない文字コードを使っているドメインを見ると[[銀行]]なんかが入っていたりする。
割合が少ないからといって重要なサイト、よく見られるであろうサイトが入っていないということではない。
保守的で大規模なシステムを抱えているところが古い文字コードのままというのはよくあること。


[39] >>34 では [CODE[ansi_x3.110-1983]] なるものまで上位として挙げられている。
これは誤りと考えられるもの ([SEE[ [[ansi_x3.110-1983]] ]])。
いくら広く普及している誤りといっても、さすがにそんなものが他の諸言語の旧来[[文字コード]]に比類するようなレベルに至っているとは考えにくい。
それだけ収集範囲が偏っているとみるべき。



[49] [CITE[Character Set Test Area]], [TIME[2025-10-28T14:26:51.000Z]] <https://charsetplus.tripod.com/HTMLs/index.html>




[50] 欧米偏重の[[Webブラウザー事業者]]による従来[[文字コード]]切り捨てについてはいろいろ語るべき点があるのでしょうが、
それがわかりやすく表れているのが[[越南語]]かもしれません。

[[20世紀]]に広く用いられていた[[越南語の文字コード]]を [CITE[Encoding Standard]]
はどれ1つとして収録していません。今の [[Webブラウザー]]では[[20世紀]]の[[ベトナム]]の
[[Webサイト]]がまったく読めません。

そのかわりに [CITE[Encoding Standard]] は [[Windows-1258]]
を規定しています。 [[Windows-1258]] は [[Microsoft]]
が[[越南]]向けに開発した[[文字コード]]ですが、当時ほとんど使われておらず、
[[Web]] 上に ([[Internet Archive]] を探しても)
[[Windows-1258]] の [[Webサイト]]は皆無です。
なぜ [CITE[Encoding Standard]] にあるかといえば、他の欧米等の
Windows-125[VAR[x]]
シリーズとまとめて全 [[Webブラウザー]]が実装していたからです。
誰も現地の実態を調べていません。


- [51] [CITE@en[chardetng: A More Compact Character Encoding Detector for the Legacy Web]], [[Henri Sivonen]], [TIME[2020-06-08T16:23:51.000Z]], [TIME[2025-10-29T10:46:36.590Z]] <https://hsivonen.fi/chardetng/#legacy>


[52] 
>>51 は [[Firefox]] の[[文字コードの判定]]の実装の作り直しが[TIME[西暦2020年(令和2年)][2020]]に行われたときのものですが、
[[越南語]]は [[Unicode]] と違って [[Windows-1258]] だと[[分解]]が必要なので工夫してデータを作った!と報告してます。

でも今も当時も
[[Windows-1258]] の[[Webページ]]なんてない、あったとしても[[天然記念物]]レベルなので、
そんな[[文字コードの判定]]に対応しても誰の役にも立たないのです。

そして当時の実際の[[文字コード]]はというと、
[[VN3]], [[VISCII]], [[VPS]]
は現在の
[[Unicode]] 
の一般的な用法と同じで[[分解]]されていない[[合成済文字]]。
[[VNI]] ([[Web]] で使われた [[ANSI]] 版)
は2文字の組合せで表すことは [[Windows-1258]]
と似ていますが、組合せ方はまったく違います。
[[Windows-1258]] 専用のデータはこのどちらにも流用できません。

そんな基礎的事実を確認しないまま実装を進めているというのが現実なわけです。







[53] [CITE[Description of settings in lynx configuration file]], [TIME[2023-10-24T19:26:50.000Z]], [TIME[2025-11-02T05:10:10.462Z]] <https://lynx.invisible-island.net/lynx_help/body.html#CHARACTER_SET>


[150] [CITE['''['''whatwg''']''' Superset encodings [Re: ISO-8859-* and the C1 control range]]], [TIME[2025-09-26T07:05:51.000Z]], [TIME[2025-11-16T06:07:28.637Z]] <https://lists.whatwg.org/pipermail/whatwg-whatwg.org/2009-April/019322.html>
