| View previous topic :: View next topic |
| Author |
Message |
franc Smarty Rookie
Joined: 03 Jul 2009 Posts: 10
|
Posted: Tue Jul 19, 2011 12:17 pm Post subject: UTF8 aus der Datenbank |
|
|
Hallo,
ich habe eine Seite mit Smarty (Version 2.6.26) die mir aus einer MySQL 5 DB ein paar SELECT-DropDowns befüllt.
In der DB ist alles auf UTF8 gestellt (auch die einzelnen Felder), PHP 5.2.6 steht auf UTF8 und die betroffenen Dateien sind auch alle in UTF8 gespeichert.
Der Meta-Tag der ausgegebenen Datei steht auf utf-8, der Browser erkennt das auch und gibt selbiges an.
Nun enthält das "Bitte auswählen..." aus der SelectBox zwar noch den Umlaut (ä), aber die einzelnen Felder dann nicht mehr. Dort sind dann anstatt der Umlaute (im Firefox) die netten kleinen Karos mit Fragezeichen darin.
Wenn ich die Seite debugge habe ich, bevor die DB-Daten in die Smartybibliothek gehen, noch alle Umlaute.
Kann mir jemand einen Tipp geben, wo ich da noch schauen muss?
Ist Smarty 2.6.26 evtl. gar nicht auf UTF-8 ausgelegt oder gibt es einen Schalter?
Ich habe leider trotz Suche bisher keine Lösung genau dazu gefunden.
Danke.
franc |
|
| Back to top |
|
jacz Smarty Pro

Joined: 13 Nov 2010 Posts: 249
|
Posted: Tue Jul 19, 2011 12:30 pm Post subject: |
|
|
Smarty ist es egal, da Smarty innerhalb einer Applikation läuft die da bestimmend ist.
Es werden also nur Inhalte so verhackstückelt wie sie geliefert werden.
Kannst mal probieren ob das hilft {$meinevar|uft8_encode} |
|
| Back to top |
|
rodneyrehm Administrator

Joined: 30 Mar 2007 Posts: 698 Location: Germany, border to Switzerland
|
Posted: Tue Jul 19, 2011 12:40 pm Post subject: |
|
|
Das ist schlicht nicht wahr. Smarty 2.x und 3.0 haben bei diversen Funktionen Probleme mit UTF-8. Erst Smarty 3.1 ist vollständig auf UTF-8 getestet.
Benutzt du die Funktion {html_options}? Dort wird intern smarty_function_escape_special_chars() verwendet, was htmlspecialchars aufruft. Allerdings ohne einen charset zu definieren. Laut PHP-Doku ist der default-charset ISO-8859-1. Vermutlich geht hier was in die Hose.
bau {html_options} mal mit {foreach} nach und schau ob das Problem immer noch existiert… |
|
| Back to top |
|
franc Smarty Rookie
Joined: 03 Jul 2009 Posts: 10
|
Posted: Tue Jul 19, 2011 12:51 pm Post subject: |
|
|
| jacz wrote: | | ...Kannst mal probieren ob das hilft {$meinevar|uft8_encode} |
Ja das hilft in der Tat.
Wenn ich im php schreibe:
| Code: | | $smarty->assign('test', $wert_aus_der_db_mit_umlauten); |
und im tpl:
| Code: | | <p>TEST:{$test|utf8_encode}</p> |
spuckt mir der Brauser die Umlaute mit raus. Ohne das utf8_encode im Template macht er es nicht.
Ist das die Lösung?
Ich habe allerdings keine einfachen Variablen wie hier im Beispiel $test, sondern eine leicht geänderte function.html_options.php (aus plugins),
die ein Array entgegennimmt. Das kann ich nicht einfach so mit utf8_encode umwandeln, sonst habe ich als Select-Felder nur noch "Array" stehen.
Gibt es utf8_encode vielleicht auch für Arrays?
Habe dazu aber nichts gefunden. |
|
| Back to top |
|
jacz Smarty Pro

