Zeichenkodierungen in HTML

Während Hypertext Markup Sprache (Html) ist seit 1991 verwendet, HTML 4.0 ab Dezember 1997 war die erste standardisierte Version, in der international Figuren wurden einigermaßen vollständig behandelt. Wenn ein HTML-Dokument Sonderzeichen außerhalb des Bereichs von sieben Bit enthält ASCIIEs sind zwei Ziele zu berücksichtigen: die Informationen der Informationen Integritätund universell Browser Anzeige.

Angabe der Charaktercodierung des Dokuments

Es gibt zwei allgemeine Möglichkeiten, angeben, welche Zeichencodierung im Dokument verwendet wird.

Zuerst die Webserver kann die Charaktercodierung oder "enthalten"Charset" in dem Hypertext Transfer Protocol (Http) Inhaltstyp Header, der normalerweise so aussieht:[1]

Inhaltstyp: Text/HTML; charset = iSO-8859-4

Diese Methode gibt dem HTTP -Server eine bequeme Möglichkeit, um die Codierung des Dokuments nach der Codierung des Dokuments zu ändern Inhaltsverhandlung; Bestimmte HTTP -Server -Software kann dies tun, z. B. Apache mit dem Modul mod_charset_lite.[2]

Zweitens kann eine Erklärung in das Dokument selbst aufgenommen werden.

Für HTML ist es möglich, diese Informationen in die Einführung in die Kopf Element in der Nähe des Dokuments:[3]

<Meta http-äquiv="Inhaltstyp" Inhalt="text/html; charset = utf-8"> 

HTML5 Ermöglicht auch die folgende Syntax genau das gleiche:[3]

<Meta Charset="UTF-8"> 

Xhtml Dokumente haben eine dritte Option: um die Zeichenkodierung durch die Zeichenkodierung auszudrücken Xml Erklärung wie folgt:[4]

 

Mit diesem zweiten Ansatz, da die Charaktercodierung erst dann bekannt ist, wenn die Deklaration analysiert ist, besteht ein Problem, zu wissen, welche Charaktercodierung im Dokument bis hin zu der Erklärung selbst verwendet wird. Wenn die Charaktercodierung eine ist ASCII -Erweiterung Dann sollte der Inhalt bis hin zu der Erklärung selbst reiner ASCII sein und dies wird korrekt funktionieren. Für Zeichencodierungen, die keine ASCII -Erweiterungen sind (d. H. Kein Superset von ASCII) wie UTF-16BE und UTF-16LEEin Prozessor von HTML, wie z. B. einem Webbrowser, sollte in einigen Fällen durch die Verwendung von Heuristiken die Erklärung analysieren können.

Codierungserkennungsalgorithmus

Ab HTML5 ist das empfohlene Zeichensatz ist UTF-8.[3] In der Spezifikation wird ein "codierender Sniffing -Algorithmus" definiert, um die Zeichencodierung des Dokuments basierend auf mehreren Eingabequellen zu bestimmen, einschließlich:

  1. Explizite Benutzeranweisung
  2. Ein explizites Meta -Tag innerhalb der ersten 1024 Bytes des Dokuments
  3. A Byte -Bestellmarke (BOM) Innerhalb der ersten drei Bytes des Dokuments
  4. Die HTTP-Inhaltstyp- oder andere Transportschichtinformationen
  5. Analyse der Dokument -Bytes, die nach bestimmten Sequenzen oder Bereichen der Bytewerte suchen,[5] und andere vorläufige Erkennungsmechanismen.

Zeichen außerhalb des druckbaren ASCII -Bereichs (32 bis 126) erscheinen normalerweise falsch. Dies zeigt nur wenige Probleme für Englisch-Speaking -Benutzer, aber andere Sprachen regelmäßig -in einigen Fällen immer -erhalten Charaktere außerhalb dieses Bereichs. Auf Chinesisch, Japanisch und Koreanisch (CJK) Sprachumgebungen, in denen mehrere verschiedene Multi-Byte-Kodierungen verwendet werden, wird auch häufig eine automatische Erkennung verwendet. Schließlich ermöglichen Browsern dem Benutzer normalerweise, überschreiben falsch Charset -Etikett auch manuell.

