Thread Automatisches decodieren von utf-8 aus mysql Datenbank (39 answers)
Opened by mcfaq at 2011-08-01 17:55

mcfaq
 2011-08-01 17:55
#150912 #150912
User since
2011-04-20
20 Artikel
BenutzerIn
[default_avatar]
Hallo.

Ich habe eine Mysql Datenbank mit dieser Tabelle:
Code: (dl )
1
2
3
4
5
CREATE TABLE IF NOT EXISTS `utftbl` (
`spalte` varchar(256) collate utf8_unicode_ci NOT NULL,
`id` tinyint(4) NOT NULL auto_increment,
PRIMARY KEY (`id`)
) ENGINE=MyISAM DEFAULT CHARSET=utf8 COLLATE=utf8_unicode_ci AUTO_INCREMENT=1 ;



Diese html Testseite erstellt ein Formular, welches in dieser Tabelle Eingaben speichert und anschließend wieder ausliest:

Code: (dl )
1
2
3
4
5
6
7
8
9
10
11
12
<head>
<meta http-equiv="content-type" content="text/html; charset=UTF-8">
</head>
<body>
<h1>€€€</h1>
<form action="form.cgi" method="post">
<input type="text" name="input">
<input name="submit" type="submit">
<input name="reset" type="reset">
</form>
</body>
</head>


Die Template Datei sieht so aus:
Code: (dl )
1
2
3
4
5
6
7
8
9
10
11
<head>
<meta http-equiv="content-type" content="text/html; charset=UTF-8">
</head>
<body>
<h1>Template Euros: €€€</h1>
Form Euros:<TMPL_VAR spalte><br>
Perl Euros:<TMPL_VAR spalte2><br>
DB Euros(1):<TMPL_VAR spalte3><br>
DB Euros(2):<TMPL_VAR spalte4>
</body>
</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