PHP Umlaute trotz UTF-8 falsch ausgegeben

JavaBeginner

Ensign
Registriert
Juli 2015
Beiträge
142
Hallo, ich habe folgendes Problem. Mir ist es ein Rätsel warum mir Umlaute folgendermaßen ausgegeben werden:
Code:
ÃÂther kombiniert mit ÃÂlen
Ich habe bereits das Format via Debugging ausgeben lassen, es handelt sich hierbei um UTF-8 jedoch werden die Daten selbst beim Ausgeben für Debugging bereits fehlerhaft angezeigt (Javascript alert() ). Hat eventuell jemand eine Idee woran das liegen könnte? Bin seit längerem am verzweifeln und habe keinerlei Idee wo ich noch ansetzen könnte.
Code:
AddDefaultCharset UTF-8
in die .htacces zu packen brachte ebenfalls nichts.
 
Eventuell mal <meta charset='utf-8'> in den HTML Header schreiben oder mal schauen ob die PHP Datein auch in UTF 8 sind? Mit Notepad++ kann man auf Kodierung und dort auf UTF-8 Konvertieren.
 
Speichert dein Editor die Datei auch tatsächlich in UTF-8 ab?

Nutzt du mb_internal_encoding ?

Läuft dein Debugging auch über HTTP?

Teilst du dem Browser mit, dass du ihm UTF-8 sendest?
HTML:
<!DOCTYPE html>
<html>
    <head>
        <meta charset="utf-8" />
        ...
    </head>
    ...
</html>
 
Es handelt sich hierbei um eine dynamisch erstellte Tabelle. In der Datenbank ist utf8_unicode_ci als Zeichensatz gewählt. Beim manuellen editieren in der Datenbank gibt es kein Problem. Sobald es jedoch einmal in die Tabelle geladen wurde und daraufhin gespeichert sind die Umlaute fehlerhaft. Da ich ein ähnliches Problem mit JSON bereits hatte und es folgendermaßen gelöst habe:
Code:
    function utf8ize($d) {
        if (is_array($d)) {
            foreach ($d as $k => $v) {
                $d[$k] = utf8ize($v);
            }
        } else if (is_string ($d)) {
            return utf8_encode($d);
        }
        return $d;
    }
$json_data=array(
    "draw"              =>  intval($request['draw']),
    "recordsTotal"      =>  intval($totalData),
    "recordsFiltered"   =>  intval($totalFilter),
    "data"              =>  ($data)
);


echo json_encode((utf8ize($json_data)), JSON_UNESCAPED_UNICODE);

ist es mir ein Rätsel was genau es in der Tabelle sein kann. Es handelt sich hierbei um dataTables falls es relevant ist.
Code:
<meta charset="utf-8" />
ist ebenfalls eingebunden.
 
Das in der Datenbank "utf8_unicode_ci " versendet wird, bedeutet nur, dass der Server dies zum speichern, sortieren und vergleichen benutzt.

Der Server gibt die Daten im vom Client angefragten Encoding zurück. Hier muss auch UTF-8 eingestellt werden. Hierfür wird z.B. mysqli_set_charset() verwendet. Wenn du PDO verwendest, kannst du auch";charset=UTF8" an den DSN anhängen.
 
MisC schrieb:
Das in der Datenbank "utf8_unicode_ci " versendet wird, bedeutet nur, dass der Server dies zum speichern, sortieren und vergleichen benutzt.

Der Server gibt die Daten im vom Client angefragten Encoding zurück. Hier muss auch UTF-8 eingestellt werden. Hierfür wird z.B. mysqli_set_charset() verwendet. Wenn du PDO verwendest, kannst du auch";charset=UTF8" an den DSN anhängen.

Habe ich auch schon versucht...hatte aber keinerlei Auswirkung.
 
Das Problem wird genau deine utf8ize-Funktion sein. Du encodierst einen UTF-8-String erneut in UTF-8.
Code:
$string = 'Äther'; // Quelldatei: UTF-8
$string2 = utf8_encode($string);

echo "<!DOCTYPE html>
<html>
<head><meta charset=\"utf-8\" /></head>
<body>$string<br>$string2</body>
</html>";
Ausgabe:
Code:
Äther
Ãther
Das à sind tatsächlich 2 Unicode-Zeichen, so wie in deiner Ausgabe, es wird hier nur nicht richtig angezeigt.

Konvertiere nur, wenn du absolut sicher bist, dass du keinen UTF-8-String vorliegen hast.
Wenn du bisher die SQL-Verbindung ohne UTF-8-Encoding verwendet hast, wie von MisC angemerkt, solltest du die Daten nochmal schreiben.
 
Wenn ich das richtig verstandan habe, war das nur ein Beispiel für sein JSON Problem und wird beim aktuellen Problem nicht genutzt.

Um das Problem besser eingrenzen zu können mach mal bitte folgendes:
PHP:
echo html_entity_decode('&szlig; &copy; &trade; &iquest; &euro; &yen;', ENT_HTML5, 'UTF-8');
Du solltest dann folgende Ausgabe bekommen:
ß © ™ ¿ € ¥
Falls du hier was anderes bekommst als erwartet ist zumindest schonmal klar, dass das Problem bei PHP / Webserver zu suchen ist und vermutlich nicht bei der Datenbank. Dann am besten mal die HTTP-Header die der Server sendet analysieren oder hier posten.
 
Zuletzt bearbeitet:
Zurück
Oben