Es wird immer häufiger für mehrsprachige Websites und Websites in nicht-westlichen Sprachen, die sie verwenden können UTF-8, die die Verwendung der gleichen Codierung für alle Sprachen ermöglicht. UTF-16 oder UTF-32, die auch für alle Sprachen verwendet werden können, sind weniger weit verbreitet, da sie in Programmiersprachen, die a annehmen, schwieriger zu handhaben sein können Byte-orientiert ASCII -Superset -Codierung und sie sind für Text mit einer hohen Frequenz von ASCII -Zeichen weniger effizient, was normalerweise bei HTML -Dokumenten der Fall ist.

Eine erfolgreiche Anzeige einer Seite ist nicht unbedingt ein Hinweis darauf, dass die Codierung korrekt angegeben ist. Wenn der Ersteller und der Leser der Seite beide eine plattformspezifische Charakter-Codierung annehmen und der Server keine identifizierenden Informationen sendet, sieht der Leser die Seite dennoch als beabsichtigt, aber andere Leser auf verschiedenen Plattformen oder mit verschiedenen Muttersprachen wird die Seite nicht wie beabsichtigt sehen.

Erlaubte Codierungen

Das Waswg Codierungsstandard, auf die jüngste HTML W3c HTML 5.0 und 5.1) Gibt eine Liste von Codings an, die Browser unterstützen müssen. Die HTML -Standards verbieten die Unterstützung anderer Codierungen.[6][7][8] Der Codierungsstandard sieht weiter fest, dass neue Formate, neue Protokolle (selbst wenn vorhandene Formate verwendet werden) und Autoren neuer Dokumente erforderlich sind UTF-8 ausschließlich.[9]

Neben UTF-8 werden die folgenden Codierungen im HTML-Standard selbst ausdrücklich unter Bezugnahme auf den Codierungsstandard ausdrücklich aufgeführt:[8]

  1. ^ Auch angegeben für TIS-620, ISO-8859-11 und verwandte Etiketten.[9]
  2. ^ Auch angegeben für ASCII, ISO-8859-1 und verwandte Etiketten.[9]
  3. ^ Auch angegeben für ISO-8859-9 und verwandte Etiketten.[9]
  4. ^ Angegeben mit 0xa3a0 als doppelte Codierung der ideografischer Raum (U+3000) aus Kompatibilitätsgründen und als solches ohne U+E5E5 (ein privates Gebrauchszeichen).[10][11] Auch mit 0x80 als alternative Codierung der anerkannt Eurozeichen (U+20AC; siehe Windows-936).[12] Ansonsten folgt die Zuordnungen aus dem Standard von 2005.[11]
  5. ^ Hongkong ergänzender Charakter -Set Variante, obwohl die meisten HKSCS -Erweiterungen (diejenigen mit Lead -Bytes von weniger als 0xa1) nicht vom Encoder enthalten sind, nur vom Decoder.[13]
  6. ^ Die Spezifikation umfasst IBM und NEC Erweiterungen (siehe Windows-31J).[14]
  7. ^ Die Spezifikation verwendet den gleichen Index wie für Shift JIS (soweit es innerhalb der Reichweite ist), d. H. Einbezogen NEC -Erweiterungen. Halbbreite Kana wird vom Encoder in die Fullwidth konvertiert,[15] aber mit einer Escape -Sequenz (ESC 0x28 0x49) durch den Decoder akzeptiert.[16] Verschieben und Verschieben (0x0e und 0x0f) werden vollständig ausgeschlossen, um Angriffe zu verhindern.[16][17]
  8. ^ Eigentlich Einheitlicher Hangul -Code, das ist ein Superset, der das gesamte abdeckt Hangul Silben Block.[18]
  9. ^ Nur für die Dekodierung spezifiziert; Formulareinreichungen aus UTF-16-codierten Dokumenten sind in codiert zu werden UTF-8.[19]
  10. ^ Für die Kompatibilität mit bereitgestellten Inhalten, auch für die Ebene angegeben UTF-16 Etikett,[20] obwohl a Byte -Bestellmarke (BOM) hat, falls vorhanden, Vorrang vor einem Etikett.[21] Nur für die Dekodierung spezifiziert; Formulareinreichungen aus UTF-16-codierten Dokumenten sind in codiert zu werden UTF-8.[19]
  11. ^ Karten 0x00 bis 0x7f bis U+0000 über U+007F und 0x80 bis 0xff bis U+F780 über U+F7FF (a Privatnutzungsbereich Bereich), so dass die niedrigen 8 Bit des Codepunkts immer mit dem ursprünglichen Byte übereinstimmen.[22]

