知識ベース

HTMLの文字エンコード

HTML(Hypertext Markup Language)は1991年から使用されていますが、HTML 4.0(1997年12月)は、国際文字がかなり完全に処理された最初の標準化バージョンでした。 HTMLドキュメントに7ビットASCIIの範囲外の特殊文字が含まれる場合、2つの目標を検討する価値があります。情報の整合性とユニバーサルブラウザ表示です。

ドキュメントの文字エンコーディングを指定する

ドキュメントで使用される文字エンコードを指定するには、いくつかの方法があります。まず、Webサーバーは、ハイパーテキスト転送プロトコル(HTTP)Content-Typeヘッダーに文字エンコードまたは「文字セット」を含めることができます。これは通常、次のようになります。

コンテンツタイプ:text / html; charset = ISO-8859-4

このメソッドは、コンテンツネゴシエーションに従ってドキュメントのエンコードを変更する便利な方法をHTTPサーバーに提供します。モジュールmod_charset_liteを備えたApacheなど、特定のHTTPサーバーソフトウェアで実行できます。

HTMLの場合、ドキュメントの上部近くにあるhead要素内に次の情報を含めることができます。

meta http-equiv = "Content-Type" content = "text / html; charset = utf-8">

HTML5では、次の構文もまったく同じことを意味します。

meta charset = "utf-8">

XHTMLドキュメントには3番目のオプションがあります。次のように、XML宣言を介して文字エンコードを表現します。

?xml version = "1.0" encoding = "ISO-8859-1"?>

この宣言が解析されるまで文字エンコーディングは分からないため、宣言自体にどのエンコーディングが使用されているかを知るのに問題があることに注意してください。主な原則は、宣言を純粋なASCIIでエンコードすることであるため、(宣言がファイル内にある場合)エンコードはASCII拡張である必要があります。 ASCIIと後方互換性のないエンコーディングを許可するには、ブラウザはそのようなエンコーディングの宣言を解析できる必要があります。このようなエンコーディングの例は、UTF-16BEおよびUTF-16LEです。

HTML5現在、推奨される文字セットはUTF-8です。 「エンコーディングスニッフィングアルゴリズム」は、次のような複数の入力ソースに基づいてドキュメントの文字エンコーディングを決定するために仕様で定義されています。

  1. 明示的なユーザー指示
  2. ドキュメントの最初の1024バイト内の明示的なメタタグ
  3. 文書の最初の3バイト内のバイト順マーク
  4. HTTP Content-Typeまたはその他のトランスポート層情報
  5. 特定のシーケンスまたはバイト値の範囲を探すドキュメントバイトの分析、およびその他の一時的な検出メカニズム。

ASCII互換の文字エンコーディングの場合、誤って選択した結果、印刷​​可能なASCII範囲(32〜126)以外の文字が通常正しく表示されなくなります。これにより、英語を話すユーザーにとって問題はほとんどありませんが、他の言語は定期的に(場合によっては常に)その範囲外の文字を必要とします。いくつかの異なるマルチバイトエンコーディングが使用されているCJK環境では、自動検出もよく使用されます。最後に、ブラウザでは通常、ユーザーが誤った文字セットラベルを手動で上書きすることもできます。

多言語Webサイトおよび非西洋言語のWebサイトでUTF-8を使用することがますます一般的になり、すべての言語で同じエンコーディングを使用できるようになりました。 UTF-16またはUTF-32は、すべての言語で使用できますが、バイト指向のASCIIスーパーセットエンコーディングを前提とするプログラミング言語では処理が難しくなる可能性があるため、あまり使用されていません。高頻度のASCII文字。これは通常、HTMLドキュメントの場合です。

ページが正常に表示されたからといって、エンコードが正しく指定されているとは限りません。ページの作成者と読者の両方がプラットフォーム固有の文字エンコーディングを想定しており、サーバーが識別情報を送信しない場合でも、読者は作成者が意図したとおりにページを見ることができますが、異なるプラットフォームまたは異なるネイティブ言語の他の読者ページが意図したとおりに表示されません。

