PHP mit MySQL - utf8-Formulardaten übergeben

Hallo,

ich will utf8-Daten an eine MySQL-Datenbank übergeben bzw auch wieder rausholen.
alles was mit character_set_client -server -database usw. und collation zu tun hat ist auf utf8 bzw utf_general_ci gestellt.
Der Browser zeigt auch alles richtig an, wenn ich aber den Eintrag mache kommt es nicht richtig an. Umgekehrt kommen die Zeichen die ich als utf8 in die DB importiert hab, wenn ich sie in den Browser hole nicht richtig an.
Hab ich das richtig verstanden dass ich jeden String den ich in die DB eintragen will mit utf8_encode bearbeiten muss und jeden der wieder rauskommt mit utf8_decode ?

Bin für jede Hilfe dankbar

Frank

Hallo,

wird denn deine Seite als utf8 angezeigt?? Falls nicht, würde ich dir empfehlen, sie so zu gestalten, das löst so einige Probleme, wenn man das konsequent macht. Dazu gehört nämlich, dass Formulardaten mit utf8-Kodierung übertragen werden und so direkt in die Datenbank eingegeben werden können.

Da ich mit verschiedenen Datenquellen arbeiten muss, habe ich mir eine Funktion geschrieben, die nur bei Bedarf einen Text in utf8 umwandelt (also wenn es nicht schon in utf8 vorliegt):

function is\_validUTF8($str)
{
 // values of -1 represent disalloweded values for the first bytes in current UTF-8
 static $trailing\_bytes = array (
 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
 -1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1, -1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,
 -1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1, -1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,
 -1,-1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,
 2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2, 3,3,3,3,3,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1
 );

 $ups = unpack('C\*', $str);
 if (!($aCnt = count($ups))) return true; // Empty string \*is\* valid UTF-8
 for ($i = 1; $i 0 && $i 0x9F) return false;
 break;
 case 0xF0:
 if ($cbyte 0x8F) return false;
 break;
 default:
 break;
 }
 $first = false;
 }
 $tbytes--;
 }
 if ($tbytes) return false; // incomplete sequence at EOS
 } 
 return true;
}

function repair\_utf8($string)
{
 if (is\_validUTF8($string))
 return $string;
 else return utf8\_encode($string);
}

Damit kannst du sicherstellen, dass alle Daten, die zum Browser geschickt werden in utf8 codiert sind!

Gruss, Omar Abo-Namous

Hallo,
das Problem ob ich utf8 habe oder nicht stellt sich eigentlich gar nicht weil ich sehr viele Diakritika (n mit Punkt drunter und so) darstellen muss und es in 90% der Fälle utf8 ist.

wird denn deine Seite als utf8 angezeigt??

ich weiss nicht was du damit meinst,

ist auf alle fälle drin.

ich poste mal am besten ein bischen code:

require\_once("includes/db.inc");
$database = new Db;

 $suche = $\_POST["suche"];
 $database-\>myquery("SELECT \* FROM tabelle WHERE verfasser LIKE '%$suche%' ");
 if ($database-\>num\_rows == false){
 //Keine Treffer -\> Fehlertext
while ($row = mysql\_fetch\_array($database-\>result, MYSQL\_ASSOC))
 {
 echo"\t\n";

 foreach ($row as $key =\> $col\_value) {
 if ($key == 'verfasser') {echo "\t\t[" . utf8\_decode($col\_value) ."](%255C%2522details.php?id=%2524id%255C%2522)\n";}
 if ($key == 'titel') {echo "\t\t[" .utf8\_decode($col\_value) ."](%255C%2522details.php?id=%2524id%255C%2522)\n";}

....

ich hoffe es kommt raus was ich meine. 
Ich hole die daten aus der Datenbank, weiss dass da utf8 drin vorkommt und will es im Browser darstellen.
so wie ich es jetzt habe tuts nicht, und ich weiss nicht warum.
meine Datenbank ist so eingestellt

character set client utf8 
character set connection utf8 
character set database utf8 
character set results utf8 
character set server utf8 
character set system utf8

collation connection utf8\_general\_ci 
collation database utf8\_general\_ci 
collation server utf8\_general\_ci

vielleicht kommt ja einer von euch drauf

Frank 

Hallo,
das Problem ob ich utf8 habe oder nicht stellt sich eigentlich
gar nicht weil ich sehr viele Diakritika (n mit Punkt drunter
und so) darstellen muss und es in 90% der Fälle utf8 ist.

wird denn deine Seite als utf8 angezeigt??

ich weiss nicht was du damit meinst,

ist auf alle fälle drin.

Vorsichtshalber solltest du
header(„Content-type: text/css; charset=UTF-8“);

einfügen. Es gibt einen Unterschied, zwischen dieser und deiner Angabe!

[...]


> href=\"details.php?id=$id\"\> " . utf8\_decode($col\_value)  
> ."\n";}

[...]

Mir ist nicht ganz klar, warum du utf8_decode machst. Du hast utf8-Daten und du willst sie auch als utf8 darstellen! Du musst sie einfach nur ausgeben!

Gruss, Omar Abo-Namous

Hallo,
das Problem ob ich utf8 habe oder nicht stellt sich eigentlich
gar nicht weil ich sehr viele Diakritika (n mit Punkt drunter
und so) darstellen muss und es in 90% der Fälle utf8 ist.

wird denn deine Seite als utf8 angezeigt??

ich weiss nicht was du damit meinst,

ist auf alle fälle drin.

Vorsichtshalber solltest du
header(„Content-type: text/css; charset=UTF-8“);

einfügen. Es gibt einen Unterschied, zwischen dieser und
deiner Angabe!

das hab ich grad mal ausprobiert, ändert aber nichts…

[…]

href=„details.php?id=$id“> " . utf8_decode($col_value)
."\n";}

[…]

Mir ist nicht ganz klar, warum du utf8_decode machst. Du hast
utf8-Daten und du willst sie auch als utf8 darstellen! Du
musst sie einfach nur ausgeben!

Gruss, Omar Abo-Namous

ich dachte auch dass ich nichts dekodieren muss weil ich ja bei der DB alles so eingestellt hab das es utf8 ist. Aber es funktioniert ja nicht, und ich weiss nicht warum

in der datenbank steht z.B. laut PHPmyAdmin
Lensch, Jürgen Hinrich

und im Browser:
Lensch, J?n Hinrich

ich werd mich morgen mal drum kümmern, jetzt erstmal schlafen :smile:

Frank

Hallo

Schreib mal, wie das ‚J?n‘ im HTML-Quelltext dargestellt wird.

cu

Hallo,
ich hab das ganze glöst:
Die Einstellungen der Datenbank waren alle richtig, ich musste nicht mit utf8_encode und utf8_decode arbeiten…
Das Problem war dass alle Browser bei mir die Zeichenkodierung ISO 8859-1 Western erkannt haben, obwohl ich oben

drinstehen hatte.
PHP hat aber eine schicke Funktion namens header() die alle Probleme löst. Jetzt steht bei mir in der ersten Zeile (Wichtig: muss als erstes kommen)

<?php header("Content-type: text/css; charset=UTF-8");
.... ?\> und schon stimmt die Zeichenkodierung auch im Browser und alle Anzeigeprobleme sind gelöst. Wer es genauer wissen will: [http://de3.php.net/header](http://de3.php.net/header) Gruss und danke für eure Mühen Frank

Korrektur,
es muss oben heissen

header(„Content-type: text/html; charset=UTF-8“);

also text/html und nicht text/css

Frank