Die folgenden zusätzlichen Codierungen sind im Codierungsstandard aufgeführt, und es ist daher auch Unterstützung für diese erforderlich:[9]

  1. ^ Verwendet denselben Encoder und Decoder wie ISO-8859-8, unterliegt jedoch nicht dem Verhalten visueller Ordnung, das für Dokumente verwendet wird, die als ISO-8859-8 bezeichnet werden.[23]
  2. ^ Titel KOI8-U und spezifiziert für beide Koi8-u und Koi8-ru Etiketten,[9] aber folgt Koi8-ru (d. H. Inklusive /~).[24][25]
  3. ^ Auch angegeben für GB 2312 und verwandte Etiketten. Behandelte das gleiche wie GB 18030 Für Decodierungszwecke.[26] Zu Codierungszwecken, Kennzeichnung als GBK (oder GB 2312) Ausgeschlossenen Vier-Byte-Codes und bevorzugt die One-Byte 0x80-Darstellung für U+20AC.[10]
  4. ^ Die Spezifikation verwendet den gleichen Index wie für Shift JIS (soweit sie in Reichweite des EUC -Codesatzes 1) verwendet werden, d. H. Enthält NEC -Erweiterungen. Jis x 0212 ist nur zum Dekodieren enthalten.[27]

Die folgenden Codierungen werden als explizite Beispiele für verbotene Codierungen aufgeführt:[8]

Der Standard definiert auch einen "Ersatz" -Decoder, der alle Inhalte, die als bestimmte Codierungen gekennzeichnet sind Ersatzcharakter (�), wobei es sich weigert, es überhaupt zu verarbeiten. Dies soll Angriffe verhindern (z. Cross Site Scripting) Dies kann einen Unterschied zwischen Client und Server in den unterstützten Codierungen ausnutzen, um böswillige Inhalte zu maskieren.[28] Obwohl das gleiche Sicherheitsbedenken für ISO-2022-JP und UTF-16, die es auch ermöglichen, dass Sequenzen von ASCII -Bytes unterschiedlich interpretiert werden, wurde dieser Ansatz für sie nicht als machbar angesehen, da sie vergleichsweise häufiger im bereitgestellten Inhalt verwendet werden.[29] Die folgenden Codierungen erhalten diese Behandlung:[30]

Charakterreferenzen

Zusätzlich zu nativen Charaktercodierungen können Zeichen auch als codiert werden Charakterreferenzen, welches sein kann Numerische Charakterreferenzen (Dezimal oder hexadezimal) oder Charakterentität Referenzen. Referenzen für Charakterentität werden manchmal auch als als bezeichnet genannte Entitäten, oder HTML -Entitäten für html. Die Verwendung von Charakterreferenzen durch HTML stammt aus SGML.

HTML -Charakterreferenzen

A Numerische Zeichenreferenz in HTML bezieht sich auf einen Charakter durch seinen Charakter Universeller Charakter -Set/Unicode Codepunktund verwendet das Format

nnnn;

oder

HHHH;

wo nnnn ist der Codepunkt in Dezimal Form und HHHH ist der Codepunkt in hexadezimal bilden. Das x Muss in XML -Dokumenten Kleinbuchstaben sein. Das nnnn oder HHHH Kann eine beliebige Anzahl von Ziffern sein und führende Nullen umfassen. Das HHHH Kann Großbuchstaben und Kleinbuchstaben mischen, obwohl Großbuchstaben der übliche Stil ist.

