<meta charset = "utf-8"> vs <meta http-equiv = "Content-Type">

1535

Welche Notation sollte ich verwenden , um einen Zeichensatz für HTML5 Doctype zu definieren ?

  1. Kurz:

    <meta charset="utf-8" /> 
  2. Lange:

    <meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
CuriousMind
quelle
94
Die Verwendung eines <meta> -Tags für etwas wie Inhaltstyp und Codierung ist sehr ironisch, da Sie die Datei ohne Kenntnis dieser Dinge nicht analysieren konnten, um den Wert des Meta-Tags zu erhalten.
Mark
321
Sie können es als ASCII analysieren, bis Sie es erreichen. Der HTML5-Parsing-Algorithmus berücksichtigt dies.
Quentin
41
Es sollte beachtet werden, dass keines zum Parsen verwendet wird, wenn die Seite über das Web bereitgestellt wird. Stattdessen wird der im HTTP- Content-TypeAntwortheader verwendete verwendet. Das Meta-Tag wird nur verwendet, wenn die Seite aus dem lokalen Datenträger-Dateisystem geladen wird.
BalusC
38
Das Meta-Element wird unter bestimmten Bedingungen über HTTP verwendet (einschließlich des Fehlens der Daten im HTTP-Header)
Quentin
78
Es ist auch ironisch, dass es Zeichensatz heißt, wenn es wirklich um die Angabe einer Codierung geht. (Der Zeichensatz ist Unicode, die Codierung ist UTF-8)
Ryan

Antworten:

1084

In HTML5 sind sie gleichwertig. Verwenden Sie die kürzere, es ist einfacher, sich zu erinnern und zu tippen. Die Browserunterstützung ist in Ordnung, da sie auf Abwärtskompatibilität ausgelegt ist.

QUentin
quelle
23
Was ist mit der Browserunterstützung? Funktioniert <meta charset='utf-8'>in IE6?
Šime Vidas
11
Soweit ich weiß, ja.
Quentin
4
Hier ist ein aktualisierter Link für die von @ Šime Vidas erwähnte Google-Codepage . In Bezug auf IE 6, 7 und 8 heißt es: "In Nicht-IE-Browsern können Sie document.characterSet verwenden. In IE könnten Sie denken, Sie könnten document.getElementsByTagName ('meta') [0] .charset verwenden, aber dies Gibt nur die von Ihnen angegebene Zeichenkodierung zurück, nicht die vom IE tatsächlich verwendete Kodierung. "
hotshot309
7
Ich weiß, dass dieser Thread alt ist, aber gtmetrix.com/specify-a-character-set-early.html gibt <meta>an, dass die Einstellung zum Festlegen der Zeichenkodierung den Lookahead-Downloader in IE8 deaktiviert, was sich auf die Ladezeiten Ihrer Seite auswirken kann. Ja, ja, ich weiß ... lass IE8 fallen. @ MészárosLajos kann in ein paar Jahren hierher zurückkehren und unsere Bälle sprengen, weil er IE8 weiterhin unterstützt. ;-)
erturne
3
Heute hatte ich ein Problem, bei dem koreanische Symbole in IE11 nicht angezeigt wurden. Das Löschen der kurzen Syntax zugunsten der längeren Syntax hat das Problem behoben. Ich weiß jedoch nicht, ob dies auf eine Art Serverkonfiguration zurückzuführen ist oder ob es sich um ein Problem mit IE11 und dem Zeichensatz handelt. Die genaue Symbolkombination, bei der ein Fehler aufgetreten ist, war 베라.
James Donnelly
250

Beide Formen der Meta-Zeichensatzdeklaration sind gleichwertig und sollten in allen Browsern gleich funktionieren. Es gibt jedoch einige Dinge, die Sie beachten müssen, wenn Sie den Zeichensatz Ihrer Webdateien als UTF-8 deklarieren:

  1. Speichern Sie Ihre Datei (en) in UTF-8-Codierung ohne die Byte-Order-Markierung (BOM).
  2. Deklarieren Sie die Codierung in Ihren HTML-Dateien mithilfe eines Meta-Zeichensatzes (wie oben).
  3. Ihr Webserver muss Ihre Dateien bereitstellen und die UTF-8-Codierung im HTTP-Header vom Inhaltstyp deklarieren.

