Text mit Sonderzeichen wird in Textfeldern nicht angezeigt

Shadow1701

Ensign
Registriert
Juli 2012
Beiträge
211
Hi,

ich habe ein Script (selbst erstellt) was unter einer älteren Xampp version, Installiert vor ca. 1,5 Jahren ebenfalls unter Windows7, perfekt funktioniert hat.

Jetzt ist ein neuer Rechner da und ich habe die aktuelle Version von Xampp vor ca. 2 Wochen installiert.
alles funktioniert, bis auf eines:

Texte mit Sonderzeichen, die aus einer mySQL Datenbank geladen werden, werden im Browser korrekt dargestellt. Jetzt möchte ich den Text ändern, dafür wird der Text in einer Form in Textfeldern dargestellt. Sobald ein Sonderzeichen vorkommt (ä,ü,ö,–, usw.) bleiben die Textfelder aber einfach leer.

Folgendes ist mir aufgefallen (Die Variable " $tplout['namede_l']" speichert das was in einem der Textfelder ausgegeben werden soll)

Das funktioniert nicht:
Code:
$tplout['namede_l']=htmlspecialchars(stripslashes($row['epname_de']));

Das hingegen funktioniert:
Code:
$tplout['namede_l']=stripslashes($row['epname_de']);

Warum ist das so? Ich verstehe es nicht.

In der php.ini und in der my.ini ist kein charset gesetzt.
In der phpino() steht: default_charset - no value

Die betreffenden mySQL Tabellen verwenden alle latin1_german1_ci

Diese Einstellungen sind identisch mit der Installation auf meinem alten Rechner.

Über Google habe ich etwas zum Thema Oracle gefunden (hab ich nie benutzt und ich kenne mich dabei auch nicht aus), dort hat jemand behauptet die Lösung wäre wenn
putenv("NLS_LANG=GERMAN_GERMANY.WE8ISO8859P1");
am Anfang des Scripts gesetzt wird. Hat bei mir nicht funktioniert. Keine veränderung.

Auch das verändern des Charset in php und/oder mySQL führt nur dazu das Sonderzeichen im Browser nicht korrekt und in den Textfeldern weiterhin gar nicht dargestellt werden.

Ich danke schon mal fürs Lesen :)
 
2 Sachen...
1.) Du solltest dringend auf UTF-8 wechseln, das spart dir enorm viele Probleme mit Sonderzeichen. Der Wechsel muss aber "ganzheitlich" erfolgen, von der Datenbank bis hin zum HTML-Dokument.
2.) htmlspecialchars() solltest du auf keinen Fall entfernen, egal ob du jetzt mit UTF-8 arbeitest oder nicht. Andernfalls shredderst du im Zweifel die HTML-Darstellung. Speichere in der Datenbank nur korrekt maskierte Zeichen, das spart dir viele graue Haare.
 
Hancock schrieb:
Was sagt das HTML?
Was meinst du damit? Im HTML selbst ist kein charset angegeben.

Daaron schrieb:
2 Sachen...
1.) Du solltest dringend auf UTF-8 wechseln, das spart dir enorm viele Probleme mit Sonderzeichen. Der Wechsel muss aber "ganzheitlich" erfolgen, von der Datenbank bis hin zum HTML-Dokument.
2.) htmlspecialchars() solltest du auf keinen Fall entfernen, egal ob du jetzt mit UTF-8 arbeitest oder nicht. Andernfalls shredderst du im Zweifel die HTML-Darstellung. Speichere in der Datenbank nur korrekt maskierte Zeichen, das spart dir viele graue Haare.

Ich habe in der Datenbank alle Tabellen auf "utf8_general_ci" umgestellt. Ich speichere in der Datenbank nur korrekt maskierte Zeichen, die Datenbank kann ich als "sauber" bezeichnen.
leider besteht mein Script aus einigen tausend Zeilen, das alles durchzugehen und alle htmlspecialchars zu entfernen die eigentlich nicht gebraucht werden weil die Daten ordentlich in der Datenbank gespeichert werden ist mir schlicht zuviel Arbeit.

Kannst du mir helfen was das Thema ganzheitlicher Wechsel zu UTF-8 angeht? der Wechsel in der Datenbank alleine hat nicht funktioniert. Die Seite wird im Browser korrekt dargestellt, auch hier werden Texte aus der Datenbank geladen. Sobald die Texte aber durch die function htmlspecialchars() laufen wird nur ein leerer string zurückgegeben.