Nicht alle Internetbrowser oder E -Mail -Clients verwendet von Empfängern von HTML -Dokumenten oder Textredakteure Von Autoren von HTML -Dokumenten wird in der Lage, alle HTML -Zeichen zu rendern. Die meisten modernen Software sind in der Lage, die meisten oder alle Zeichen für die Sprache des Benutzers anzuzeigen, und zeichnet ein Box oder einen anderen klaren Indikator für Zeichen, die sie nicht rendern.

Für Codes von 0 bis 127 das ursprüngliche 7-Bit ASCII Standard -Set, die meisten dieser Zeichen können ohne Zeichenreferenz verwendet werden. Codes von 160 bis 255 können alle mithilfe von erstellt werden Charakterentitätsnamen. Es können nur wenige Codes mit höheren Zahlen unter Verwendung von Entitätsnamen erstellt werden, aber alle können durch Dezimalzahl-Zeichenreferenz erstellt werden.

Referenzen für Charakterentität können auch das Format haben &Name; wo Name ist eine sensitive alphanumerische Saite. Zum Beispiel kann "λ" auch als codiert werden λ in einem HTML -Dokument. Die Charakterentität verweist <, >, " und & sind in HTML und SGML vordefiniert, weil <, >, " und & werden bereits verwendet, um das Markup abzugrenzen. Dies beinhaltete insbesondere XMLs nicht ' (') Entität vor HTML5. Für eine Liste aller benannten HTML -Charakterentitätsreferenzen zusammen mit den Versionen, in denen sie eingeführt wurden, siehe Liste der XML- und HTML -Charakterentitätsreferenzen.

Die unnötige Verwendung von HTML -Charakterreferenzen kann die HTML -Lesbarkeit erheblich verringern. Wenn die Charaktercodierung für eine Webseite angemessen ausgewählt wird, sind HTML -Charakterreferenzen normalerweise nur für Markup -Abgrenzungszeichen erforderlich, wie oben erwähnt Unicode codieren wie UTF-8 wird genutzt). Eine falsche HTML -Entität kann auch Sicherheitslücken für Injektionsangriffe wie z. Cross-Site-Scripting. Wenn HTML Whitespace, wie Platz und Registerkarte, müssen mit Entitäten entkommen. Andere Sprachen, die sich auf HTML beziehen, haben ihre eigenen Methoden zur Flucht von Charakteren.

XML -Charakterreferenzen

Im Gegensatz zu herkömmlichen HTML mit seiner großen Auswahl an Charakterentität Referenzen in Xml Es gibt nur fünf vordefinierte Charakterentitätsreferenzen. Diese werden verwendet, um Zeichen zu entkommen, die in bestimmten Kontexten sensibel sind:[31]

  • & → & (Et-Zeichen, U+0026)
  • < → <(weniger als Zeichen, U+003c)
  • > →> (größeres Zeichen, U+003E)
  • " → "(Anführungszeichen, U+0022)
  • ' → '(Apostroph, U+0027)

Alle anderen Charakterentitätsreferenzen müssen definiert werden, bevor sie verwendet werden können. Zum Beispiel die Verwendung von é (Was é gibt, lateinischer niedrigerer Fall mit akutem Akzent, U+00E9 in Unicode) in einem XML-Dokument erzeugt einen Fehler, es sei denn, das Entität wurde bereits definiert. XML erfordert auch, dass die x in hexadezimalen numerischen Referenzen in Kleinbuchstaben sein: Zum Beispiel statt . XhtmlDas ist eine XML -Anwendung, unterstützt das HTML -Unternehmenset zusammen mit den vordefinierten Entitäten von XML.

Siehe auch