Apache-Server sind standardmäßig so konfiguriert, dass sie Dateien in ISO-8859-1 bereitstellen. Daher müssen Sie Ihrer .htaccessDatei die folgende Zeile hinzufügen :

AddDefaultCharset UTF-8

Dadurch wird Apache so konfiguriert, dass Ihre Dateien, die die UTF-8-Codierung deklarieren, im Content-Type-Antwortheader bereitgestellt werden. Ihre Dateien müssen jedoch zunächst in UTF-8 (ohne Stückliste) gespeichert werden.

Notepad kann Ihre Dateien ohne die Stückliste nicht in UTF-8 speichern. Ein kostenloser Editor, der dies kann, ist Notepad ++ . Wählen Sie in der Programmmenüleiste "Codierung> In UTF-8 ohne Stückliste codieren". Sie können Dateien auch öffnen und in UTF-8 erneut speichern, indem Sie "Codierung> In UTF-8 ohne Stückliste konvertieren" verwenden.

Mehr zum Byte Order Mark (BOM) bei Wikipedia .

CodeBoy
quelle
20
@CodeBoy Ich würde Ihre Antwort dahingehend ändern, dass Sie " ohne Stückliste speichern " sollten . Auf der folgenden Seite steht "... für die Interoperabilität ist es normalerweise am besten, die Stückliste wegzulassen ...", wobei eine bewährte Methode angegeben wird
Johann
3
In IIS können Sie den Zeichensatz in HTTP-Headern mit <globalization fileEncoding = "utf-8" responseEncoding = "utf-8" /> in Web.Config festlegen - fügen Sie ihn zu <system.web> hinzu
Chris Moschini
3
Soweit ich weiß, spielt es keine Rolle, ob Sie mit unserer ohne Stückliste sparen.
David 天宇 Wong
3
Warum sollte UTF-8-HTML ohne Stückliste sein? Eine Stückliste sollte gut funktionieren. Außerdem benötigen Sie keinen metaHTTP-Header. Sie benötigen lediglich eine Stückliste metaoder einen HTTP-Header.
Hsivonen
5
Summing up: don't use BOM for UTF-8Dem kann ich nicht zustimmen. Die Stückliste in UTF-8 ist sehr nützlich für die Signalisierung des Codierungstyps. Andernfalls müssen wir raten oder Dinge wie die Meta-Tags verwenden, auf die sich diese Frage bezieht. Das Coole an der Stückliste ist, dass sie Teil der Unicode-Spezifikation ist und daher für alle in Unicode codierten Daten verwendet werden kann, nicht nur für HTML. Was wir tun sollten , ist, Stücklisten überall zu verwenden, ältere Software in die Luft jagen zu lassen, diese Fehler zu melden und sie zu beheben.
Stijn de Witt
82

Ein weiterer Grund für die kurze Version ist, dass sie mit anderen Fällen übereinstimmt, in denen Sie möglicherweise einen Zeichensatz im Markup angeben. Zum Beispiel:

<script type="javascript" charset="UTF-8" src="/script.js"></script>

<p><a charset="UTF-8" href="http://example.com/">Example Site</a></p>

Konsistenz hilft, Fehler zu reduzieren und Code besser lesbar zu machen.

Beachten Sie, dass das Zeichensatzattribut die Groß- und Kleinschreibung nicht berücksichtigt. Sie können UTF-8 oder utf-8 verwenden, UTF-8 ist jedoch klarer, lesbarer und genauer.

Es gibt auch absolut keinen Grund, einen anderen Wert als UTF-8 im Meta-Zeichensatz-Attribut oder im Seitenkopf zu verwenden. UTF-8 ist die Standardcodierung für Webdokumente seit HTML4 im Jahr 1999 und die einzige praktische Möglichkeit, moderne Webseiten zu erstellen.

