| 

.NET C# Java Javascript Exception

0
Hallo, ich habe eine Datenbank exportiert. Ich habe mich da an csv orientiert und selber ein Skript geschrieben in php. Das Problem ist nun, dass die Zeichen in der neuen Datenbank nicht richtig dargestellt werden, hierbei geht es ums 'ß' und 'ö' 'ä' 'ü' etc. Woran mag das Problem sein? Gibt es einen Parameter, den ich im Skript eintragen muss?

Die alte Datenbank laut phpmyadmin:

Zeichensatz / Kollation der MySQL-Verbindung: utf_unicode_ci.
Die Datenbank: Kollation latin1_german1_ci.
Die Tabelle/Spalten: latin1_german2_ci.

Die neue Datenbank laut phpmyadmin:

Zeichensatz / Kollation der MySQL-Verbindung: utf_unicode_ci.
Die Datenbank: Kollation latin1_german1_ci.
Die Tabelle/Spalten: latin1_german2_ci.

Wenn ich nun dieses Skript ausführe, schreibt er die Daten in die Tabelle nur dass da komische Zeichen sind.

Mein php Skript:
Link

(wollte es hier posten, es ging aber nicht)
08.09.2009
drunkenkilla 101 3
was passiert, wenn du statt header('Content-Type: text/html; charset=latin1'); andere zeichensätze ausprobierst, wie UTF-8 oder ISO-8859-1 (was eigentlich Latin1 wäre) ... oder den Zeichensatz an der Stelle gar nicht setzt?
lunatigs 08.09.2009
wenn ich utf8 setze, dann werden die "Sätze" in den Feldern nicht mehr ganz dargestellt, sie brechen an den Stellen ab, wo dann die genannten Zeichen kommen.
drunkenkilla 08.09.2009
8 Antworten
1
Deine Daten werden doppel UTF-8 codiert bzw. decodiert.

Mit Notepad++ könntenst Du den Dump bzw. das CSV öffenen und dann ggf. umcodieren lassen.
Ob das praktikabel ist, hängt von der Größe der Datei ab.

Versuche mal das Kommando: "set names utf8" bzw. "set names latin1" (ohne Anführungszeichen) bevor die Daten reingeschrieben bzw. rausgelesen werden.
Also als erstes Kommando vom Skript an die DB. Das könnte helfen.

Die Ursache für die doppelte Codierung ist vermutlich der Zeichensatz der Verbindung von PHP zu MySQL. Wenn der sich vom Zeichensatz von PHP und der DB unterscheidet, dann kriegste Probleme. Möglicherweise sind die Daten schon als Salat in der ursprünglichen DB drin, ohne das dies auffällt, weil PHP sich alle Mühe gibt, das zu kaschieren. Manchmal klappt das aber nicht so richtig. So wie bei Dir gerade, leider.
08.09.2009
tomahlak 237 1 2
1
ab PHP 5.2.3 funktioniert set names nicht mehr - dafür sollte man dann mysql_set_charset() verwenden. Grüßle
Scout 08.09.2009
0
Andererseits kannst Du auch relativ simpel die Zeichenkodierung der einzelnen Felder bzw. der Tabelle in mysql anpassen. Hier kommt eigentlich nur darauf an, wie Du die Daten später verwenden möchtest. Wenn Du z.B. die Daten später im Web darstellen willst und Du die HTML-Seite entsprechend dem Speicherformat kodierst sollte es kein Problem sein, wenn die Daten lediglich in der Tabellenansicht nicht richtig dargestellt werden. Dies liegt dann aber nicht daran, das die Daten falsch abgespeichert wären sondern lediglich daran das diese vom Webserver falsch ausgeliefert werden. Wenn Du etwas flexibler mit der Zeichenkodierung in PHP umgehen möchtest kannst Du dich auch mal mit den iconv-Funktionen auseinandersetzen.
08.09.2009
Ralf D. 89 2
0
Hi, danke dir erstmal. Die Daten werden in der alten Datenbank/ auf der alten Seite richtig dargestellt. Wenn ich dann die Daten in die neue Datenbank importiere, werden die Zeichen noch richtig in der Datenbank über phpmyadmin dargestellt. Nur auf der Website stimmt es nicht.