Verweise

  1. ^ "Inhaltstyp", Hypertext -Transferprotokoll (HTTP/1.1): Semantik und Inhalt, Ietf, Juni 2014, abgerufen 30. Juli 2014
  2. ^ "Apache Modul mod_charset_lite".
  3. ^ a b c "Angabe der Charaktercodierung des Dokuments", HTML5, World Wide Web Konsortium, 14. Dezember 2017, abgerufen 28. Mai 2018
  4. ^ Bray, T.; Paoli, J.; Sperberg-McQueen, C.; Maler, E.; Yerdeau, F. (26. November 2008), "Prolog- und Dokumenttyperklärung", Xml, W3c, abgerufen 8. März 2010
  5. ^ "HTML5 Prescan A Byte Stream, um seine Codierung zu bestimmen".
  6. ^ "8.2.2.3. Charaktercodierungen". HTML 5.1 Standard. W3c.
  7. ^ "8.2.2.3. Charaktercodierungen". HTML 5 Standard. W3c.
  8. ^ a b c "12.2.3.3 Charaktercodierungen". HTML Living Standard. Waswg.
  9. ^ a b c d e f Van Kesteren, Anne. "4.2: Namen und Etiketten". Codierungsstandard. Waswg.
  10. ^ a b Van Kesteren, Anne. "10.2.2. GB18030 Encoder". Codierungsstandard. Waswg.
  11. ^ a b Van Kesteren, Anne. "5. Indizes (§ Index GB18030)". Codierungsstandard. Waswg.
  12. ^ Van Kesteren, Anne. "10.2.1. GB18030 Decoder". Codierungsstandard. Waswg.
  13. ^ Van Kesteren, Anne. "5. Indizes (§ Index Big5 Zeiger)". Codierungsstandard. Waswg.
  14. ^ Van Kesteren, Anne. "5. Indizes (§ Index JIS0208)". Codierungsstandard. Waswg.
  15. ^ Van Kesteren, Anne. "5. Indizes (§ INDEX ISO-2022-JP Katakana)". Codierungsstandard. Waswg.
  16. ^ a b Van Kesteren, Anne. "12.2.1. ISO-2022-JP-Decoder". Codierungsstandard. Waswg.
  17. ^ Van Kesteren, Anne. "12.2.2. ISO-2022-JP-Encoder". Codierungsstandard. Waswg.
  18. ^ Van Kesteren, Anne. "5. Indizes (§ Index EUC-kr)". Codierungsstandard. Waswg.
  19. ^ a b Van Kesteren, Anne. "4.3. Ausgabecodierungen". Codierungsstandard. Waswg.
  20. ^ Van Kesteren, Anne. "14.4. UTF-16LE". Codierungsstandard. Waswg.
  21. ^ Van Kesteren, Anne. "6. Haken für Standards (§ Decode)". Codierungsstandard. Waswg.
  22. ^ Van Kesteren, Anne. "14.5. X-Benutzer-definiert". Codierungsstandard. Waswg.
  23. ^ Van Kesteren, Anne. "9. Legacy Single-Byte-Encodings (§ Hinweis)". Codierungsstandard. Waswg.
  24. ^ Van Kesteren, Anne. "Index KOI8-U Visualisierung". Codierungsstandard. Waswg.
  25. ^ "Bug 17053: Unterstützung KOI8-RU-Mapping für Koi8-U". W3c Bugzilla. 19. August 2015.
  26. ^ Van Kesteren, Anne. "10.1. GBK". Codierungsstandard. Waswg.
  27. ^ Van Kesteren, Anne. "5. Indizes (§ Index JIS0212)". Codierungsstandard. Waswg.
  28. ^ Van Kesteren, Anne. "14.1: Ersatz". Codierungsstandard. Waswg.
  29. ^ Van Kesteren, Anne. "2: Sicherheitshintergrund". Codierungsstandard. Waswg.
  30. ^ Van Kesteren, Anne. "4.2: Namen und Etiketten (§ Ersatz)". Codierungsstandard. Waswg.
  31. ^ Bray, T.; Paoli, J.; Sperberg-McQueen, C.; Maler, E.; Yerdeau, F. (26. November 2008), "Charakter- und Entitätsreferenzen", Xml, W3c, abgerufen 8. März 2010

Externe Links