Außerdem sollten Sie in UTF-8 keine HTML-Entitäten verwenden. Zeichen wie das Copyright-Symbol sollten direkt eingegeben werden. Die einzigen Entitäten, die Sie verwenden sollten, sind für die 5 reservierten Markup-Zeichen: kleiner als, größer als, kaufmännisches Und, Primzahl, doppelte Primzahl. Entitäten benötigen einen HTML-Parser, den Sie in Zukunft möglicherweise nicht immer verwenden möchten. Er führt zu Fehlern, macht Ihren Code weniger lesbar, erhöht die Dateigröße und dekodiert manchmal in verschiedenen Browsern falsch, je nachdem, welche Entitäten Sie verwendet haben. Erfahren Sie, wie Sie Copyright, Marke, offenes Zitat, geschlossenes Zitat, Apostroph, Bindestrich, Bindestrich, Aufzählungszeichen, Euro und andere Zeichen, auf die Sie in Ihrem Inhalt stoßen, eingeben / einfügen und diese tatsächlichen Zeichen in Ihrem Code verwenden. Der Mac verfügt über eine Zeichenanzeige, die Sie in den Tastatursystemeinstellungen aktivieren können. Sie können die benötigten Zeichen suchen und dann per Drag & Drop verschieben oder den passenden Keyboard Viewer verwenden, um zu sehen, welche Tasten Sie eingeben müssen. Die Marke ist beispielsweise Option + 2. UTF-8 enthält alle Zeichen und Symbole aus jeder geschriebenen menschlichen Sprache. Es gibt also keine Entschuldigung für die Verwendung - anstelle eines Bindestrichs. Es ist keine schlechte Idee, auch die Regeln für Interpunktion und Typografie zu lernen ... zum Beispiel zu wissen, dass ein Punkt innerhalb eines engen Zitats und nicht außerhalb liegt.

Die Verwendung eines Tags für etwas wie Inhaltstyp und Codierung ist sehr ironisch, da Sie die Datei ohne Kenntnis dieser Dinge nicht analysieren konnten, um den Wert des Meta-Tags zu erhalten.

Nein, das stimmt nicht. Der Browser beginnt mit dem Parsen der Datei als Standardcodierung des Browsers, entweder UTF-8 oder ISO-8859-1. Da US-ASCII eine Teilmenge von beiden ISO-8859-1 ist und UTF-8 ist, kann der Browser so oder so gut lesen ... es ist dasselbe. Wenn der Browser auf das Meta-Zeichensatz-Tag stößt und die Codierung von der bereits verwendeten abweicht, lädt der Browser die Seite in der angegebenen Codierung neu. Aus diesem Grund setzen wir das Meta-Zeichensatz-Tag direkt nach dem Head-Tag oben, vor allem anderen, sogar vor dem Titel. Auf diese Weise können Sie UTF-8-Zeichen in Ihrem Titel verwenden.

Sie müssen Ihre Datei (en) in UTF-8-Codierung ohne Stückliste speichern

Das ist nicht unbedingt richtig. Wenn Ihr Dokument nur US-ASCII-Zeichen enthält, können Sie es als US-ASCII speichern und als UTF-8 bereitstellen, da es sich um eine Teilmenge handelt. Wenn jedoch Unicode-Zeichen vorhanden sind, müssen Sie als UTF-8 ohne Stückliste speichern.

Wenn Sie einen guten Texteditor benötigen, der Ihre Dateien in UTF-8 speichert, empfehle ich Notepad ++.

Verwenden Sie auf dem Mac Bare Bones TextWrangler (kostenlos) aus dem Mac App Store oder Bare Bones BBEdit, das im Mac App Store für 39,99 US-Dollar erhältlich ist ... sehr günstig für ein so großartiges Tool. In beiden Apps befindet sich am unteren Rand des Dokumentfensters ein Menü, in dem Sie die Dokumentcodierung angeben und ganz einfach "UTF-8 no BOM" auswählen können. Und natürlich können Sie dies als Standard für neue Dokumente in den Einstellungen festlegen.

Wenn Ihr Webserver jedoch die empfohlene Codierung im HTTP-Header bereitstellt, sind beide [Meta-Tags] nicht erforderlich.

Das ist falsch. Sie sollten die Codierung natürlich im HTTP-Header festlegen, aber Sie sollten sie auch im Meta-Zeichensatz-Attribut festlegen, damit die Seite vom Benutzer aus dem Browser im lokalen Speicher gespeichert und später erneut geöffnet werden kann. In diesem Fall Der einzige Hinweis auf die vorhandene Codierung ist das Meta-Zeichensatzattribut. Aus dem gleichen Grund sollten Sie auch ein Basis-Tag festlegen. Auf dem Server ist das Basis-Tag nicht erforderlich. Beim Öffnen aus dem lokalen Speicher ermöglicht das Basis-Tag jedoch, dass die Seite so funktioniert, als ob sie sich auf dem Server befindet Vermögenswerte vorhanden und so weiter, keine defekten Links.

