• Jetzt anmelden. Es dauert nur 2 Minuten und ist kostenlos!

JS verunstaltet Umlaute beim Text aus der Datenbank

Hallo alle miteinander, stellt euch folgende Problemstellung vor:

formular.png


In der Datenbank ist der Name einer Person gespeichert: Anneliese Höhn. PHP fügt diesen Namen im Text rechts neben dem "CLICK HIER" Button vollkommen korrekt mit einem "ö" ein. Wenn der Buton CLICK HIER geklicht wird, soll JS in die oberen Inputfelder ebenso Texte mit Umlauten einfügen - links den per AJAX aus der Datenbank gelesenen Namen und rechts das im Skript vorgegebene Wort "Höhe".

Das im Skript vorgegebene Wort "Höhe" wird ebenso korrekt eingefügt, nicht aber AnnelieseHöhn! Und "nutze immer UTF 8" scheint diesmal nicht die Lösung zu sein oder aber der Server, auf dem meine Webanwendung läuft, mag UTF 8 nicht. Denn die Datenbanktabelle hat als Zeichensatz "utf-8 bin" definiert. Wenn ich in den Metatag charset="utf-8" reinschreibe würde das "ö" im Text neben dem Button auch nur gegen das gleiche Fragezeichen in einer schwarzen Raute ausgetauscht werden wie im Bild oben im ersten Inputfeld, ist nicht die Lösung. Und im Inputfeld steht es dann auch falsch.

Hier das erste Skript:

Code:
<html>
<head>

</head>
<script src="../tools_v7.js"></script>
<body>
<input id="test_input1">&nbsp;<input id="test_input2"><p>
<input type="button" id="testbutton" value="CLICK HIER" onclick="text_einfuegen()">
<?php
include "../FUNCTIONS.php";
$mysqli = MyDatabase();
$abfrage = "SELECT * FROM `z_testtabelle`";
if($result = $mysqli->query($abfrage)) {
    while($row = $result->fetch_object()) {
        $text = $row->text;
    }
}
echo 'TEST: In die Inputfelder soll per AJAX der Text '.$text.' eingef&uuml;gt werden.';
?>
</body>
</html>

<script>
function text_einfuegen() {
    // AJAX Teil
    resOb = erzXHRObjekt();
    resOb.open('get', "umlaute_AJAX.php", false);
    resOb.onreadystatechange = text_ausgeben;
    resOb.send(null);
}

function text_ausgeben() {
    myArray = new Array;
    myText  = resOb.responseText;
    myArray = myText.split("*");

    var text_db = myArray[0];
    var text_script = myArray[1];
    
    document.getElementById("test_input1").value = text_db;
    document.getElementById("test_input2").value = text_script;
}

</script>

sowie die Seite, die die Daten aus der DB holt:

Code:
<?php
include "../FUNCTIONS.php";

$mysqli = MyDatabase();
$abfrage = "SELECT * FROM `z_testtabelle`";
if($result = $mysqli->query($abfrage)) {
    while($row = $result->fetch_object()) {
        $text = $row->text;
    }
}
echo $text."*Höhe";
?>

Ich muss es schaffen, auch per AJAX Namen von Personen korrekt mit Umlauten in meine Seite einzufügen. Nun frage ich mich, ob das Problem für mich überhaupt lösbar ist, oder ob ich den Anbieter des Webspace kontaktieren muss, weil es womöglich an für mich nicht konfigurierbaren Servereinstellungen liegt?...

Bin sehr gespannt auf eure Rückmeldungen!
 
Werbung:
Das Script selber ist auch im UTF-8 Format ohne BOM gespeichert?
 
Werbung:
Ja, auch das Skript ist in UTF-8 ohne BOM kodiert, das habe ich bereits als Voreinstellung im Visual Studio Code. Habe gerade noch die Kodierung im Terminal überprüft.
 
Das Interessante ist, dass obwohl phpMyAdmin sagt, dass der Zeichensatz des Servers UTF-8 sei, steht ganz unten unter der Auflistung der Tabellen - in der letzten Zeile in der nochmal angegeben wird, wie viele Tabellen die Datenbank insg. beinhaltet, "latin1_swedish_ci":
db_zeichensatz.png

Der Kundensupport behauptet, dies hätte nichts zu sagen, weil der Serverzeichensatz UTF-8 ist.

Soll ich das so glauben?

Habe eine skriptseitige Lösung gefunden, ohne mich mit dem Zeichensatz der jeweiligen Datei und dem der Datenbank etc. zu beschäftigen. Die Seite, welche das aus der Datenbank gelesene Ergebnis an AJAX zurückgibt, stellt sicher, dass das Ergebnis in UTF-8 kodiert ist:

Code:
$antwort = utf8_encode($text);
echo $antwort."*Höhe";

Bei Verwendung der Funktion utf8_encode() spielt es letztlich nicht mal mehr eine Rolle, ob die Datenbanktabelle selbst in UTF-8 oder Latin-1 kodiert ist, die Korrekte Ausgabe der Umlaute funktioniert in beiden Fällen.

Danke fürs Mitdenken!
 
utf8_encode ist völlig unnötig, wenn alles auf UTF-8 eingestellt ist, sprich
  1. Datei im UTF-8-Format
  2. Character-Set auf UTF-8
  3. Datenbank-Verbindung auf UTF-8
  4. Tabellen auf UTF-8
Deine Datenbank ist mit der Kollation latin1_swedish_ci erzeugt worden, die Tabellen mit UTF-8. Ist zwar nicht schön, aber das sollte nicht das Problem sein.
 
Werbung:
Deine Datenbank ist mit der Kollation latin1_swedish_ci erzeugt worden, die Tabellen mit UTF-8. Ist zwar nicht schön, aber das sollte nicht das Problem sein.

Es scheint aber der einzige Unterschied zwichen der Datenbank die lokal auf meinem Rechner läuft und der auf dem gemieteten Webspace zu sein. Ich betreibe nun keine eigenen Server, der Anbieter dagegen (all-inkl.com) behauptet, sie könnten die Kollation der Datenbank nicht ändern. Würde angeblich daran liegen, dass MySQL von schwedischen Entwicklern stammt und von daher dies der Standardzeichensatz sei. Meine Anmerkung, dass das MySQL welches ich auf meinem Rechner lokal zur Entwicklung nutze ebenso von den gleichen Entwicklern stammt und ich dennoch die Möglichkeit habe utf8 als Standardzeichensatz festzulegen, stößt auf taube Ohren. Ich kann den Zeichensatz einer Datenbank auf einem gemieteten Webspace nicht selber festlegen.

Habe mir gerade die Datenbank einer Domain angeschaut, die ich bei alfahosting.de habe. Auch die hat nicht utf8 als Zeichensatz, sondern latin1_german1_ci - warum tun die Leute so etwas, wenn überall beschrieben wird, dass man utf8 konsequent nutzen sollte?....

Nun werde ich also entweder einen anderen Anbieter finden müssen bei dem die Datenbanken utf8 als Zeichensatz haben oder ich müsste überall Skriptseitig nachhelfen.
 
Hast du phpMyAdmin auf dem Server? Kannst du selber eine DB anlegen? Wenn beides ja, dann kannst du selber den Zeichensatz einstellen.
 
Zurück
Oben