Joined: 13 Nov 2010 Posts: 249
|
Posted: Tue Jul 19, 2011 1:18 pm Post subject: |
|
|
| Nein (http://php.net/manual/de/function.utf8-encode.php) , aber mach das doch im plugin in einer Schleife einmal durch. |
|
| Back to top |
|
U.Tews Administrator
Joined: 22 Nov 2006 Posts: 4178 Location: Hamburg / Germany
|
Posted: Tue Jul 19, 2011 1:37 pm Post subject: |
|
|
| Dein wirkliches Problem ist wohl dass Du zwar die Datenbank als UTF8 definiert hast, aber die Daten nicht im UTF8 Zeichensatz gespeichert wurden. |
|
| Back to top |
|
franc Smarty Rookie
Joined: 03 Jul 2009 Posts: 10
|
Posted: Tue Jul 19, 2011 1:53 pm Post subject: |
|
|
| globe wrote: |
...Benutzt du die Funktion {html_options}? Dort wird intern smarty_function_escape_special_chars() verwendet, was htmlspecialchars aufruft. Allerdings ohne einen charset zu definieren... |
Ja, das habe ich, siehe oben.
Ausgerechnet!
Wenn ich in smarty_function_escape_special_chars aber $string = htmlspecialchars($string, ENT_COMPAT, "UTF-8"); setze, ist $string nach Aufruf von htmlspecialchars() einfach nur leer.
| jacz wrote: |
... mach das doch im plugin in einer Schleife einmal durch. |
utf8_encode in der Schleife im Plugin ändert leider nichts.
| U.Tews wrote: | | Dein wirkliches Problem ist wohl dass Du zwar die Datenbank als UTF8 definiert hast, aber die Daten nicht im UTF8 Zeichensatz gespeichert wurden. |
In der DB sehe ich aber (via QueryBrowser) alle Umlaute. Selbst wenn ich ein Feld mit Umlauten lösche, und dort wieder Umlaute einfüge, ist es das selbe Ergebnis.
Last edited by franc on Tue Jul 19, 2011 3:19 pm; edited 2 times in total |
|
| Back to top |
|
jacz Smarty Pro

Joined: 13 Nov 2010 Posts: 249
|
Posted: Tue Jul 19, 2011 2:10 pm Post subject: |
|
|
| Quote: | | utf8_encode in der Schleife im Plugin ändert leider nichts |
Dann machst du etwas dort falsch. An richtiger Stelle macht es nichts anders als wenn du eine Smartyvar damit behandelts.
Querybrowser und ähnliche Teile verwenden teils diese oder ähnliche Funktionen auf Basis der Charset Einstellung der DB, hat nicht unbedingt etwas zu sagen.
Gibt dein Plugin einen komplett fomulierten HTML String aus, dann setz die Funktion da an. |
|
| Back to top |
|
franc Smarty Rookie
Joined: 03 Jul 2009 Posts: 10
|
Posted: Tue Jul 19, 2011 2:18 pm Post subject: |
|
|
| jacz wrote: | | Quote: | | utf8_encode in der Schleife im Plugin ändert leider nichts |
Dann machst du etwas dort falsch. ... | Ich probiere es noch mal! Melde mich später... Danke einstweilen. |
|
| Back to top |
|
franc Smarty Rookie
Joined: 03 Jul 2009 Posts: 10
|
Posted: Tue Jul 19, 2011 3:16 pm Post subject: |
|
|
| Quote: | | ...Wenn ich in smarty_function_escape_special_chars aber $string = htmlspecialchars($string, ENT_COMPAT, "UTF-8"); setze, ist $string nach Aufruf von htmlspecialchars()einfach nur leer. |
Das stimmt aber nur, wenn in $string Umlaute enthalten sind.
Wenn dort nur ASCII-Zeichen drin stehen, geht der Inhalt nicht flöten.
Ist das vielleicht ein Indiz für irgendwas?
EDIT: Entschuldigt meine vielen Posting Korrkturen, ich habe da grad beim Editieren gründlich was verwechselt, bzw. den falschen Post geändert. Jetzt stimmt es aber wieder  |
|
| Back to top |
|
rodneyrehm Administrator

Joined: 30 Mar 2007 Posts: 698 Location: Germany, border to Switzerland
|
Posted: Tue Jul 19, 2011 3:36 pm Post subject: |
|
|
| franc wrote: | Das stimmt aber nur, wenn in $string Umlaute enthalten sind.
Wenn dort nur ASCII-Zeichen drin stehen, geht der Inhalt nicht flöten.
Ist das vielleicht ein Indiz für irgendwas? |
In dem Fall ist dein $string nicht UTF-8 kodiert.
Nur weil dein MySQL in UTF-8 speichert, bedeutet das übrigens noch nicht, dass dein PHP auch UTF-8 bekommt. Es gibt da noch Verbindungsoptionen, die das ändern könnten.
Bei MySQL wäre die erste Query: »SET NAMES "UTF8"« um sicherzustellen, dass du UTF-8 bekommst… |
|
| Back to top |
|
franc Smarty Rookie
Joined: 03 Jul 2009 Posts: 10
|
Posted: Tue Jul 19, 2011 11:09 pm Post subject: |
|
|
| globe wrote: | | ...Bei MySQL wäre die erste Query: »SET NAMES "UTF8"« um sicherzustellen, dass du UTF-8 bekommst… |
Ja, damit klappt es! Super, danke.
Dabei habe ich doch in der php.ini und in der my.conf jeweils auf utf8 gestellt. Wenn ich das noch jemals richtig verstehen dürfte, das mit dem UTF-8...
Übrigens, den HTML-String in utf8_encode() einzupacken hat doch nicht funktioniert. |
|
| Back to top |
|
franc Smarty Rookie
Joined: 03 Jul 2009 Posts: 10
|
Posted: Wed Jul 20, 2011 2:26 pm Post subject: |
|
|
Hernach musste ich aber noch alle mit FPDF erstellten Strings in utf8_decode() einpacken, also z.B.:
| Code: | $pdf->Cell(100, 20, 'Mittagstisch');
$pdf->TextWithDirection(10, 20, 'Geben Sie uns bitte Ihre E-Mail-Adresse oder Ihre Faxnummer, so können wir Ihnen immer den aktuellen Mittagstisch zuschicken.', 'D');
$pdf->MultiCell(135, 8, "Vegetarisch der Woche\n".$veg, 1, "L", 1); |
wird zu:
| Code: | $pdf->Cell(100, 20, utf8_decode('Mittagstisch'));
$pdf->TextWithDirection(10, 20, utf8_decode('Geben Sie uns bitte Ihre E-Mail-Adresse oder Ihre Faxnummer, so können wir Ihnen immer den aktuellen Mittagstisch zuschicken.'), 'D');
$pdf->MultiCell(135, 8, utf8_decode("Vegetarisch der Woche\n").utf8_decode($veg), 1, "L", 1); |
Wundert mich aber, dass man das nicht irgendwie viel einfacher in FPDF selbst packen kann, aber so hab ich es gefunden unter:
http://kevinscomputer.wordpress.com/2008/09/12/utf-8-und-fpdf |
|
| Back to top |
|
rodneyrehm Administrator

Joined: 30 Mar 2007 Posts: 698 Location: Germany, border to Switzerland
|
Posted: Wed Jul 20, 2011 2:31 pm Post subject: |
|
|
FPDF selbst kann kein UTF-8. Aber wenn du auf fpdf.org in die scripts Ecke schaust, siehst du dort tFPDF.
das kann UTF-8, unicode Fonts, etc pp. Ich nutze das produktiv. Außer dass es immer noch FPDF bullshit API ist, hatte ich da nichts zu klagen… |
|
| Back to top |
|
franc Smarty Rookie
Joined: 03 Jul 2009 Posts: 10
|
Posted: Wed Jul 20, 2011 3:05 pm Post subject: |
|
|
Ja, hatte ich vorhin auch entdeckt, aber die paar Verpackungen hab ich jetzt mit utf8_decode gemacht, mein PDF ist nämlich sehr primitiv und da kommt auch wohl kaum was dazu.
FPDF (1.7) ist bullshit?
Warum?
Ich bin da sehr froh darum! |
|
| Back to top |
|
|