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.
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:
<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
im "head". AddDefautCharset UTF8
-Zeile in der Apache-Konfiguration (oder etwas Ähnliches in anderen Webservern). 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:
header()
. curl -I <URL>
nur die HTTP-Header an. 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.
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.
Tags und Links php mysql diacritics utf8-decode