ハイパーテキストマークアップ言語(HTML)を使用して作成されたWebページには、Unicodeユニバーサル文字セットで表現された多言語テキストが含まれる場合があります。UnicodeとHTMLの関係において重要なのは、HTMLドキュメントに含まれる可能性のある文字セットを定義し、それらに番号を割り当てる「ドキュメント文字セット」と、特定のドキュメントをバイト列としてエンコードするために使用される「外部文字エンコーディング」、または「文字セット」との関係です。
RFC 1866(初期のHTML 2.0標準)では、文書の文字セットはISO-8859-1と定義されていました(後のHTML標準ではWindows-1252エンコーディングがデフォルトとなっています)。RFC 2070では、ISO 10646(基本的にUnicodeと同等)に拡張されました。異なる言語の文書や異なるプラットフォームで作成された文書間で文字セットが変わることはありません。外部文字エンコーディングは、文書の作成者(または作成者が文書を作成するために使用するソフトウェア)によって選択され、文書の保存や送信に使用されるバイトが文書の文字セットの文字にどのようにマッピングされるかを決定します。選択された外部文字エンコーディングに存在しない文字は、文字実体参照によって表現できます。
UnicodeとHTMLの関係は、多くのコンピュータ専門家、文書作成者、そしてウェブユーザーにとって、理解しにくいテーマになりがちです。異なる自然言語や表記体系のテキストをウェブページで正確に表現するには、文字エンコーディング、マークアップ言語の構文、フォント、そしてウェブブラウザによるサポートレベルのばらつきといった詳細が複雑に絡み合っています。
ウェブページは通常、HTMLまたはXHTMLドキュメントです。どちらのタイプのドキュメントも、基本的なレベルでは文字で構成されています。文字は、コンピュータのストレージシステムやネットワークでどのように表現されるかに関係なく、グラフェムとグラフェムに似た単位です。
HTML 文書は Unicode 文字のシーケンスです。より具体的には、HTML 4.0 文書は HTML文書文字セット の文字で構成される必要があります。この文字セットは、各文字に一意の非負整数コードポイントが割り当てられた文字レパートリーです。このセットは HTML 4.0 DTDで定義されており、有効な HTML 文書を生成できる構文 (許容される文字シーケンス) も規定しています。HTML 4.0 の HTML 文書文字セットは、 Unicodeと ISO/IEC 10646 (ユニバーサル文字セット(UCS))で共同で定義されている文字のほとんどすべてを含みますが、すべてではありません。
HTML文書と同様に、XHTML文書もUnicode文字のシーケンスです。ただし、XHTML文書はXML文書であり、明示的な「文書文字」抽象化レイヤーは持ちませんが、Unicode/UCS文字定義のほとんど(すべてではない)を網羅する、同様の許容文字定義に依存しています。HTMLとXHTML/XMLで使用される文字セットは若干異なりますが、これらの違いは一般的な文書作成者にはほとんど影響を与えません。
ドキュメントが HTML か XHTML かにかかわらず、ファイルシステムに保存されるとき、またはネットワーク経由で送信されるとき、ドキュメントの文字は特定の文字エンコーディングに従ってビットオクテット(バイト)のシーケンスとしてエンコードされます。このエンコーディングは、任意の Unicode 文字を直接エンコードできるUTF-8のようなUnicode 変換フォーマットである場合もあれば、 Windows-1252のような、直接エンコードできないレガシー エンコーディングである場合もあります。ただし、すべての Unicode 文字をサポートしていないエンコーディングを使用する場合でも、エンコードされたドキュメントでは数値文字参照が使用されることがあります。たとえば、(☺) は Unicode 文字セットの笑顔の文字を示すために使用されます。☺
数値文字参照に頼らずにすべての Unicode 文字をサポートするには、Web ページは Unicode 全体をカバーするエンコーディングを備えている必要があります。最も一般的なのはUTF-8で、英語の文字、数字、その他の一般的な文字などのASCII文字は ASCII に対して変更されずに保持されます。これにより、HTML コード ( <br>や<div>など) は ASCII と比較して変更されません。ASCII 範囲外の文字は 2~4 バイトで格納されます。また、ほとんどの文字が可変エンディアンで 2 バイトとして格納されるUTF-16 を使用することもできます。これは最新のブラウザでサポートされていますが、あまり一般的ではありません。
従来のエンコーディングの制限を回避するため、HTML は、数値文字参照を使用して、HTML ドキュメント内で Unicode 全体の文字を表現できるように設計されています。数値文字参照とは、表現する文字の Unicode コードポイントを明示的に記述する文字のシーケンスです。文字参照はNの形式をとります。ここで、NはUnicode コードポイントの10 進数、または 16 進数です。16進数の場合は、先頭に を付ける必要があります。数値文字参照を構成する文字は、インターネットでの使用が承認されているすべてのエンコーディングで普遍的に表現できます。&#;x
この文脈での16進数のサポートは比較的新しいため、古いブラウザでは16進数で参照される文字の表示に問題が発生する可能性があります。ただし、古いブラウザではコードポイント255を超えるUnicode文字の表示に問題が発生する可能性が高いです。古いブラウザとの互換性を高めるため、16進コードポイントを10進数値に変換するのが一般的です(たとえば、の代わりに)。 合合
HTML 4 では、特定の文字エンコーディングに存在しない文字や、特定のコンテキストでマークアップに依存する文字(例えば、山括弧や引用符)を表す、標準的な 252 個の文字実体名が定義されています。これらの文字には、一般的なものもあれば、あまり知られていないものもあります。Unicode 文字は数値コードポイントで参照できますが、HTML 文書の作成者の中には、可能な限りこれらの文字実体名を使用することを好む人もいます。これは、文字実体名の方が分かりやすく、初期のブラウザでもより適切にサポートされていたためです。
文字実体は、エンティティ参照を使用することで HTML ドキュメントに含めることができます。エンティティ参照はEntityNameの形式をとり、EntityNameは実体の名前です。たとえば、 は、や と同様に、使用されている文字エンコーディングにその文字が含まれていない場合でも、 U+ 2014 :エムダッシュ文字 " — " を表します。&;———
完全なリストについては、「XML および HTML 文字実体参照のリスト」を参照してください。
HTMLを正しく処理するためには、ウェブブラウザはHTMLドキュメントのエンコードされた形式がどのUnicode文字を表しているかを特定する必要があります。そのためには、ウェブブラウザは使用されているエンコード方式を知っている必要があります。
ドキュメントがMIMEメッセージまたはHTTPレスポンスなどの MIME コンテンツ タイプを使用するトランスポートを介して送信される場合、メッセージは、Content-Type ヘッダー (例: ) を介してエンコーディングを通知することができますContent-Type: text/html; charset=UTF-8。エンコーディングを宣言するその他の外部手段も許可されていますが、ほとんど使用されません。ドキュメントが Unicode エンコーディングを使用している場合、エンコーディング情報はバイト オーダー マーク(BOM)の形式でも存在する可能性があります。最後に、エンコーディングは HTML 構文を介して宣言できます。text/htmlシリアル化の場合、ページがASCIIの拡張 ( UTF-8など、したがってUTF-16を使用している場合は除く) でエンコードされているmeta限り、要素( HTML5以降)や などを使用できます。XML としてシリアル化された HTML ページの場合、宣言オプションは、エンコーディングのデフォルト (XML ドキュメントの場合は UTF-8) に依存するか、XML エンコーディング宣言を使用するかのいずれかです。meta 属性は、XML として提供される HTML では役割を果たしません。<meta http-equiv="content-type" content="text/html; charset=UTF-8"><meta charset="UTF-8">
エンコーディングのデフォルトは、外部または内部のエンコーディング宣言がなく、バイトオーダーマークもない場合に適用されます。XML として配信される HTML ページのエンコーディングのデフォルトは UTF-8 である必要がありますが、通常の Web ページ (つまり、としてシリアル化された HTML ページtext/html) のエンコーディングのデフォルトは、ブラウザのローカライズによって異なります。主に西ヨーロッパ言語用に設定されたシステムでは、一般的にWindows-1252になります。キリル文字のロケールでは、デフォルトは通常Windows-1251です。レガシーなマルチバイト文字エンコーディングが普及している地域のブラウザでは、何らかの自動検出が適用される可能性が高いです。
プログラミング言語やオペレーティングシステムにおける 8 ビット テキスト表現の遺産と、エンコーディングのニュアンスを理解する必要性でユーザーに負担をかけたくないという願望から、HTML 作成者が使用する多くのテキスト エディタは、ファイルをディスクに保存する際にエンコーディングの選択肢を提供できないか、提供したがらないため、非常に限られた範囲を超える文字の入力さえ許可しない場合が多い。その結果、多くの HTML 作成者はエンコーディングの問題に気付かず、自分のドキュメントが実際にどのエンコーディングを使用しているのか全く知らない可能性がある。エンコーディング宣言が実際のエンコーディングの変更に影響を与えるという誤解 (実際には不正確なラベルにすぎない) も、このエディタの姿勢の理由となっている。同じ方向に寄与するもう 1 つの要因は、UTF-8 の登場である。UTF -8は他のエンコーディングの必要性を大幅に減らすため、現代のエディタは HTML5 仕様[ 1 ]で推奨されているように、デフォルトで UTF-8 を使用する傾向がある。
HTML のシリアル化 (content-type "text/html" と content/type "application/xhtml+xml") の両方において、バイトオーダーマーク (BOM) は HTML ドキュメント内でエンコーディング情報を伝達する効果的な方法です。UTF-8 の場合、BOM はオプションですが、UTF-16 および UTF-32 エンコーディングでは必須です。(注: BOM のない UTF-16 と UTF-32 は正式には別の名前で知られており、異なるエンコーディングであるため、何らかの形式のエンコーディング宣言が必要です。UTF -16BE、UTF-16LE、UTF-32LE 、およびUTF-32BEを参照してください。) BOM 文字 (U+FEFF) を使用すると、エンコーディングが自動的に処理アプリケーションに宣言されます。処理アプリケーションは、バイトストリーム内の先頭の 0x0000FEFF、0xFEFF、または 0xEFBBBF を探すだけで、ドキュメントがそれぞれ UTF-32、UTF-16、または UTF-8 でエンコードされていることを識別できます。これらのエンコーディングには、バイトオーダーマークに処理アプリケーションに必要なすべての情報が含まれているため、追加のメタデータメカニズムは必要ありません。ほとんどの場合、バイトオーダーマーク文字は編集アプリケーションによって他の文字とは別に処理されるため、作成者がバイトオーダーマークを削除したり変更したりして誤ったエンコーディングを示すリスクはほとんどありません(エンコーディングが英語/ラテン文字で宣言されている場合に発生する可能性があります)。ドキュメントにバイトオーダーマークがない場合、HTML ドキュメントの最初の空白でない印刷可能な文字が "<" (U+003C) であるという事実を使用して、UTF-8/UTF-16/UTF-32 エンコーディングを判断できます。
多くのHTMLドキュメントは、不正確なエンコーディング情報、あるいはエンコーディング情報が全く含まれていない状態で配信されます。このような場合にエンコーディングを判別するために、多くのブラウザではユーザーがリストからエンコーディング名を手動で選択できるようになっています。また、エンコーディングの自動検出アルゴリズムを採用している場合もあります。このアルゴリズムは、手動での上書きと連携して動作するものもあれば、BOMやXMLとして配信されるHTMLの場合には、手動での上書きに対抗して動作するものもあります。
シリアル化される HTML ドキュメントの場合text/html、手動オーバーライドはすべてのドキュメントに適用される場合もあれば、宣言やバイトパターンを見てもエンコーディングが判別できないドキュメントにのみ適用される場合もあります。手動オーバーライドが存在し、広く使用されているという事実は、Web 上で正確なエンコーディング宣言を採用することを妨げており、したがってこの問題は継続する可能性が高いです。ただし、Internet Explorer、Chrome、Safari は、XMLとシリアル化の両方において、ページに BOM が含まれている場合はエンコーディングのオーバーライドを許可しないことに注意してください。[ 2 ] text/html
推奨XMLラベル「」でシリアル化されたHTMLドキュメントの場合、手動でのエンコーディングの上書きは許可されていません。このようなXMLドキュメントのエンコーディングを上書きすると、検出可能なエラーのあるエンコーディング宣言を持つXMLドキュメントは致命的なエラーとなるため、ドキュメントがXMLでなくなることになります。現在、FirefoxなどのGeckoブラウザはこのルールに従っていますが、Webkitブラウザ(Chrome/Safari)[ 3 ]など、HTMLをXMLとしてサポートする他の一般的なブラウザの大部分は、 XHTMLドキュメントのエンコーディングを手動で上書きすることを許可しています。 application/xhtml+xml
多くのブラウザは、Unicodeの全コードのうちごく一部しか表示できません。以下は、ブラウザがさまざまなUnicodeコードポイントをどのように表示するかを示したものです。
Mozilla Firefox、Opera、Safari、Internet Explorer (バージョン7以降)などの一部のWebブラウザは、ページ上の各文字を表示するフォントをインテリジェントに選択することで、多言語Webページを表示できます。適切なフォントがオペレーティングシステムに存在していれば、Unicodeブロックのあらゆる組み合わせを正しく表示します。
Netscape Navigator 4.77 やInternet Explorer 6などの古いブラウザでは、ページの文字エンコーディングに関連付けられた現在のフォントでサポートされているテキストしか表示できず、数値文字参照を Unicode コードポイントへの参照ではなく、現在の文字エンコーディング内のコード値への参照として誤って解釈する場合があります。このようなブラウザを使用している場合、コンピュータにすべてのフォントがインストールされている可能性は低く、また、ブラウザが同じページで使用可能なすべてのフォントを使用できる可能性も低いでしょう。そのため、上記の例のテキストは正しく表示されませんが、一部は表示される可能性があります。ただし、これらのテキストは標準に従ってエンコードされているため、標準に準拠し、文字が使用可能なシステムであれば、正しく表示されます。さらに、名前付きエンティティ参照で使用するために名前が付けられた文字は、他の文字よりも一般的に使用できる可能性が高いです。
基本多言語面以外の文字(例えば、上の表にあるルーン文字 fehu の異体字であるゴート文字 faihu など)を表示するには、一部のシステム(Windows 2000 など)では設定を手動で調整する必要があります。
Googleのウェブインデックスの内部データによると、2007年12月にはUTF-8 Unicodeエンコーディングがウェブページで最も頻繁に使用されるエンコーディングとなり、ASCII(米国)と8859-1 / 1252(西ヨーロッパ)の両方を上回った。[ 4 ]
著者はUTF-8を使用することが推奨されます。適合性チェッカーは、著者に従来のエンコーディングを使用しないよう助言する場合があります。[RFC3629] オーサリングツールは、新規作成ドキュメントに対してデフォルトでUTF-8を使用するようにする必要があります。[RFC3629]