ハイパーテキスト マークアップ言語 ( HTML ) は 1991 年から使用されていますが、1997 年 12 月の HTML 4.0 は、国際文字が十分に処理された最初の標準化バージョンでした。 HTML ドキュメントに 7 ビットASCIIの範囲外の特殊文字が含まれている場合、情報の整合性とユニバーサルブラウザー表示という 2 つの目標を考慮する価値があります。
文書の文字エンコーディングを指定する
ドキュメント内で使用される文字エンコーディングを指定する一般的な方法は 2 つあります。
まず、ウェブサーバーは、ハイパーテキスト転送プロトコル(HTTP)ヘッダーcharsetに文字エンコーディングまたは「 」を含めることができます。これは通常、次のようになります。[1]Content-Type
コンテンツタイプ: text/html; 文字セット=utf-8
この方法は、HTTPサーバーにコンテンツネゴシエーションに応じて文書のエンコーディングを変更する便利な方法を提供します。特定のHTTPサーバーソフトウェア、たとえばモジュール mod_charset_liteを備えたApacheはこれを実行できます。[2]
2 番目に、宣言を文書自体に含めることができます。
headHTMLの場合、この情報を文書の上部近くの要素内に含めることができます。 [3]
< meta http-equiv = "Content-Type" content = "text/html; charset=utf-8" >
HTML5では、次の構文も全く同じ意味になります。[3]
<メタ 文字セット= "utf-8" >
XHTML文書には3番目のオプションがあります。それは、次のようにXML宣言を介して文字エンコーディングを表現することです。[4]
<?xml バージョン="1.0" エンコーディング="utf-8"?>
この 2 番目のアプローチでは、宣言が解析されるまで文字エンコーディングがわからないため、宣言自体を含むドキュメントでどの文字エンコーディングが使用されているかを知ることが困難です。文字エンコーディングがASCII 拡張である場合、宣言自体を含むコンテンツは純粋な ASCII であるはずであり、これは正しく機能します。UTF -16BEやUTF-16LEなど、ASCII 拡張ではない (つまり、ASCII のスーパーセットではない) 文字エンコーディングの場合、Web ブラウザーなどの HTML プロセッサーは、ヒューリスティックを使用して、場合によっては宣言を解析できるはずです。
エンコーディング検出アルゴリズム
HTML5の時点では、推奨される文字セットはUTF-8です。[3]仕様では、「エンコーディングスニッフィングアルゴリズム」が定義されており、次のような複数の入力ソースに基づいてドキュメントの文字エンコーディングを決定します。
- 明確なユーザー指示
- ドキュメントの最初の1024バイト内の明示的なメタタグ
- 文書の最初の3バイト内のバイトオーダーマーク(BOM )
- HTTPコンテンツタイプまたはその他のトランスポート層情報
- 文書バイトを分析して、特定のシーケンスまたはバイト値の範囲を探す[5]などの暫定的な検出メカニズム。
印刷可能な ASCII 範囲 (32 ~ 126) 外の文字は、通常、正しく表示されません。これは、英語圏のユーザーにはほとんど問題になりませんが、他の言語では定期的に (場合によっては常に)、その範囲外の文字が必要になります。複数の異なるマルチバイト エンコーディングが使用されている中国語、日本語、韓国語 ( CJK ) 言語環境では、自動検出もよく使用されます。最後に、ブラウザーでは通常、ユーザーが誤った文字セット ラベルを手動で上書きすることもできます。
多言語ウェブサイトや非西洋言語のウェブサイトでは、すべての言語で同じエンコーディングを使用できるUTF-8を使用することがますます一般的になっています。すべての言語で使用できるUTF-16またはUTF-32 は、バイト指向のASCII スーパーセットエンコーディングを前提とするプログラミング言語では扱いにくいことがあり、また、HTML ドキュメントの場合によくあるように、ASCII 文字を頻繁に使用するテキストでは効率が悪いため、あまり広く使用されていません。
ページが正常に表示されたとしても、必ずしもそのエンコードが正しく指定されているとは限りません。ページの作成者と読者の両方がプラットフォーム固有の文字エンコードを想定しており、サーバーが識別情報を送信しない場合でも、読者は作成者の意図どおりにページを表示しますが、異なるプラットフォームや異なるネイティブ言語を使用する他の読者には、意図したとおりにページが表示されません。
許可されるエンコード
最近のHTML標準(現在のWHATWG HTML Living Standard、および以前は競合していたW3C HTML 5.0および5.1)で参照されているWHATWGエンコーディング標準は、ブラウザがサポートする必要があるエンコーディングのリストを指定します。HTML標準では、他のエンコーディングのサポートを禁止しています。[ 6 ] [7] [8]エンコーディング標準ではさらに、新しい形式、新しいプロトコル(既存の形式が使用されている場合でも)、および新しいドキュメントの作成者はUTF-8のみを使用する必要があると規定しています。[9]
UTF-8以外にも、HTML標準自体には、エンコーディング標準を参照して、以下のエンコーディングが明示的に記載されています。[8]
- ISO-8859-2
- ISO-8859-7
- ISO-8859-8
- Windows-874 [a]
- Windows-1250
- Windows-1251
- Windows-1252 [b]
- Windows-1254 [c]
- ウィンドウズ-1255
- Windows-1256
- Windows-1257
- Windows-1258
- GB 18030 [d]
- ビッグ5 [e]
- シフトJIS [f]
- ISO-2022-JP [g]
- EUC-KR [h]
- UTF-16BE [i]
- UTF-16LE [j]
- x-ユーザー定義[k]
- ^ 、および関連ラベルにも指定されています。 [9]
TIS-620ISO-8859-11 - ^ 、および関連ラベルにも指定されています。 [9]
ASCIIISO-8859-1 - ^ および関連ラベルにも指定されています。 [9]
ISO-8859-9 - ^互換性の理由から、0xA3A0は 表意文字空間(U+3000)の重複エンコーディングとして指定され、U+E5E5(私用文字)は除外されます。[10] [11]また、0x80はユーロ記号(U+20AC、Windows-936を参照)の代替エンコーディングとして受け入れられます。[12]それ以外の場合は、2005標準のマッピングに従います。[11]
- ^ 香港補助文字セットの変種[13]。ただし、HKSCS拡張機能のほとんど(先頭バイトが0xA1未満のもの)はエンコーダには含まれず、デコーダにのみ含まれる。[14]
- ^ この仕様にはIBMとNECの拡張が含まれており[15] 、より正確にはWindows-31Jです。[13]
- ^ この仕様では、シフトJISで使用されているのと同じインデックス(可能な限り)を使用しています。つまり、NEC拡張が含まれています。半角カナはエンコーダによって全角に変換されますが、[16]デコーダではエスケープシーケンス(ESC 0x28 0x49)を使用して受け入れられます。[17] Shift OutとShift In(0x0Eと0x0F)は、攻撃を防ぐために完全に除外されています。[17] [18]
- ^ 実際には統一ハングルコード(Windows-949)であり、ハングル音節ブロック全体をカバーするスーパーセットです。[13] [19]
- ^ デコードのみ指定。UTF-16でコード化された文書からのフォーム送信はUTF-8でエンコードされる。[20]
- ^ 展開されたコンテンツとの互換性のため、プレーンラベルにも指定されていますが
UTF-16、[21]バイトオーダーマーク(BOM)が存在する場合は、どのラベルよりも優先されます。[22]デコードのみに指定されており、UTF-16でコード化された文書からのフォーム送信はUTF-8でエンコードされます。[20] - ^ 0x00から0x7FをU+0000からU+007Fにマッピングし、0x80から0xFFをU+F780からU+F7FF(プライベート使用領域の範囲)にマッピングして、コードポイントの下位8ビットが常に元のバイトと一致するようにします。[23]
以下の追加のエンコーディングはエンコーディング標準にリストされており、それらのサポートも必要です。[9]
- ^ ISO-8859-8と同じエンコーダとデコーダを使用しますが、ISO-8859-8としてラベル付けされた文書に使用される視覚順序の動作には従いません。[24]
- ^ KOI8-Uというタイトルで、とラベルの両方に指定されています。[9] 0xAEと0xBEの位置ではKOI8-RUに続きます(つまり、 Ў/ўが含まれます)[25] [26]ただし、0x93~9Fの位置ではKOI8-Uです。[25]
KOI8-UKOI8-RU - ^ および関連ラベルにも規定されている。デコード目的ではGB 18030
GB2312と同じように扱われる。 [27]エンコード目的では、GBK(またはGB 2312)としてラベル付けすると4バイトコードが除外され、U+20ACの1バイト0x80表現が優先される。[10] - ^ この仕様では、シフトJISで使用されるのと同じインデックス(EUCコードセット1の範囲内)が使用されており、NEC拡張も含まれています。JIS X 0212はデコードのみに含まれています。[28]
以下のエンコーディングは禁止されているエンコーディングの明確な例として挙げられている: [8]
この規格では、「置換」デコーダーも定義されており、特定のエンコーディングとしてラベル付けされたすべてのコンテンツを置換文字(�) にマッピングし、その処理を一切拒否します。これは、悪意のあるコンテンツを隠すためにクライアントとサーバー間でサポートされているエンコーディングの違いを悪用する可能性のある攻撃 (クロスサイトスクリプティングなど) を防ぐことを目的としています。 [29]同じセキュリティ上の懸念は、ASCII バイトのシーケンスを異なる方法で解釈できるISO-2022-JPとUTF-16にも当てはまりますが、展開されたコンテンツで比較的頻繁に使用されるため、このアプローチは実現可能とは見なされませんでした。[30]次のエンコーディングがこの処理を受けます: [31]
人物紹介
ネイティブの文字エンコーディングに加えて、文字は文字参照としてエンコードすることもできます。文字参照は、数値文字参照( 10 進数または16 進数) または文字エンティティ参照です。文字エンティティ参照は、名前付きエンティティ、またはHTML の場合はHTML エンティティと呼ばれることもあります。HTML の文字参照の使用法は、 SGMLに由来します。
HTML 文字参照
HTMLにおける数値文字参照は、 Universal Character Set / Unicode コードポイントで文字を参照し、次の形式を使用します。
&#nnnn;
または
&#xhhhh;
ここで、nnnnは10 進形式のコード ポイント、hhhhは16 進形式のコード ポイントです。XMLドキュメントでは、x は小文字でなければなりません。nnnnまたはhhhh は任意の桁数で、先頭にゼロを含めることができます。hhhh は大文字と小文字を混在させることができますが、通常は大文字を使用します。
HTML ドキュメントの受信者が使用するすべてのWeb ブラウザーや電子メール クライアント、または HTML ドキュメントの作成者が使用するすべてのテキスト エディターが、すべての HTML 文字をレンダリングできるわけではありません。最新のソフトウェアのほとんどは、ユーザーの言語の文字のほとんどまたはすべてを表示でき、レンダリングできない文字についてはボックスまたはその他の明確なインジケーターを描画します。
0 から 127 までのコード (元の 7 ビットASCII標準セット) の場合、これらの文字のほとんどは文字参照なしで使用できます。160 から 255 までのコードはすべて、文字エンティティ名を使用して作成できます。エンティティ名を使用して作成できるのは、それより番号が大きいコードの一部のみですが、すべて 10 進数の文字参照によって作成できます。
文字実体参照は、name が大文字と小文字を区別する英数字の文字列である形式にすることもできます。たとえば、「λ」はHTML 文書で のようにエンコードすることもできます。文字実体参照、、および は、マークアップを区切るためにすでに使用されているため、HTML と SGML で事前定義されています。これには、 HTML5より前のXML の (') 実体は含まれませんでした。名前付き HTML 文字実体参照のすべてと、それらが導入されたバージョンの一覧については、 「XML および HTML 文字実体参照の一覧」を参照してください。
&name;λ<>"&<>"&'
HTML 文字参照を不必要に使用すると、HTML の可読性が大幅に低下する可能性があります。Web ページの文字エンコーディングが適切に選択されている場合、HTML 文字参照が必要になるのは、通常、前述のマークアップ区切り文字といくつかの特殊文字のみです ( UTF-8などのネイティブUnicodeエンコーディングが使用されている場合は、まったく必要ありません)。また、HTML エンティティのエスケープが間違っていると、クロスサイト スクリプティングなどのインジェクション攻撃に対するセキュリティ上の脆弱性が生じる可能性があります。HTML 属性が引用符で囲まれていない場合、スペースやタブなどの特定の文字 (最も重要なのは空白) は、エンティティを使用してエスケープする必要があります。HTML に関連する他の言語には、文字をエスケープする独自の方法があります。
XML 文字参照
文字実体参照の範囲が広い従来のHTMLとは異なり、XMLでは定義済みの文字実体参照は5つしかありません。これらは、特定のコンテキストでマークアップに敏感な文字をエスケープするために使用されます。[32]
その他のすべての文字エンティティ参照は、使用する前に定義する必要があります。たとえば、éXML ドキュメントで (é、ラテン語の小文字の E に鋭アクセントが付き、Unicode では U+00E9 になる)を使用すると、エンティティがすでに定義されていない限り、エラーが発生します。XML では、x16 進数値参照の も小文字にする必要があります。たとえば、ਛではなく ですਛ。XMLアプリケーションであるXHTMLは、XML の定義済みエンティティとともに、HTML エンティティ セットをサポートしています。
参照
- 文字セットスニッフィング– 文字エンコードメタデータが利用できない場合に多くのブラウザで使用されます
- ユニコードとHTML
- 言語コード
- XML および HTML 文字実体参照のリスト
参考文献
- ^ Fielding, R.; Reschke, J. (2014 年 6 月)、「Content-Type」、Fielding, R; Reschke, J (編)、『Hypertext Transfer Protocol (HTTP/1.1): Semantics and Content』、IETF、doi :10.17487/RFC7231、S2CID 14399078、2014年7 月 30 日取得
- ^ 「Apache モジュール mod_charset_lite」。
- ^ abc 「文書の文字エンコーディングを指定する」、HTML5、World Wide Web Consortium、2017年12月14日、2018年5月28日閲覧
- ^ Bray, T. ; Paoli, J.; Sperberg-McQueen, C. ; Maler, E.; Yergeau, F. (2008 年 11 月 26 日)、「Prolog と文書型宣言」、XML、W3C 、 2010 年3 月 8 日取得
- ^ 「HTML5 はバイト ストリームを事前スキャンしてエンコードを決定します」。
- ^ 「8.2.2.3. 文字エンコーディング」。HTML 5.1 標準。W3C。
- ^ 「8.2.2.3. 文字エンコーディング」。HTML 5 標準。W3C。
- ^ abc 「12.2.3.3 文字エンコーディング」。HTML Living Standard。WHATWG。
- ^ abcdef ファン・ケステレン、アン。 「4.2: 名前とラベル」。エンコーディング標準。なんてことだ。
- ^ アブ ・ファン・ケステレン、アン。 「10.2.2. gb18030 エンコーダ」。エンコーディング標準。なんてことだ。
- ^ アブ ・ファン・ケステレン、アン。 「5. 索引 (§ 索引 gb18030)」。エンコーディング標準。なんてことだ。
- ^ アン・ファン・ケステレン。 「10.2.1. gb18030 デコーダ」。エンコーディング標準。なんてことだ。
- ^ abc Mozilla Foundation . 「IANA 命名との注目すべき違い」. Crate encoding_rs . docs.rs.
- ^ アン・ファン・ケステレン。 「5. インデックス (§ インデックス Big5 ポインタ)」。エンコーディング標準。なんてことだ。
- ^ アン・ファン・ケステレン。 「5. 索引(§ 索引 jis0208)」。エンコーディング標準。なんてことだ。
- ^ アン・ファン・ケステレン。 「5. 索引(§ 索引 ISO-2022-JP カタカナ)」。エンコーディング標準。なんてことだ。
- ^ アブ ・ファン・ケステレン、アン。 「12.2.1. ISO-2022-JP デコーダ」。エンコーディング標準。なんてことだ。
- ^ アン・ファン・ケステレン。 「12.2.2. ISO-2022-JP エンコーダ」。エンコーディング標準。なんてことだ。
- ^ アン・ファン・ケステレン。 「5. 索引 (§ 索引 EUC-KR)」。エンコーディング標準。なんてことだ。
- ^ アブ ・ファン・ケステレン、アン。 「4.3. 出力エンコーディング」。エンコーディング標準。なんてことだ。
- ^ アン・ファン・ケステレン。 「14.4.UTF-16LE」。エンコーディング標準。なんてことだ。
- ^ アン・ファン・ケステレン。 「6. 標準のフック (§ デコード)」。エンコーディング標準。なんてことだ。
- ^ アン・ファン・ケステレン。 「14.5. x-ユーザー定義」。エンコーディング標準。なんてことだ。
- ^ アン・ファン・ケステレン。 「9. 従来のシングルバイトエンコーディング (§ 注)」。エンコーディング標準。なんてことだ。
- ^ アブ ・ファン・ケステレン、アン。 「インデックス KOI8-U 視覚化」。エンコーディング標準。なんてことだ。
- ^ 「バグ 17053: KOI8-U の KOI8-RU マッピングをサポート」。W3C Bugzilla。2015年8 月 19 日。
- ^ アン・ファン・ケステレン。 「10.1.GBK」。エンコーディング標準。なんてことだ。
- ^ アン・ファン・ケステレン。 「5. 索引(§ 索引 jis0212)」。エンコーディング標準。なんてことだ。
- ^ アン・ファン・ケステレン。 「14.1:交換」。エンコーディング標準。なんてことだ。
- ^ アン・ファン・ケステレン。 「2:セキュリティの背景」。エンコーディング標準。なんてことだ。
- ^ アン・ファン・ケステレン。 「4.2: 名前とラベル (§ 置換)」。エンコーディング標準。なんてことだ。
- ^ Bray, T. ; Paoli, J.; Sperberg-McQueen, C. ; Maler, E.; Yergeau, F. (2008 年 11 月 26 日)、「Character and Entity References」、XML、W3C 、 2010 年3 月 8 日取得
外部リンク
- HTML4 における文字実体参照
- ウェブ文字エンコーディングの決定版ガイド
- ブラウザ セキュリティ ハンドブックの HTML エンティティ エンコーディングの章 – 現在のブラウザとそのエンティティ処理に関する詳細情報
- クロスサイトスクリプティング (XSS) に関する Open Web Application Security Project の wiki 記事