AddDefaultCharset UTF-8

Oder Sie können einfach die Codierung bestimmter Dateitypen wie folgt ändern:

AddType text/html;charset=utf-8 html

Ein Tipp zum Bereitstellen von UTF-8- und Latin-1-Dateien (ISO-8859-1) besteht darin, den UTF-8-Dateien eine "Text" -Erweiterung und den Latin-1-Dateien "txt" zu geben.

AddType text/plain;charset=iso-8859-1 txt
AddType text/plain;charset=utf-8 text

Erwägen Sie schließlich, Ihre Dokumente mit Unix-Zeilenenden zu speichern, nicht mit älteren DOS- oder (klassischen) Mac-Zeilenenden, die nicht helfen und schaden können, insbesondere auf der ganzen Linie, wenn wir uns immer weiter von diesen alten Systemen entfernen. Ein HTML-Dokument mit gültiger HTML5-, UTF-8-Codierung und Unix-Zeilenenden ist eine gute Arbeit. Sie können dieses Dokument in vielen Kontexten freigeben, bearbeiten, speichern, lesen, wiederherstellen und sich darauf verlassen. Es ist Verkehrssprache. Es ist digitales Papier.

Simon White
quelle
20
"Wenn Ihr Dokument nur ISO-8859-1-Zeichen enthält, können Sie es als ISO-8859-1 speichern und als UTF-8 bereitstellen, da es sich um eine Teilmenge handelt" - falsch. Es wäre richtig, wenn Sie "ISO-8859-1" in "US-ASCII" ändern würden. US-ASCII ist mit UTF-8 kompatibel, da es sich um eine Teilmenge handelt, ISO-8859-1 nicht. Um ISO-8859-1 (mit Nicht-ASCII-Zeichen) in UTF-8 zu konvertieren, müssten Sie die Nicht-ASCII-Zeichen codieren. Die Codepunkte für ISO-8859-1 sind in Unicode vorhanden, aber UTF-8 codiert diejenigen außerhalb von US-ASCII anders als ISO-8859-1.
Thomasrutter
2
Ihr Standpunkt zu HTML-Entitäten ist gut. In der Vergangenheit habe ich Entitäten nur verwendet, um festzustellen, dass sie in ihre UTF-8-Zeichen konvertiert wurden, nachdem sie auf verschiedenen Systemen gespeichert und / oder in verschiedenen Editoren geöffnet wurden. Es ist jedoch anzumerken, dass nicht unterbrechende Leerzeichen (& nbsp;) verwirrende Ergebnisse liefern können, da Sie sie normalerweise nicht in Ihrem Editor sehen. Aus Gründen der Klarheit sollten Sie sie daher normalerweise als Entitäten behalten (meiner Erfahrung nach).
Squidbe
"You should also set a base tag..."sollte mit den hier beschriebenen Einschränkungen kommen .
Mafuba
Ein weiterer Grund, warum Sie HTML-Entitäten bevorzugen, ist die Verwendung von Ionen . Ich würde lieber sehen &#xf101;als die Standard-Glyphe oder ein seltsames Zeichen, das ich nicht erkenne.
Daniel Lubarov
30

<meta charset="utf-8"> wurde mit / für HTML5 eingeführt.

Wie in der Dokumentation erwähnt, sind beide gültig. Jedoch,<meta charset="utf-8"> jedoch nur für HTML5 (und einfacher zu tippen / zu merken).

Zu gegebener Zeit wird der alte Stil in naher Zukunft veraltet sein. Ich würde mich an das Neue halten <meta charset="utf-8">.

Es gibt nur einen Weg, aber nach oben. Im Fall von Tech bedeutet dies, das Alte auslaufen zu lassen (wirklich WIRKLICH schnell).

Dokumentation: HTML-Meta-Zeichensatzattribut - W3Schools

Omar
quelle
2
Informationen
Tripleee
18

