#!/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 );