W3docs

HTML accept-charset-Attribut

Das HTML-Attribut accept-charset legt die Zeichenkodierung für Formularübermittlungen fest. Verwendung am <form>-Element erklärt.

Das HTML-Attribut accept-charset gibt die Zeichenkodierung (Charset) an, die der Browser beim Senden eines Formulars an den Server verwenden soll.

Dieses Attribut kann ausschließlich am <form>-Element verwendet werden — bei Eingabefeldern, Schaltflächen oder anderen Tags hat es keine Bedeutung. Sein Wert ist eine durch Leerzeichen oder Kommas getrennte Liste aus einer oder mehreren Zeichenkodierungen. Der Standardwert ist UNKNOWN, was dem Browser mitteilt, dieselbe Kodierung wie das Dokument zu verwenden, das das Formular enthält. Das explizite Schreiben von accept-charset="UNKNOWN" ist nie nötig: Diesen Standard erhält man automatisch, indem man das Attribut weglässt.

Warum dieses Attribut existiert

Um accept-charset zu verstehen, muss man sich das Web vorstellen, bevor UTF-8 universell wurde. In den späten 1990er- und 2000er-Jahren wurden Dokumente häufig in Einzelbyte-Kodierungen ausgeliefert, z. B. ISO-8859-1 (Westeuropäisch), Shift_JIS (Japanisch) oder windows-1251 (Kyrillisch). Eine Seite in einer Kodierung konnte Daten an einen Server schicken, der eine andere erwartete, und ein Formularfeld mit Zeichen, die die Zielkodierung nicht darstellen konnte, kam auf dem Server als unlesbarer Datenmüll (Mojibake) an. accept-charset war der Ausweg: Es erlaubte einem Autor zu sagen: „Kodiere die Übermittlung dieses Formulars als dieses Charset, unabhängig davon, welche Kodierung die Seite selbst verwendet."

Diese Diskrepanz ist die einzige Situation, in der das Attribut jemals eine Rolle spielte — eine Seite in einer veralteten Kodierung, die Daten an ein Backend sendet, das eine andere erwartet. Sobald der gesamte Stack auf UTF-8 standardisiert war, verschwand das Problem.

Wichtig — dieses Attribut ist heute praktisch wirkungslos. In der Praxis übermitteln alle modernen Browser Formulardaten unter Verwendung der eigenen Kodierung des Dokuments — UTF-8 für jede moderne Seite — unabhängig von accept-charset. (Der HTML-Formularübermittlungsalgorithmus definiert zwar, wie eine angegebene Kodierung ausgewählt würde, aber da heutige Seiten und Browser durchgehend UTF-8 verwenden, ändert das Attribut nichts.) Für neue Seiten ist der zuverlässige Weg zur Kodierungssteuerung, das Dokument als UTF-8 auszuliefern (mit <meta charset="UTF-8">) und den Browser UTF-8 übermitteln zu lassen — accept-charset wird so gut wie nie benötigt.

Syntax

<form accept-charset="character_set"></form>

Häufige Zeichensatz-Werte

WertBeschreibung
UTF-8Universelle Unicode-Kodierung. Das Standardverhalten jedes modernen Browsers und der empfohlene Wert für nahezu alle Formulare.
ISO-8859-1Latin-1, eine veraltete 8-Bit-Kodierung für westeuropäische Sprachen. Kann die meisten Nicht-Lateinzeichen nicht darstellen; nur für alte Systeme relevant.
UNKNOWNDer Standard. Weist den Browser an, dieselbe Kodierung wie das Dokument zu verwenden, das das Formular enthält.

Es können mehrere Kodierungen aufgelistet werden (z. B. accept-charset="UTF-8 ISO-8859-1"); der Browser soll dann die erste auswählen, die er unterstützt. In modernen Browsern wird diese Liste praktisch ignoriert.

Moderner, korrekter Einsatz

Für nahezu jedes Formular, das man heute schreibt, ist der richtige Ansatz, nichts Besonderes zu tun: die Seite als UTF-8 ausliefern und accept-charset weglassen. Das Formular übermittelt dann automatisch UTF-8, was der Server erwarten sollte.

