2 Stimmen

Probleme mit utf-8-Kodierung in php

Ein weiteres utf-8-bezogenes Problem, glaube ich...

Ich verwende php, um Daten in einer Mysql-Datenbank zu aktualisieren und diese Daten dann an anderer Stelle auf der Website anzuzeigen. Zuvor habe ich in utf-8 Probleme vor, wo Sonderzeichen als Fragezeichen angezeigt werden, wenn in einem Browser angezeigt, aber dieses scheint etwas anders.

Ich muss eine Reihe von Datensätzen eingeben, die das Zeichen è enthalten. Wenn ich dies direkt in die Datenbank eingebe, wird es korrekt auf der Seite angezeigt, was bedeutet, dass der utf-8-Inhalt korrekt ausgegeben wird.

Wenn ich jedoch versuche, die Werte in der Datenbank über php zu aktualisieren, wird das Zeichen è ersetzt. Stattdessen erscheint & Atilde ; & uml ; (ohne die Leerzeichen), was im Browser als è erscheint

Ich habe die Tabellen in der Datenbank so eingestellt, dass sie UTF-8 verwenden. Ich glaube, dass dies korrekt ist, denn wie bereits erwähnt, wenn ich die Datenbank über phpMyAdmin aktualisiere, ist alles in Ordnung. In ähnlicher Weise habe ich die Zeichenkodierung für die Seite eingestellt, die korrekt zu sein scheint. Ich führe auch die Sql-Anweisung "SET NAMES 'utf8';" aus, bevor ich versuche, die Datenbank zu aktualisieren.

Hat jemand eine andere Idee, wo das Problem liegen könnte?

Vielen Dank!

3voto

Peter Bailey Punkte 103278

Jawohl.

Das Zeichen, das Sie haben, ist LATEINISCHER KLEINBUCHSTABE E MIT GRAB . Wie Sie sehen können, wird dieses Zeichen in UTF-8 in zwei Bytes kodiert 0xC3 y 0xA8 .

In vielen westlichen Standardkodierungen (z. B. ISO-8859-1), die nur aus einem Byte bestehen, wird dieses Multi-Byte-Zeichen jedoch als zwei separate Zeichen dekodiert, LATEINISCHER GROSSBUCHSTABE A MIT TILDE y DIAERESIS . Beachten Sie, dass sie beide kodiert sind als C3 y A8 in ISO-8859-1?

Außerdem sieht es so aus, als würde PHP diese Zeichen durch htmlentities() die zur Folge haben, dass die à y ¨ beziehungsweise.

Wo genau liegt also das Problem in Ihrem Code? Nun, htmlentities() könnte dies ganz von selbst tun, da sein 3. Argument ein Kodierungsname ist - den Sie möglicherweise nicht richtig auf 'UTF-8' . Es könnte aber auch eine andere Funktion zur Verarbeitung von Zeichenketten sein. (Hinweis: Generell ist es keine gute Idee, HTML-Entities in der Datenbank zu speichern - dieser Schritt sollte für die Anzeige reserviert sein)

Es gibt eine Reihe von anderen Möglichkeiten, sich mit UTF-8 in php zu verheddern - ich schlage vor, dass Sie sich auf das Spickzettelchen und stellen Sie sicher, dass Sie in guter Verfassung sind.

1voto

Your Common Sense Punkte 154708

Nun, es ist Ihr eigener Code, der Zeichen in Entitäten umwandelt.
Um es richtig zu machen:

  1. Verbot htmlentities Funktion für immer aus Ihren Skripten entfernen.
  2. Utilice htmlspecialchars aber nicht beim Einfügen, sondern bei der Anzeige von Daten.
  3. Reparieren Sie vorhandene Daten in der Datenbank mit html_entity_decode .

0voto

Artefacto Punkte 93200

Ich nehme an, Sie nehmen die Ergebnisse einer Formularübermittlung und fügen die Ergebnisse in die Datenbank ein. Wenn ja, müssen Sie sicherstellen, dass Sie den Browser anweisen, UTF-8-Daten zu senden, und Sie sollten die Benutzereingabe auf einen gültigen UTF-8-Stream überprüfen.

Ändern Sie Ihr Formularelement so, dass es accept-charset enthält:

<form accept-charset="utf-8" method="post" ... >
    <input type="text name="field" />
    ...
</form>

Validieren Sie die Daten mit:

$valid = array_key_exists("field", $_POST) && !is_array($_POST['field']) &&
    preg_match('//u', $_POST['field']) && ...; //check length with mb_strlen etc.

0voto

Marek Punkte 7191

Ich glaube, Sie vermissen eine Content-Type-Deklaration auf der html-Seite:

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

Ist dies nicht der Fall, errät der Browser die Kodierung und wandelt alle Zeichen, die nicht in dieser Kodierung enthalten sind, beim Absenden eines Formulars in Entities um.

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X