Da diese function aber teilweise mit anderen verschachtelt ist kann ich nicht einfach so alle mit notepadd++ und regulären Ausdrücken suchen und ersetzen:
Code:
suchen: htmlspecialchars\((.*)\)

ersetzen: htmlspecialchars\(\1, ENT_COMPAT | ENT_HTML401, 'ISO-8859-1'\)

Funktioniert leider nicht.

Ich bin mir bewusst das mein Script nicht perfekt ist, ich lerne noch dazu ;), es wird nur auf meinem Rechner und nur von mir verwendet. Was ist die einfachste Lösung das wieder zum Laufen zu bringen?
 
Shadow1701 schrieb:
leider besteht mein Script aus einigen tausend Zeilen, das alles durchzugehen und alle htmlspecialchars zu entfernen die eigentlich nicht gebraucht werden weil die Daten ordentlich in der Datenbank gespeichert werden ist mir schlicht zuviel Arbeit.
Eigentlich sollst du MIT specialchars speichern...

Sobald die Texte aber durch die function htmlspecialchars() laufen wird nur ein leerer string zurückgegeben.
Ein Eingabefeld kann keinen HTML-Code darstellen, nur dessen korrekt maskierte Variante.

Im Endeffekt hilft immer noch <!-- <?php print_r($deineVariable);?> -->
 
Ich speichere auch MIT htmlspecialchars(), leider lade ich auch, was nicht nötig wäre.
Das Speichern funktioniert auch, das laden nicht.

print_r($deineVariable); hilft leider nicht, die variable ist nach htmlspecialchars($deineVariable) einfach nur leer.
 
Shadow1701 schrieb:
Da diese function aber teilweise mit anderen verschachtelt ist kann ich nicht einfach so alle mit notepadd++ und regulären Ausdrücken suchen und ersetzen:
Code:
suchen: htmlspecialchars\((.*)\)

ersetzen: htmlspecialchars\(\1, ENT_COMPAT | ENT_HTML401, 'ISO-8859-1'\)

Funktioniert leider nicht.
Code:
protected function mySpecialChars($string , $flags = ENT_COMPAT | ENT_HTML401 , $encoding = 'ISO-8859-1'){
  return(htmlspecialchars($string, $flags, $encoding));
}

Suchen + Ersetzen: htmlspecialchars gegen $this->mySpecialChars

Ab PHP 5.4 liefert htmlspecialchars standardmäßig UTF8 zurück, wahrscheinlich stolperst du darüber. Mit der Funktion oben sollte er wieder wie früher arbeiten (nicht getestet)
 
Ich habe im Moment nicht so die Zeit mich damit zu beschäftigen...

Ja, error reporting ist aktiviert.

Das sind zwei Beispiele:
<textarea name="copy_ansi" cols="35" rows="3" class="input">$tplout[copy_ansi]</textarea>
<input name="copy" type="text" class="input" value="$tplout[copy]" size="125"/>

Danke für die function, sie funktioniert nicht. Warum weiß ich nicht, mir fehlt leider die Zeit im moment, vielleicht komme ich nach Ostern dazu den Fehler zu finden und zu beheben.

Edit:
Ich hab den Arbeitsaufwand stark überschätzt. Beim Hinzufügen von Daten in die DB ist überall ein htmlspecialchars() vorhanden. Beim laden aus der Datenbank ist es nicht nötig und deshalb habe ich es an diesen Stellen jetzt entfernt. Somit läuft wieder alles.

Bei zukünftigen Projekten mache ich es richtig :)

Vielen Dank für euer interesse.
 
Zuletzt bearbeitet:
Bei zukünftigen Projekten nimmst du einfach ein anständiges Framework, z.B. Symfony oder Zend, und ersparst dir den Terz rundweg. Zwar musst du dich einmalig in das Framework einarbeiten, hast danach aber für viele Jahre Ruhe und hast deutlich weniger Möglichkeiten, rigorose Sicherheitslücken oder Gedankenfehler zu fabrizieren.
 
@Daaron: Du hast vergessen, dass man weniger oft neue Tastaturen kaufen muss, da man weniger Tastenanschläge benötigt, um etwas umzusetzen ;)
 
Zurück
Oben