Obwohl ich die anderen Antworten nicht bestreite, denke ich, dass das Folgende erwähnenswert ist.

  1. Die "lange" ( http-equiv) Notation und die "kurze" Notation sind gleich, je nachdem, was zuerst kommt, gewinnt;
  2. Webserver-Header überschreiben alle <meta>Tags.
  3. BOM (Byte Order Mark) überschreibt alles und wirkt sich in vielen Fällen auf HTML 4 (und wahrscheinlich auch auf andere Dinge) aus.
  4. Wenn Sie keine Codierung deklarieren, erhalten Sie Ihren Text wahrscheinlich in der von Ihrem Browser definierten "Fallback-Textcodierung". Weder in Firefox noch in Chrome ist es utf-8;
  5. In Ermangelung anderer Hinweise versucht der Browser, Ihr Dokument so zu lesen, als wäre es in ASCII, um die Codierung zu erhalten. Sie können also keine seltsamen Codierungen verwenden (utf-16 mit Stückliste sollte dies jedoch tun).
  6. Während die Spezifikationen besagen, dass die Codierungsdeklaration innerhalb der ersten 512 Bytes des Dokuments liegen muss, werden die meisten Browser versuchen, mehr als das zu lesen.

Sie können testen, echo 'HTTP/1.1 200 OK\r\nContent-type: text/html; charset=windows-1251\r\n\r\n\xef\xbb\xbf<!DOCTYPE html><html><head><meta http-equiv="Content-Type" content="text/html; charset=utf-8"><meta charset="windows-1251"><title>привет</title></head><body>привет</body></html>' | nc -lp 4500indem Sie Ihren Browser ausführen und darauf zeigen localhost:4500. (Natürlich möchten Sie Teile ändern oder entfernen. Der Stücklistenteil ist \xef\xbb\xbf. Seien Sie vorsichtig bei der Codierung Ihrer Shell.)

Bitte beachten Sie, dass es sehr wichtig ist, dass Sie die Codierung explizit deklarieren. Das Erraten von Browsern kann zu Sicherheitsproblemen führen.

Eichhörnchen
quelle
1
Gute Punkte, aber können Sie genau angeben, auf welche Sicherheitsprobleme Sie sich beziehen?
Armfoot
1
Die lange Notation sollte die kurze nicht überschreiben - einfach die erste im Dokument sollte gewinnen.
Gsnedders
1
@Armfoot In der Vergangenheit gab es Probleme mit UTF-7dem, woran ich mich erinnere. Auch das Schnüffeln im Web ist im Allgemeinen schlecht, z. B. wenn Sie ein Bild hochladen, das als Skriptinhalt gerochen wird.
Phk
@gsnedders in Chrom und Firefox getestet, Sie haben Recht. bearbeitete die Antwort entsprechend. Armfoot: Es ging um eine 7-Bit-Codierung, ich erinnere mich nicht genau, was.
Eichhörnchen
1
@CraigMcQueen ist sich ziemlich sicher, dass der Browser-Fallback (im Jahr 2018) in Westeuropa immer noch standardmäßig westeuropäisch ist. Ich stelle mir daher vor, dass standardmäßig die in jeder Region vorherrschende Pre-Unicode-Codierung verwendet wird. Benutzer können den Fallback auf utf-8 setzen, aber dies enthüllt nur die beschissene Codierung, die Tausende von Websites immer noch als fehlerhafte High-Byte-ASCII-Zeichen verwenden, sodass dies immer noch nicht üblich ist. Mehr ist schade. Ich kann nicht sehen, wie sich dies ohne ein wenig Zwang der Browser-Anbieter ändern wird, und sie sind nicht daran interessiert, alte Sachen zu brechen.
brennanyoung
13

Verwenden <meta charset="utf-8" /> für Webbrowser bei Verwendung von HTML5.

Verwendung <meta http-equiv="Content-Type" content="text/html; charset=utf-8" />bei Verwendung von HTML4 oder XHTML oder für veraltete Dom-Parser wie DOMDocumentin PHP 5.3

Timo Huovinen
quelle
2

Es gibt einige Neuigkeiten, die auf Mozilla Foundation und Sitepoint basieren

Verwenden Sie diesen Wert ( http-equiv=content-type) nicht, da er veraltet ist. Bevorzugen Sie das charsetAttribut für das < meta> Element. Geben Sie hier die Bildbeschreibung ein

user10089632
quelle
Oh, endlich etwas Neues
Ayyash
1

Um eine Signatur in eine E-Mail einzubetten, würde ich die lange Version verwenden:

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

Der Grund dafür ist, dass nicht viele E-Mail-Reader HTML5 verwenden. Daher ist es immer besser, alte HTML-Stile zu verwenden. Eigentlich ist es besser, Tabellen als divs + css zu verwenden.

Chelder
quelle