Thread Automatisches decodieren von utf-8 aus mysql Datenbank
(39 answers)
Opened by mcfaq at 2011-08-01 17:55
Hallo.
Ich habe eine Mysql Datenbank mit dieser Tabelle: Code: (dl
)
1 CREATE TABLE IF NOT EXISTS `utftbl` ( Diese html Testseite erstellt ein Formular, welches in dieser Tabelle Eingaben speichert und anschließend wieder ausliest: Code: (dl
)
1 <head> Die Template Datei sieht so aus: Code: (dl
)
1 <head> Und der zur Bearbeitung der Formulardaten so: Code (perl): (dl
)
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 #!/usr/bin/perl -w use HTML::Template; use CGI::Simple; use DBI; use Data::Dumper; use CGI::Carp qw(fatalsToBrowser); use Encode qw( encode decode ); use utf8; ####################### A1 BEGIN ############################################### #Pragma, welches besagt, dass alle Dateihandles per default auf utf8 eingestellt #sind und transparent encoded / decoded wird use open ':encoding(utf8)'; ####################### A1 END ############################################### #Nicht funktionierende Variante (aus Beispielen aus dem Netz: # ####################### A2 BEGIN ##################################### #Unterschied zu meiner Anweisung nicht ergründet): #use open ':encoding(UTF-8)'; #use open ':std'; ####################### A2 END ##################################### # ####################### A3 BEGIN ##################################### #Einem bereits geöffneten Kanal kann nachträglich einen Konverter zuweisen #binmode(STDOUT, ":encoding(UTF-8)"); ####################### A3 END ##################################### ####################### B1 BEGIN ############################################### my $dbh = DBI->connect( 'DBI:mysql:database=testdb' . ';host=localhost', 'root', 'womex', { RaiseError => 1, Print_warn => 1, Warn => 1} ) or die "Can't connect to database!"; ####################### B1 END ############################################### #Nicht funktionierende Variante: # ####################### B2 BEGIN ############################################### #my $dbh = DBI->connect( # 'DBI:mysql:database=testdb' # . ';host=localhost', # 'root', # 'womex', # { RaiseError => 1, Print_warn => 1, Warn => 1, mysql_enable_utf8 => 1} # ) or die "Can't connect to database!"; ####################### B2 END ############################################### # # # # # ####### B3 BEGIN ==> B3 == Kombination (B1,B1+) == B2 ############# # # ####### B1+ BEGIN ############################################ # #Alternative zur (ausgeblendeten) Anweisung von oben: # #$dbh->{'mysql_enable_utf8'} = 1; # ####### B1+ END ############################################## # ####### B3 END ==> B3 == Kombination (B1,B1+) == B2 ############# #Sorgt dafür das Daten in und aus der Datenbank korrekt als UTF-8 gehandelt werden. $dbh->do(qq{SET NAMES 'utf8';}); #cgi Objekt für Zugriff auf per GET oder POST erhaltene Formulavariablen my $cgi = new CGI::Simple; #Werte aller Formularelemente in Form eines Hashes my %cgiHash = $cgi->Vars(); # open the html template my $template = HTML::Template->new( filename => 'test.tmpl', utf8 => 1 ); $template->param( spalte => $cgiHash{'input'} ); $template->param( spalte2 => encode('utf-8','5 mal Euro: €€€€€') ); #SQl Statement, welches die Daten der Pflichfelder aus dem Formular speichern läßt. my $sth = $dbh->prepare( qq{ INSERT INTO utftbl SET spalte = ? }); #Durchführen des inserts in die Tabelle mit den Pflichtdaten unless ( $sth->execute( $cgiHash{'input'} ) ) { warn sprintf( "[Error]: Reason: [%s].", $dbh->errstr ); } my ($return_value) = $dbh->last_insert_id( undef, undef, 'utftbl', 'id' ); $sth = $dbh->prepare( qq{ SELECT spalte from utftbl where id=$return_value }); #Durchführen des selects in die Tabelle mit den Pflichtdaten unless ( $sth->execute() ) { warn sprintf( "[Error]: Reason: [%s].", $dbh->errstr ); } my @arr = $sth->fetchrow_array(); #Wenn Datenbank String als utf-8 kodierter String eingelesen wurde und #wir nichts an diesem verändert haben, dann können wird diesen direkt ohne #Dekodierung/Enkodierung direkt rausschreiben, falls die Ausgabe auch in utf-8 deklariert ist. $template->param( spalte3 => $arr[0] ); ####################### C1 BEGIN ############################################### #Falls wir mit dem utf-8 kodiertem String irgendetwas machen (z.B. Konkatination), dann #müssen wir diesen Dekodieren/Enkodieren $template->param( spalte4 => encode('utf-8', "Präfix€uro:" . decode('utf-8',$arr[0])) ); ####################### C1 END ################################################# #Nicht funktionierende Varianten: # ####################### C2 BEGIN ############################################### #$template->param( spalte4 => encode('utf-8', "Präfix€uro:" . $arr[0]) ); ####################### C2 END ############################################### # # # ####################### C3 BEGIN ############################################### #$template->param( spalte4 => "PräfixEuro:" . $arr[0] ); ####################### C3 END ############################################### print( "Content-Type: text/html; charset=UTF-8\n\n", $template->output ); Das Problem ist, das ich einen Weg suche, die Dekoiderung aus utf-8 von der Datenbank automatisch und implizit erfolgen zu lassen, ähnlich zu den Anweisungen bei Dateihandles, wo man die Enkodierung angeben kann und diese automatisch passiert. Ich habe in dem Code oben die Variante zu stehen, mit der ich alle Quellen von UTF-8 Ausgaben Fehlerfrei auf der Ergebnisseite erhalte. Die Alternativen, die in Frage kämen, um analoge implizite Dekodierungen der Daten aus der DB Tabelle zu erhalten sind kommentiert und tragen den gleichen Buchstaben, zum zugehörigen funktionierenden Verhalte. Man kann (und das habe ich auch) die alternativen nacheinander untereinander kombinieren, um einen Weg zu finden, mit der die implizite Dekodierung der Utf-8 Daten aus der DB Tabelle erfolgzuversprechen scheint. Aber nach meinr Kombination aller Möglichkeiten klappt keiner dieser Versuche. Also hier die Essenz meiner Frage. Gibt es eine möglichkeit implizite Dekodierung der Utf-8 Daten aus der DB Tabelle zu realisieren und wenn ja: Wie. Was mache ich falsch? Gruß mcfaq. Last edited: 2011-08-02 12:26:59 +0200 (CEST) View full thread Automatisches decodieren von utf-8 aus mysql Datenbank |