Ich werde gleich mal das set names utf8 ausprobieren. Wenn ich dies aber ganz oben/ am Anfang verwende, wird denn dies auch in der alten Datenbank angewendet, denn ich lese ja erstmal daraus und will erstmal nix falsch machen.
08.09.2009
drunkenkilla 101 3
ab PHP 5.2.3 funktioniert set names nicht mehr - dafür sollte man dann mysql_set_charset() verwenden. Grüßle
Scout 08.09.2009
0
Versuchs mal hiermit:

header('Content-Type: text/plain');
header('Content-Encoding: ISO-8859-1');
oder header('Content-Encoding: UTF-8');
print($ausgabe);
08.09.2009
MiW 1,0k 1 8
MiW 1,0k 1 8
muss ich dies nur ganz oben bei meinem Skript einfügen oder auch unten beim Aufbau der neuen Verbindung?
drunkenkilla 09.09.2009
0
Ich hatte selbst mal solche Probleme. Dabei hat "rumprobieren" mit utf8_encode und utf8_decode funktioniert.
08.09.2009
0
Wie funktionieren Zeichensätze in einer MySQL / PHP - Umgebung!?

Das Ganze muß man sich in drei Schichten Vorstellen, an deren Schnittstellen die Charsets zueinander passen oder umcodiert werden müssen.
Die erste Schicht ist MySQL mit Datenbank-, Tabellen-, Spalten- und Clientverbindungskollation. Jedes kann ein anderes Charset haben, wobei hier MySQL automatisch für die korrekte Umcodierung sorgt. Entscheidend dafür was in PHP ankommt ist also die MySQL-Clientverbindung. Diese kann man sich mit mysql_client_encoding() ausgeben lassen.
Die zweite Schicht ist PHP selbst und die dritte Schicht ist der Client (Browser). Entscheidend für die Ausgabe im Browser ist die Header-Angabe "Content-Type". Diese kann man in PHP entweder durch direktes setzen des Header oder durch die Angabe
ini_set('default_charset', ...
beeinflussen. Du verwendest einen Header
header('Content-Type: text/html; charset=latin1');

Das ist schonmal nicht richtig, da es hier kein latin1-Charset gibt. Richtiger wäre die Angabe von z.B. ISO-8859-1 (entspricht latin1).
Wenn du also dem Client (Browser) sagst er soll ISO-8859-1 darstellen und schickst ihm aber UTF8, da du dies von MySQL so bekommst und keine umcodierung vornimmst, dann werden die deutschen Umlaute falsch dargestellt. Du solltest also entweder dem Client einfach sagen das du UTF8 auslieferst
header('Content-Type: text/htmlt; charset=UTF-8');
oder z.B. mit
$outString = iconv('UTF-8', 'ISO-8859-1', $inString)
eine passende umcodierung vornehmen.
09.09.2009
FalkP 3,3k 3 8
0
so ich habe nun mysql_client_encoding() ausprobiert und er gibt mir latin1 wieder. D.h. nun, ich muss alle Verbindungen auf latin1 anpassen?

Habe jetzt so einiges versucht und ich komme einfach nicht weiter :(

versucht habe ich oben einzufügen;

header('Content-Type: text/html');

header('Content-Encoding: UTF-8');


und das auch mit ISO-8859-1.

und dann noch folgendes;
$charset = "UTF-8";

mysql_set_charset($charset);


nix hat geholfen :(
09.09.2009
drunkenkilla 101 3
0
so nun hab ich es rausbekommen ;)

$zeile($i)('name')=iconv("ISO-8859-1", "UTF-8", $zeile($i)('name'));
09.09.2009
drunkenkilla 101 3

Stelle deine Php-Frage jetzt!