Mein Skript funktioniert gut, aber ich bin verwirrt darüber, warum ich utf8_decode () verwenden muss

9

Ich bin verwirrt über das Verhalten von utf8_decode () und möchte nur eine kleine Erläuterung. Ich hoffe, das ist in Ordnung.

Hier ist ein einfaches HTML-Formular, das ich verwende, um etwas Text zu erfassen und in meiner MySQL-Datenbank zu speichern (die die Sortierung utf8_general_ci verwendet):

%Vor%

Wie Sie sehen können, habe ich dies an den entsprechenden Stellen mit charset = utf8 codiert. Wir akzeptieren Text mit Diakritika (z. B. ñ, ó, usw.). Am Ende führen wir ein kleines Skript für alle Texteingaben aus, um nach Diakritika zu suchen und sie in HTML-Entitäten umzuwandeln (z. B. - wird & amp; ntilde;).

Wenn die Eingabe von meinem Skript empfangen wird, muss ich zuerst utf8_decode ($ input) eingeben und dann mein kleines Skript ausführen, um Diakritika nach Bedarf zu prüfen und zu ändern. Alles funktioniert gut. Ich bin neugierig, warum ich den Decoder an diesem Eingang ausführen muss. Ich verstehe, dass utf8_decode eine in UTF-8 codierte Zeichenkette in ISO-8859-1 umwandelt. Ich will sicher gehen - obwohl alles gut funktioniert (oder so denke ich) - dass ich nicht etwas verdrehtes mache, das mich später einholen wird. Zum Beispiel, dass ich ISO-8859-1-kodierte Zeichen sende, die in meiner Datenbank gespeichert werden sollen, die für das Speichern / Bereitstellen von UTF-8-Zeichen eingerichtet ist. Sollte ich etwas wie utf8_encode () in der Zeichenfolge ausführen, die mein diacritics-to-entities-Skript zurückgibt? ZB:

%Vor%

Schätzen Sie alle Einblicke, die jemand dazu bieten kann.

    
user1286755 22.03.2012, 19:06
quelle

3 Antworten

1

Verwenden Sie nicht "accept-charset". Es ist kaputt. Die meisten Browser haben damit aufgehört, sie in ihre eigenen HTTP-Anfragen zu senden. Einige Browser (IE) ignorieren dieses Attribut vollständig, wenn sie ein Formular analysieren, und andere tun dies nur sehr eingeschränkt. In der Praxis wird der "Akzeptieren-Zeichensatz" mehr schaden als nützen.

Die Konvention sieht vor, dass der Browser die Daten in der gleichen Codierung sendet wie das Formular. Stellen Sie daher sicher, dass Ihre Seite als UTF-8 gesendet wird. Dein Meta-Tag im Kopf des HTML ist nicht genug. Für eine PHP-Seite kann diese Einstellung an drei Stellen eingestellt werden:

  • Ein HTML-Tag <meta http-equiv="Content-Type" content="text/html; charset=utf-8" /> im "head".
  • Eine AddDefautCharset UTF8 -Zeile in der Apache-Konfiguration (oder etwas Ähnliches in anderen Webservern).
  • Ein PHP-Aufruf an header("Content-type=text/html; charset=utf-8"); (bevor irgendetwas auf der Seite angezeigt wird).

Jede Direktive überschreibt die vorherigen. Wenn Ihr Server also bereits einen Zeichensatz deklariert, wird Ihr Meta-Tag ignoriert.

Also sollten Sie:

  • Stellen Sie sicher, dass Ihre Quelldatei natürlich in UTF-8 ist.
  • Korrigieren Sie Ihre HTML-Quelle, damit sie bei W3C validiert wird. Zum Beispiel sollte Ihr Meta-Tag in XHTML geschlossen sein.
  • Entfernen Sie die "accept-charset" -Attribute.
  • Erzwingen Sie schließlich die Kodierungserklärung in Apache oder mit PHP header() .
  • Stellen Sie in Ihrem Browser sicher, dass die vom Server empfangenen HTTP-Header die richtige Codierung aufweisen (oder keine Codierung, wenn Sie sich auf Ihr Meta-Tag verlassen). Unter Linux zeigt curl -I <URL> nur die HTTP-Header an.
user699082 25.03.2012 15:48
quelle
0

Beim Senden eines Formulars mit accept-charset="utf-8" sendet der Browser die Formulardaten in ISO-8859-1-Zeichen, die mit utf-8 codiert sind, an den Server. utf8_decode wandelt den codierten Datenbestand in eine strenge ISO-8859-1 um. Wenn Sie beispielsweise "ñ" senden, wird die utf-8-Codierung "% F1" an Ihre Formularaktion senden, die wiederum in "ñ" konvertiert werden muss, damit Ihr Skript funktioniert.

    
R2-Bacca 22.03.2012 19:22
quelle
0

Damit wird die Seite aufgerufen, auf der der in utf-8 anzuzeigende Text angezeigt wird, aber selbst wenn Sie mit accept-charset="utf-8" zu utf8 wechseln, konzertiert der Server ihn nach iso-8859-1 und wann es wird angezeigt, es wird dann von iso-8859-1 wieder in utf-8 konvertiert, konnte aber nur ein utf-8-char konvertieren, so dass es am Ende einen seltsamen char zeigt und jedes Mal, wenn man diesen Prozess durchläuft, wird es schlimmer und schlimmer, so was ich gefunden habe ist, obwohl Sie alles auf der html-Seite tun, gibt es keine Möglichkeit, es auf dem Server zu schalten, damit es UTF-8 lesen und so können Sie nicht alles zu utf-8 wechseln . Das ist auf Apache und wenn es einen Weg gibt, den ich gerne kennen würde.

    
Ian Overton 22.03.2012 20:14
quelle

Tags und Links