文字参照

ネイティブの文字エンコーディングに加えて、文字を文字参照としてエンコードすることもできます。これは、 数値文字参照 (10進数または16進数)または文字エンティティ参照です。文字エンティティ参照は、 名前付きエンティティまたはHTMLのHTMLエンティティとも呼ばれます。 HTMLの文字参照の使用は、SGMLから派生しています。

HTML文字参照

HTMLの数字参照は、Universal Character Set / Unicode コードポイントによって文字を参照し、形式を使用します

&# nnnn ;

または

&#x hhhh ;

ここで、 nnnnは10進数形式のコードポイントであり、 hhhhは16進数形式のコードポイントです。 XML文書ではxは小文字でなければなりません。 nnnnまたはhhhhは任意の桁数で、先頭にゼロを含めることができます。 hhhhは大文字と小文字を混在させることができますが、大文字は通常のスタイルです。

HTMLドキュメントの受信者が使用するすべてのWebブラウザーまたは電子メールクライアント、またはHTMLドキュメントの作成者が使用するテキストエディターがすべてのHTML文字をレンダリングできるわけではありません。最新のソフトウェアのほとんどは、ユーザーの言語のほとんどまたはすべての文字を表示でき、レンダリングできない文字のボックスまたはその他の明確なインジケーターを描画します。

0〜127のコード(元の7ビットASCII標準セット)の場合、これらの文字のほとんどは文字参照なしで使用できます。 160から255までのコードはすべて、文字エンティティ名を使用して作成できます。エンティティ名を使用して作成できるのは、少数のより大きな番号のコードだけですが、すべて10進数の文字参照によって作成できます。

文字エンティティ参照は、形式と名前を持つこともできます。 nameは大文字と小文字が区別される英数字の文字列です。たとえば、「λ」はλとしてエンコードすることもできます。 HTMLドキュメント内。文字エンティティ参照<、>、"および& 、>、 "、および&はすでにマークアップを区切るために使用されているため、HTMLおよびSGMLで事前定義されています。これには、特にXMLの'( ')エンティティは含まれません。 XMLおよびHTML文字エンティティ参照のリストを参照してください。

HTML文字参照を不必要に使用すると、HTMLの可読性が大幅に低下する場合があります。 Webページの文字エンコードが適切に選択されている場合、HTML文字参照は通常、前述のマークアップ区切り文字といくつかの特殊文字にのみ必要です(UTF-8などのネイティブUnicodeエンコードが使用されている場合はまったくありません) )。誤ったHTMLエンティティのエスケープは、クロスサイトスクリプティングなどのインジェクション攻撃のセキュリティ上の脆弱性を開く可能性もあります。 HTML属性が引用符で囲まれていない場合、特定の文字、スペースやタブなどの最も重要な空白は、エンティティを使用してエスケープする必要があります。 HTMLに関連する他の言語には、文字をエスケープする独自の方法があります。

XML文字参照

幅広い範囲の文字エンティティ参照を持つ従来のHTMLとは異なり、XMLには5つの定義済み文字エンティティ参照しかありません。これらは、特定のコンテキストでマークアップに敏感な文字をエスケープするために使用されます。

  • & →&(アンパサンド、U + 0026)
  • < →(小なり記号、U + 003C)
  • > →>(大なり記号、U + 003E)
  • " → "(引用符、U + 0022)
  • ' → '(アポストロフィ、U + 0027)

他のすべての文字エンティティ参照は、使用する前に定義する必要があります。たとえば、éの使用(é、鋭アクセント付きラテン小文字E、UnicodeのU + 00E9)は、エンティティが既に定義されていない限りエラーを生成します。また、XMLでは、16進数の数値参照のxを小文字にする必要があります。たとえば、&#XA1bではなく&#xA1bです。 XMLアプリケーションであるXHTMLは、XMLの事前定義されたエンティティとともに、HTMLエンティティセットをサポートします。