Problem mit Umlaute aus mysql
lima-city → Forum → Programmiersprachen → PHP, MySQL & .htaccess
code
datei
datenbank
datensatz
datum
formular
header
http
index
nixe
problem
set
sonderzeichen
stehen
string
text
type
url
windows
zeichen
-
Hallo Zusammen,
Ich habe ein Problem mit einen haufen von Umlauten in meiner Datenbank.
Ich möchte gerne das Changelog aus einer Datenbank auslesen , funktioniert auch alles soweit das einzige Problem ist nur das er ä ö ü usw. nicht richtig darstellt.
Wie schaffe ich es das mir das gelingt?
Charset ist utf-8.
Das hier habe ich schon ausprobiert , hat allerdings nicht geklappt.
$change = $row->change; $change = str_replace("ü", "ü", $change); $change = str_replace("ö", "ö", $change); $change = str_replace("ä", "ä", $change);
LG -
Diskutiere mit und stelle Fragen: Jetzt kostenlos anmelden!
lima-city: Gratis werbefreier Webspace für deine eigene Homepage
-
Was wird dir denn (fälschlicher Weise) statt den erwarteten Zeichen angezeigt?
Stimmt die Collation der Tabelle / Spalte? Stimmt das Charset der HTML(?)-Seite?
Vergiss sofort die
& Co, die sind schon lange, aufgrund der Möglichkeiten, das richtige Charset angeben zu können, veraltet.ö
-
Es wird ein Karo in Schwarz mit einem Fragezeichen angezeigt.
Ich habe grade mal das charset des tables upgedatet mit hilfe von :
ALTER TABLE changelog CONVERT TO CHARACTER SET utf8 COLLATE utf8_general_ci;
Das chartset ist auf jeder Seite auf utf-8 gesetzt.
Dennoch keine verbesserung. Wie kann ich die denn ohne ü richtig darstellen?
LG -
Schwarzes Kästchen bedeutet, dass offenbar das Charset nicht mit dem Zeichen zusammenpasst, das du darstellen magst. Ich vermute mal stark, dass du der Seite zwar sagst, dass sie UTF-8 sein soll, die Daten aber als ISO 8859-1 von der DB empfängst oder aus PHP ausgibst.
marvinkleinmusic schrieb:
Indem der angegebene Zeichensatz und die anzuzeigenden Zeichen zusammenpassen
Wie kann ich die denn ohne ü richtig darstellen? -
Ja das ist richtig die Daten wurden damals mit iso 8859-1 westeuropäisch in die Datenbank eingetragen.
Aber sogar nach convertieren und kompletten leeren der Datenbank ist der fehler noch da
Ich kann auch wenn ich will ein ü auf der Index Seite nicht darstellen obwohl diese Komplett in utf-8 gemacht ist.
aber wie bekomme ich das jetzt hin das der das aus der Datenbank aus Richtig anzeigt?
LG
Beitrag zuletzt geändert: 22.8.2013 22:18:48 von marvinkleinmusic -
das tema hier bei lima ist schon ellen lang (lima suche schon probiert?) und du kannst außerdem für dein problem eigentlich tausende gute lösungen finden bei google (allein die ersten 10 [von 46000!] treffern sollten schon viel zu viel sein!).
man zerfranzt sich die ganze zeit nur den mund :(
Beitrag zuletzt geändert: 23.8.2013 1:22:29 von czibere -
apche muss auf utf-8: in der httpd.conf ein AddDefaultCharset utf-8, alternativ einen charset header mit php setzen.
php muss auf utf-8: in der php.ini default_charset = "UTF-8", alternativ mit htcascess oder ini_set() php.net hilft.
alle textdatein, also php, html müssen utf-8 ohne BOM kodiert sein, erkennt man daran, dass bei einem Asciieditor für umlaute 2 zeichen stehen, bzw bei einem editor irgentwo ein utf-8 steht, bei Scriptly steht unten immer Die Zeichenkpdierung und die art der Zeilenumbrüche.
Die datenbank muss utf-8 sein, insbesondere die kollation der spalte.
am besten verscuht du mal einen datensatz mit php einzufügen, bei phpmyadmin kann es eventuell nicht funktionieren.
Dann sollte es eigentlich keine Probleme geben, es sei denn er Browser ist aus der Steinzeit.
Wenn immernoch nicht, guck mal mit Firebug oder dem Chrome entwicklertool nach den http headern.
-
Die Datei selber sollte man auch auf UTF-8 kodieren! Geht am besten mit Notepad++ (Kodierung -> UTF-8 ohne BOM). Und dann wie bereits erwähnt alle Bereiche welche die Daten anpacken, speichern und verarbeiten müssen auf UTF-8 gesetzt sein.
Gruß S. Brosch -
unlikus schrieb:
wer verwendet bitte phpmyadmin!!??
... , bei phpmyadmin kann es eventuell nicht funktionieren ...
also ich fasse mal kurz zusammen:
1. alle dateien, die auf die festplatte gebannt werden, werden in utf-8 dorhin gebannt;
2. alle datenbanken und tabellen werden utf-8 erzeugt mit entsprechenden collation;
3. die erste zeile einer css-datei heißt
, auch wenn die css-datei utf-8 gespeichert ist (weil sollte ja auch!).@charset "utf-8";
4. in xhtml-dateien steht (in dieser rehenfolge!)... <head> <meta http-equiv="Content-Type" content="text/html;charset=utf-8" /> <title>... ...
und in html5... <head> <meta charset="utf-8"> <title>...
was ich für mich gegen xhtml dringend vorziehen würde!
...
5./a für apache (in httpd.conf o. in .htaccess)AddType application/x-httpd-php;charset=utf-8 .php AddType application/x-httpd-php-source;charset=utf-8 .phps AddType text/css;charset=utf-8 .css AddType text/html;charset=utf-8 .html .htm AddType application/xhtml+xml;charset=utf-8 .xhtml
5./b kann aber auch stehen:
oder aberAddCharset utf-8 .css .htm .html .xhtml .php
5./c pauschal für alle txt und html dateien kann auch stehen:AddDefaultCharset utf-8
6./a wenn man keinen zugrif auf httpd.conf o. .htaccess hat, die lösung direkt im php-code ist:header('Content-Type: text/html; charset=utf-8');
6./b alternativ dazu kann in php.ini
stehen;default_charset = "utf-8"
7. mit php_bis_v5.3/win können datei- u. direktory-namen nur mit utf8_decode() behandelt werden (code-beispiel):$dirname = 'ich_schwömme_im_glück'; if(DIRECTORY_SEPARATOR === '\\') { $dirname = utf8_decode($dirname): } mkdir($dirname);
8. für html-formulare ein beispiel:<form action="formular.php" accept-charset="utf-8" method="post">
MYSQL:
9./a in my.ini sectionen mysql und mysqld sollte es stehen:[mysql] default-character-set=utf8 [mysqld] default-character-set=utf8 default-collation=utf8_general_ci init-connect=SET NAMES `utf8`
9./b wenn kein zugrif auf my.ini, dann:<?php $mysqli->set_charset('utf8'); // mysqli ab PHP5.2.3 $dbh->exec('SET NAMES utf8'); // PDO mysql_set_charset('utf8'); // mysql ab PHP5.2.3 mysql_query("SET NAMES `utf8`"); // veraltet
EMAIL
10./b content type muss im email header übergeben werden!<?php ... $header = "Content-type: text/plain; charset=UTF-8;\r\n"; ...
10./b beim abholen via imap, muss subject wie folgt behandelt werden:<?php ... $subject= mb_encode_mimeheader($subject,"UTF-8", "B", "\n"); ...
PHPMAILER
11.<?php ... $mailer->CharSet = 'UTF-8';
alte, nicht utf-8 projekte umstellen (die scripte leider nur für *nixe):
- zu apache rootdir.$ cd /<path2rootdirectory>
- codierung der dateien anzeigen - das gibt dann so etwas aus wie:$ find ./ -type f -exec file --mime-encoding '{}' ';'
die zu konvertierenden dateien haben natürlich nicht die utf-8 codierung;./_forum/schlei/index.php: utf-8 ./_forum/cookies/feed.php: utf-8 ./_forum/cookies/index.php: us-ascii ./_forum/privatecitypage/index.php: us-ascii ./_forum/privatecitypage/upload.php: us-ascii ./_forum/privatecitypage/ftp.php: us-ascii ./_forum/xxxparenjxxx/CDatabase.php: utf-8 ./_forum/xxxparenjxxx/db_data.php: utf-8 ./_forum/xxxparenjxxx/index.php: us-ascii
man kann jetzt die nicht utf-8 dateien in einem editor umwandeln, oder durch script:find ./ -name '*.php' -o -name '*.phtml'|while read DATEI; do if file -b --mime-encoding $DATEI|grep -q 'iso-8859'; then mv "$DATEI" "${DATEI}-CONVTEMP" && iconv -f CP1252 -t UTF-8 "${DATEI}-CONVTEMP" > "$DATEI" && rm "${DATEI}-CONVTEMP" && echo " OK : $DATEI"; else echo "SKIP: $DATEI"; fi; done;
für lokale-funktionen unter *nixe kann man meistens schreiben<?php ... setlocale(LC_ALL, 'de_DE.UTF-8', 'deu_deu');
unter windows ist das anders. eventuell kann hier jemand das nötige dazu beisteuern ;) -
wenn man mal einen datensatz per hand eingibt, ist phpmyadmin, insbesonder hier unter lima eine schnelle methode.
und utf-8 funktioniert dort leider nicht richtig, ein grund warum ich jetzt heidiSQL benutze, neben der performance und der fehlenden fremdschlüssel unterstützung.
Das mit dem Fromular kann man sich sparen, wenn die utf-8 http header und die html utf-8 header gesetzt sind macht nicht mal der internetexplorer quatsch bei den formularen.
Und bei allen strings, auf die der user keinen Einlfuss hat, würd ich auch nie sonderzeichen benutzen, insbesonder nicht für verzeichnisse. -
unlikus schrieb:
nichts für ungut. ich habe vorhin alle mir bekannte eventualitäten beschrieben, ohne rücksicht auf verluste - sozusagen ;)
wenn man mal einen datensatz per hand eingibt, ist phpmyadmin, insbesonder hier unter lima eine schnelle methode.
und utf-8 funktioniert dort leider nicht richtig, ein grund warum ich jetzt heidiSQL benutze, neben der performance und der fehlenden fremdschlüssel unterstützung.
Das mit dem Fromular kann man sich sparen, wenn die utf-8 http header und die html utf-8 header gesetzt sind macht nicht mal der internetexplorer quatsch bei den formularen.
Und bei allen strings, auf die der user keinen Einlfuss hat, würd ich auch nie sonderzeichen benutzen, insbesonder nicht für verzeichnisse.
interessant wären da noch irgendwelche erkenntnisse außer denen. so wie z.b. die scripte von oben für *nixe auch für windows zur verfügung zu stellen (wenn es überhaupüt möglich ist?)
Beitrag zuletzt geändert: 24.8.2013 22:39:15 von czibere -
Ich lebe nach dem Motto: Wer Windows nutzt ist selbst schuld
bis jetzt hat es mir weder an Geld noch an Funktionen gefehlt :D
Es gibt eine einfache Möglcihkeit in Windows: Datein auf ein Linux System kopieren umkodieren und wieder zurück.
Oder Microsoft verkauft einem ein GUI Tool dafür. -
unlikus schrieb:
möchtest das hier den leuten nicht verraten wie? (das wäre der sinn eines forums ;)
Ich lebe nach dem Motto: Wer Windows nutzt ist selbst schuld
bis jetzt hat es mir weder an Geld noch an Funktionen gefehlt :D
Es gibt eine einfache Möglcihkeit in Windows: Datein auf ein Linux System kopieren umkodieren und wieder zurück.
und unter *nixe hast du solche en mass, ohne dafür zahlen zu müssen ;)
Oder Microsoft verkauft einem ein GUI Tool dafür.
(war das jetzt alles nicht off topic?) -
Diskutiere mit und stelle Fragen: Jetzt kostenlos anmelden!
lima-city: Gratis werbefreier Webspace für deine eigene Homepage