xenon: php/xhtml und utf8... WIE?

hi there!

ich habe ein kleines problemchen mit meiner seite, die ich gerade programmiere. konkret geht es darum, dass ich alles in utf8 codiert haben will.

ich nutze einen ubuntu 9.04 server mit php 5.2 und mysql 5.0 auf apache 2.2. meine datenbanken sind als "utf8-unicode-ci" codiert, in der .htaccess habe ich

AddDefaultCharset utf-8

vermerkt, der html-header meiner seiten beginnt wie folgt:

<?xml version="1.0" encoding="utf-8" ?>  
  
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.1//EN" "http://www.w3.org/TR/xhtml11/DTD/xhtml11.dtd">  
  
<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en">  
  
<head>  
  
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8" />  

selbst meine formulare habe ich mittels

<form method="POST" action="write" accept-charset="utf-8">

für utf8 fit gemacht.

trotzdem spinnt hier alles rum :( sprich: wenn ich daten über dieses utf8-codierte formular in die utf8-codierte db schreibe, kommen diese anschliessend wieder ausgelesenen daten auf der utf8-codierten webseite als iso-8859 an.
sprich: ich schreibe ins formularfeld ein "ü" und bei der ausgabe erwartet mich ein tolles "?", das sich erst durch manuelle browserumstellung auf iso-8859 wieder in ein "ü" verwandelt. ergo kommt beim browser kein utf-8, sondern iso an.

wie kann ich dieses problem lösen, ohne dass ich einen iso-to-utf-wrapper für jede ein- und ausgabe der datenbank dranhauen muss?
was ich will ist, dass ALLES über utf-8 läuft. sprich, dass die formulardaten vom browser als utf8 versendet werden und auch in dieser codierung in der db landen. das gleiche soll dann auch für den umgekehrten weg gelten...

nur: WIE?

ich habe schon diverse tutorials etc gelesen, die alle die absolution in dieser frage versprachen, aber nirgendswo habe ich eine brauchbare antwort auf diese frage finden können :(

  1. Hi,

    wenn ich daten über dieses utf8-codierte formular in die utf8-codierte db schreibe, kommen diese anschliessend wieder ausgelesenen daten auf der utf8-codierten webseite als iso-8859 an.

    Speichert denn Dein Editor die Seite überhaupt als utf-8 datei ab?

    Gruesse, Joachim

    --
    Am Ende wird alles gut.
  2. Hi,

    was ich will ist, dass ALLES über utf-8 läuft.

    Und die Zeichenkodierung der Client-Verbindung von PHP nach MySQL hast du auch als UTF-8 ausgehandelt?

    mysql_set_charset

    MfG ChrisB

    --
    Light travels faster than sound - that's why most people appear bright until you hear them speak.
    1. Und die Zeichenkodierung der Client-Verbindung von PHP nach MySQL hast du auch als UTF-8 ausgehandelt?

      mysql_set_charset

      MfG ChrisB

      hatte ich nicht, aber mit

      mysql_set_charset('utf8', $link_id);

      bleibt das problem exakt das gleiche :(

      die datei ist auch als utf8 abgespeichert

  3. Hi,

    was ich will ist, dass ALLES über utf-8 läuft.

    Werden denn deine Ressourcen wirklich auch mit der Angabe charset=UTF-8 im Content-Type-Header ausgeliefert? (Clientseitig überprüfen, bspw. per Seiteninfo-Dialog im Browser, Firebug, etc.)

    AddDefaultCharset müsste da überschrieben werden, wenn für die Dateiendung .php bereits was spezielleres definiert ist.
    Und wenn in der PHP-Konfiguration ein default_charset angegeben ist, dann dürfte auch dies die Angabe des Webservers noch mal überschreiben.

    MfG ChrisB

    --
    Light travels faster than sound - that's why most people appear bright until you hear them speak.
    1. Werden denn deine Ressourcen wirklich auch mit der Angabe charset=UTF-8 im Content-Type-Header ausgeliefert? (Clientseitig überprüfen, bspw. per Seiteninfo-Dialog im Browser, Firebug, etc.)

      jau - hier wird mir angezeigt: "encoding: utf8"

      AddDefaultCharset müsste da überschrieben werden, wenn für die Dateiendung .php bereits was spezielleres definiert ist.
      Und wenn in der PHP-Konfiguration ein default_charset angegeben ist, dann dürfte auch dies die Angabe des Webservers noch mal überschreiben.

      habe das mal überprüft. in der php.ini ist da nix spezifiziert. auch in der apache config habe ich nix gefunden, was auf eine entsprechende festlegung auf iso-8859 hindeuten könnte.
      aber: müsste der eintrag in der .htaccess das nicht soundso überschreiben?

  4. @@xenon:

    nuqneH

    vermerkt, der html-header meiner seiten beginnt wie folgt:

    Es gibt keinen „HTML-Header“.

    <?xml version="1.0" encoding="utf-8" ?>

    Die überflüssige XML-Deklaration und die nachfolgende Leerzeile solltest du weglassen, da IE 6 in den Quirksmodus schaltet, wenn er keine entsprechende DOCTYPE-Angabe in der 1. Zeile(!) vorfindet.

    <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.1//EN" "http://www.w3.org/TR/xhtml11/DTD/xhtml11.dtd">

    Für die Verwendung von XHTML 1.1 gibt es kaum gute Gründe, aber viele dagegen. (Das Archiv ist voll davon.)

    <html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en">

    Hier ist schon einer: Es gibt in XHTML 1.1 kein 'lang'-Attribut; es ist nicht möglich, der Textsprache für Tagsoup-Parser (Verarbeitung als 'text/html') anzugeben.

    Verwende HTML-kompatibles XHTML 1.0 Strict! Der Anfang sieht dann so aus:

    [code lang=html]<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
    <html xmlns="http://www.w3.org/1999/xhtml" lang="en" xml:lang="en">

      
    (Deine Seite ist wirklich auf Englisch, ja?)  
      
    Qapla'
    
    -- 
    Alle Menschen sind klug. Die einen vorher, die anderen nachher. (John Steinbeck)