Tach!
eine Webanwendung zeigt Daten aus einer MS SQL Db an. Diese Daten haben auch deutsche Umlaute wie Ö, ü usw. Die Verbindung wird mit sqlsrv_connect hergestellt. Ich hatte zuerst ein CharacterSet mit UTF-8
//vorher mit UTF-8 //$connectionInfo = array( "Database"=>"myDB", "UID"=>"myName", "PWD"=>"myPW", "CharacterSet" => "UTF-8"); $connectionInfo = array( "Database"=>"myDB", "UID"=>"myName", "PWD"=>"myPW"); $con = sqlsrv_connect( $serverName, $connectionInfo);
Bei der betreffenden PHP Datei showData.php zur Anzeige der Daten hatte ich im header <meta charset="utf-8" /> drin stehen und alles war gut. (Umlaute wurden richtig angezeigt.)
Jetzt kann man die Daten aber auch als CSV Datei downloaden und diese hat dann auch UTF-8 als Kodierung. Dies wurde jetzt bemängelt weil ein Doppelklick der CSV Excel öffnet und die Umlaute nicht richtig darstellt. Man muss also vorher ind er CSV die Kodierung umstellen.
Es kann sein, dass eine UTF-8-BOM Wunder bewirkt.
Daher habe ich nun mal in der Connection das UTF-8 entfernt und auch in der showData.php das charset=utf-8 entfernt.
Ich nahm jetzt an, dass die Umlaute richtig angezeigt werden, dem ist aber leider nicht so. Vermutlich muss man alle Daten nochnals mit utf8_encode behandeln?
Vermutlich eher utf8_decode(). Aber wenn du nur die Kodierungsangabe entfernst, wird nicht auf magische Weise alles zu Nicht-UTF-8. Was auch immer das dann sein mag. Es ist sinnvoller, die gewünschte Kodierung anzugeben und es nicht dem Zufall zu überlassen, was die Systeme für eine Kodierung verwenden.
Ich wundere mich nur, denn ursprünglich ist das eine uralte Webanwendung vom Jahr 2000 in PHP4 geschrieben, mit einem alten IIS und Windows Server und alter SQL DB. Und damals gab es angeblich keine Probleme mit Umlauten.
Dann lief zufällig alles, ohne dass ihr Fehler bemerkt habt. Oder es war überall dieselbe Kodierung als Default eingestellt. Auch damals gab es jedenfalls schon mehr als eine Kodierung.
Wie am besten verfahren, damit Daten richtig angezeigt werden und die CSV Datei in ANsi ist?
Der beste Weg ist immer, nicht auf Default-Werte zu setzen, sondern explizit Kodierungsangaben vorzunehmen, und wenn eine andere Kodeirung gewünscht ist, dann sollte man das umkodieren. Beachte, dass das nicht in jede Richtung verlustfrei möglich ist.
dedlfix.