<!DOCTYPE html>
<html>
  <head>
    <meta charset="UTF-8" />
    <title>Contact form</title>
  </head>
  <body>
    <!-- No accept-charset needed: UTF-8 page submits as UTF-8 -->
    <form action="/contact" method="post">
      <input type="text" name="name" placeholder="Your name" />
      <input type="email" name="email" placeholder="Your email" />
      <input type="submit" value="Send" />
    </form>
  </body>
</html>

Wer explizit sein möchte, kann accept-charset="UTF-8" schreiben — das ist harmlos und dokumentiert die Absicht — ändert jedoch nichts, da UTF-8 bereits das Standardverhalten ist.

Beispiel für das HTML-Attribut accept-charset

Das folgende Beispiel setzt accept-charset="ISO-8859-1", eine veraltete Kodierung, um die Syntax des Attributs zu veranschaulichen. Beachte, dass aktuelle Browser dieses Formular trotzdem als UTF-8 übermitteln — dies ist eine Demonstration, keine Empfehlung.

<!DOCTYPE html>
<html>
  <head>
    <title>Title of the document</title>
    <style>
      input {
        display: block;
        margin-bottom: 10px;
      }
    </style>
  </head>
  <body>
    <form action="/form/submit" accept-charset="ISO-8859-1" method="post">
      <input type="text" name="name" placeholder="Enter your Name" />
      <input type="text" name="surname" placeholder="Enter your Surname" />
      <input type="number" name="age" placeholder="Enter your Age" />
      <input type="submit" value="Send" />
    </form>
  </body>
</html>

Verwandte Formularattribute

Das Attribut accept-charset wirkt zusammen mit den anderen Attributen, die am <form>-Element gesetzt werden:

  • action — die URL, an die die Formulardaten gesendet werden.
  • method — die HTTP-Methode (GET oder POST), die zum Übermitteln des Formulars verwendet wird.
  • <form>-Tag — das Container-Element, zu dem diese Attribute gehören.

Das verwandte Attribut enctype (am <form> gesetzt) steuert, wie die Formulardaten kodiert werden (z. B. multipart/form-data für Datei-Uploads) — das ist ein anderes Anliegen als die Zeichenkodierung, die accept-charset beschreibt. Siehe das Kapitel HTML-Formulare für das vollständige Bild, einschließlich enctype.

Was tun, wenn ich wirklich einen veralteten Non-UTF-8-Server unterstützen muss?

Da Browser accept-charset ignorieren, kann man eine UTF-8-Seite nicht dazu bringen, ISO-8859-1 (oder ein anderes Charset) zu übermitteln, indem man einfach das Attribut setzt — dieser Weg führt ins Leere. Wenn man mit einem alten Backend feststeckt, das nur eine Einzelbyte-Kodierung versteht, liegt die richtige Lösung auf der Serverseite, nicht im HTML:

  • Auf dem Server konvertieren. Die UTF-8-Übermittlung empfangen und in die veraltete Kodierung umkodieren, die die Anwendung benötigt (z. B. mit PHP's mb_convert_encoding, Python's bytes.decode/encode oder dem Äquivalent der eigenen Plattform). Dies ist der moderne, empfohlene Ansatz.
  • Das Backend zu UTF-8 migrieren, wo immer möglich — das beseitigt die gesamte Problemklasse dauerhaft.

Die Übermittlung auf dem Übertragungsweg als UTF-8 zu behandeln und erst an der Grenze zu konvertieren ist zuverlässig; sich darauf zu verlassen, dass accept-charset das erledigt, ist es nicht.

Übungen

Übung
Was ist das HTML-Attribut 'accept-charset'?
Was ist das HTML-Attribut 'accept-charset'?
Übung
An welchem Element kann das accept-charset-Attribut verwendet werden?
An welchem Element kann das accept-charset-Attribut verwendet werden?
Übung
Was passiert in einem modernen Browser, wenn accept-charset auf einer UTF-8-Seite weggelassen wird?
Was passiert in einem modernen Browser, wenn accept-charset auf einer UTF-8-Seite weggelassen wird?
Was this page helpful?