Zeichenkonvertierung/Umlaute

  • Also, ich benutze ein Gespann aus Apache Webserver 2.0.40, PHP 4.2.3 und Microsoft SQL Server 2000 Developer Edition. Jetzt kommt die Frage/das Problem...

    Wenn ich in die Datenbank Begriffe einfüge, die einen Umlaut haben (z.B. 'ä'), undzwar über eine Webpage, die PHP benutzt, und diese Begriffe dann über das datenbankeigene Programm "Query Analyzer" abfrage, werden die Umlaute angezeigt als unentzifferbare Zeichen.
    ABEEER - wenn ich dieselbe Abfrage über die Webpage mache (also über PHP), werden die Umlaute richtig angezeigt.

    Meine Vermutung: Die Webpage (komplett in Flash) übergibt die Zeichen an PHP, aber PHP konvertiert die Zeichen in irgendeinen anderen Zeichensatz, und speichert sie so in der Datenbank. Nach dem Abrufen aus der Datenbank und Übertragen der Daten an die Flash-Page wiederum, konvertiert PHP die Zeichen wieder zurück in ihre Ausgangslage...glaube ich zumindest...

    (Oder liegt es etwa an Flash?)

    Und jetzt das eigentliche Problem: Ich will, dass die Zeichen in der Datenbank untransformiert gespeichert werden, also ein 'ü' auch als 'ü'. Das geht sogar, indem man die Zeichen nicht über PHP in die Datenbank eingibt, sondern über den Query Analyzer. Aber beim Abrufen, werden sie dann falsch angezeigt...wie stelle ich das an, dass sie sowohl im Query Analyzer als auch beim Abrufen über PHP richtig angezeigt werden?
    Weiß das irgendwer? Ich wäre hocherfreut, wenn mir da jemand weiterhelfen könnte...

  • Hi!

    Kann sein, dass Du die PHP-Funktionen
    string htmlspecialchars(string string [, int quote_style]) oder
    string htmlentities(string string [, int quote_style])
    verwendest? PHP macht normalerweise nichts von sich aus, ausser man machts mit obigen (oder ähnlichen) Funktionen. Diese sollte man im Allgemeinen eh verwenden (allerdings nicht für die Datenbankspeicherung, sondern nur für die Darstellung von HTML-Seiten; also nach dem Datenbankauslesen), da sie Sonderzeichen in HTML-konforme Zeichen umwandeln.
    (HTML-Sonderzeichen siehe http://selfhtml.teamone.de/html/referenz/zeichen.htm)

    Schau Dir einfach mal die Stringfunktionen von PHP an, und kontrolliere, ob Du irgendwo solche verwendest.
    http://www.selfphp.info/funktionsueber…_funktionen.php

    Ich hoffe, das hilft Dir weiter.

  • Hm, danke für Deine Reaktion ;o)
    Leider verwende ich in dem Skript keine einzige String-Funktion...es wird eine POST-Variable genommen, in einer lokalen gespeichert (um genau zu sein, passiert das mit mehreren Variablen), und die Variablen gehen dann direkt an Microsoft SQL.

    Was auch interessant ist, ist, dass als ich vor ein paar Tagen eine Reihe von Strings aus einer txt-Datei ausgelesen habe und diese in die Datenbank eingefügt habe (alles mit einem PHP-Skript), keine Änderungen an den Umlauten in der Datenbank sichtbar waren. Und wenn ich sie mit PHP wieder auslese und über den Befehl echo an den Browser ausgebe passt's. ABER wenn ich sie als Variablen in der Form ?varName1=Wert1&varName2=Wert2... an Flash übergebe, werden die Umlaute falsch dargestellt.

    Nachtrag: Auch wenn man über PHP ein Mail verschickt mit Text, der Umlaute hat, werden diese bei mir in Outlook Express nicht richtig angezeigt...ich schätze, wenn ich dieses Problem lösen könnte, wäre auch das SQL Problem gelöst.
    Wenn die Umlaute aber unter Anführungszeichen IM Php-Skript selbst vorkommen, klappt alles - nur wenn die Umlaute von einer Seite übermittelt werden, geht alles schief *g*.

  • ICH HAB'S ICH HAB'S ICH HAB'S :)
    Ich weiß woran's liegt.

    Also, falls es irgendwen interessieren sollte (wer weiß...): Die Problemquelle ist Flash MX. Undzwar habe ich Flash verdächtigt, weil wenn man die Eingaben über SQL Query Analyzer macht, oder eine Datei von PHP auslesen lässt und auf die Datenbank übertragen lässt, es zu keinen Verfälschungen kommt. Nur wenn man über eine Flash-Seite die Daten eingibst, werden die Zeichen codiert dargestellt...

    Zum Lösen des Problems waren folgende Schritte nötig:
    Zunächst habe ich die Flashseite innerhalb der Flash MX Umgebung getestet, und hab eine Variable am Bildschirm ausgeben lassen (eine Variable, die den Input des Users speichert). Die Ausgabe war einwandfrei. Keine Codierung zu erkennen.
    Nun gibt es aber eine Funktion in Flash, mit der man die Flash-Anfrage an PHP im Klartext erhalten kann: loadVarsObject.toString(). Und genau das Resultat dieser Funktion hab ich mir ausgeben lassen am Bildschirm --> siehe da: ein 'ä' wurde dargestellt als %C3%A4. Das einzige was noch fehlte: ich musste rausfinden, wie diese Codierung heißt. Also habe ich in Google gesucht in welchem Codierungsformat ein ä zu einem %C3%A4 wird. Die Antwort lautet: UTF-8. Das heißt also, Flash konvertiert beim Übergeben der Variablen an PHP, den Inhalt der Variablen ins UTF-8 Format.
    Nur PHP decodiert das nicht. ;o) Und genau da ist der überaus simple Lösungsansatz. Man sagt PHP, dass das zu decodieren ist. Fertig.
    Undzwar mit der Anweisung: utf8_decode(string).


    (Eigentlich hätte ich von selbst auf UTF-8 kommen können, weil als ich eine von Flash (über PHP) geschickte Mail betrachtet habe, ist mir aufgefallen, dass wenn ich den Zeichensatz von Outlook Express auf UTF-8 einstelle, die Zeichen aus den Flash-Variablen richtig dargestellt werden, nur die von den PHP Strings nicht...)

  • hatte gestern mit einem ähnlichen problem in perl unter win98 zu tun - allerdings gabs noch keine vorgefertigten Lösungen. perl verwendet z.b. intern den iso 8551 irgendwas und win normalerweise cp 850. (afak auch unter winxp)

    Die hausgemachte Lösung (wenn Routinen nicht zur Verfügung) stehen ist ein einfaches tr, also z.B.

    Code
    sub iso2win { tr /\xE8\xEF/\x82\x84/; } # 'dummy'-Werte


    Die Tables dafür stehen im Netz.

    Naja, auf jeden Fall ist es sehr interessant, dass es zu diesem Thema kaum Hilfestellungen gibt. Die Ausgabe am Bildschirm is ja noch nicht so kritisch, aber wenns um system calls geht, kann schon was in die hose gehen.

    Frage [offtopic]: Weiß jemand ob/wie man den von Perl verwendeten Zeichensatz einstellen kann ??

Jetzt mitmachen!

Sie haben noch kein Benutzerkonto auf unserer Seite? Registrieren Sie sich kostenlos und nehmen Sie an unserer Community teil!