realm: ä wird zu seltsamen zeichen

hi!

sry, falls so eine frage schon gestellt wird; ich habe mit der suche nichts gefunden (der suchterm 'ä' is nicht wirklich sinnvoll :))

hoffentlich kann mir jemand von euch weiterhelfen:
ich habe eine mysql datanbank und möchte die mit php befüllen
wenn der text, den ich einfügen möchte nun umlaute enthält, werden seltsamen zeichen daraus
z.B. ö => ö
     ä => ä

wie kann ich das abstellen?

lg

  1. wird das in der datenbank so oder beim auslesen?

    hi!

    sry, falls so eine frage schon gestellt wird; ich habe mit der suche nichts gefunden (der suchterm 'ä' is nicht wirklich sinnvoll :))

    hoffentlich kann mir jemand von euch weiterhelfen:
    ich habe eine mysql datanbank und möchte die mit php befüllen
    wenn der text, den ich einfügen möchte nun umlaute enthält, werden seltsamen zeichen daraus
    z.B. ö => ö
         ä => ä

    wie kann ich das abstellen?

    lg

    1. das wird in der datanbank so, ich hab es überprüft;
      im php script ist es normal und in der db sind dann diese seltsamen zeichen.

      1. Hi!
        Weil DB und und deine Scripte nicht die gleiche Zeichenkodierung benutzen. Am Besten, Du codierst alles UTF-8.

        --
        "Die Diebesgilde beklagte sich darueber, dass Mumm in aller Oeffentlichkeit behauptet hatte, hinter den meisten Diebstaehlen steckten Diebe."
              - T. Pratchett
        1. Hi!
          Weil DB und und deine Scripte nicht die gleiche Zeichenkodierung benutzen. Am Besten, Du codierst alles UTF-8.

          okay, ... wie mach ich das?
          die codierung bei der datanbank stelle ich um, indem ich "collation" umstelle (hab ich jetzt auf "utf8_unicode_ci");
          aber bei meinen scripten.. wie mach ich dsa da?

          1. Hi!

            okay, ... wie mach ich das?
            die codierung bei der datanbank stelle ich um, indem ich "collation" umstelle (hab ich jetzt auf "utf8_unicode_ci");
            aber bei meinen scripten.. wie mach ich dsa da?

            Zuerstmal indem Du sie als UTF abspeicherst. Je nach Editor, den Du benutzt sollte es da Moeglichkeiten geben. Windows Notepad z.B. bietet unter 'save as' die Moeglichkeit den Zeichencode zu waehlen.

            --
            "Die Diebesgilde beklagte sich darueber, dass Mumm in aller Oeffentlichkeit behauptet hatte, hinter den meisten Diebstaehlen steckten Diebe."
                  - T. Pratchett
            1. okay, jetzt hab ich alle meine scripte mit utf8 gespeichert;
              meine datanbank ist auf 'utf8_unicode_ci' eingestellt -

              aber es funktioniert trotzdem nicht;

              1. aber es funktioniert trotzdem nicht;

                Du wirst mehr Infos offenlegen müssen. Es gibt mehrere stellen, wo die Zeichenkodierung schief gehen kann

                * Datenbank
                * Skript
                * Server
                * Browser

                Erst wenn alle Stellen sich einig sind funktioniert es.

                Struppi.

                1. klar;

                  ich hab meine scripte jetz in utf8 gespeichert;
                  ich verwende wamp zum testen, und habe noch keine einstellungen geändert;
                  als datenbank verwende ich mysql;
                  die connection collation steht auf: utf8_unicode_ci;
                  die collation meiner datanbank und der textfelder darin sthet auch auf utf8_unicode_ci;

                  aber das problem leigt sicher zwischen script und datanbank:
                  ich habe einen datensatz via phpmyadmin eingefügt -> umlaute funktionieren normal
                  ich habe php den wert kurz vor dem absenden des querys ausgeben lassen -> umlaute waren noch da

                  lg

                  1. klar;

                    ich hab meine scripte jetz in utf8 gespeichert;
                    ich verwende wamp zum testen, und habe noch keine einstellungen geändert;
                    als datenbank verwende ich mysql;
                    die connection collation steht auf: utf8_unicode_ci;
                    die collation meiner datanbank und der textfelder darin sthet auch auf utf8_unicode_ci;

                    Mit welcher Kodierung verschickt der Server die Seite
                    Welcher Kodierung zeigt der browser sie an?

                    Struppi.

                    1. der browser (friefox) zeigt es mit utf-8 encoding an;
                      wie finde ich heraus, welches encoding der server verwendet?

                      1. der browser (friefox) zeigt es mit utf-8 encoding an;
                        wie finde ich heraus, welches encoding der server verwendet?

                        z.b. https://tools.sistrix.de/he/

                        Aber wenn FF sagt utf-8, dann ist alles i.O. D.h. wenn deine Daten in utf-8 abgespeichert sind, sollten sie auch so angezeigt werden.

                        Struppi.

                        1. ich bin gerade draufgekommen, dass das programm, mit dem ich arbeite, die funktion "convert dos to unix" bietet; und wenn ich ein script von z.b. wordpress öffne, bekomme ich ein fenster, ob diese datei in dos konvertiert werden soll (also ist die wahrscheinlich für unix)

                          sollte ich das einmal probieren?
                          (ich hoffe, das war jetzt nicht zu chaotisch)

                          1. echo $begrüßung;

                            ich bin gerade draufgekommen, dass das programm, mit dem ich arbeite, die funktion "convert dos to unix" bietet; und wenn ich ein script von z.b. wordpress öffne, bekomme ich ein fenster, ob diese datei in dos konvertiert werden soll (also ist die wahrscheinlich für unix)

                            Diese Funktion konvertiert nur die Zeilenenden. Mit der Zeichenkodierung hat sie nichts zu tun. Zeichenkodierungen sind nicht betriebssystemabhängig.

                            sollte ich das einmal probieren?

                            Das ist unnötig.

                            (ich hoffe, das war jetzt nicht zu chaotisch)

                            Zumindest war der bisherige Verlauf des Fadens so. Versuch einer Ordnung:

                            Wichtig ist, dass:

                            • du zunächst Grundkenntnisse über Zeichenkodierung und UTF-8 im Speziellen aneignest.

                            • du weißt, dass deine "seltsamen Zeichen" (ö => ö) UTF-8-kodiert sind, aber du sie gemäß ISO-8859-1 dekodiert angeschaut hast.

                            • jede beteiligte Komponente intern mit UTF-8 umzugehen versteht (was PHP derzeit noch nur eingeschränkt kann).

                            • bei der Kommunikation zwischen zwei Komponenten (Datenbank zu Webserver, Webserver zu Client), sie über die zu verwendende und verwendete Zeichenkodierung aufgeklärt werden. Das wissen sie entweder per Konfiguration oder es muss ihnen vom Kommunikationspartner explizit mitgeteilt werden.

                            • du Scripte, die auszugebenden Text im Code enthalten, als UTF-8 ohne BOM kodiert speicherst.

                            • du Ausgaben in Richtung Browser

                            • a) als UTF-8 deklarierst, was im HTTP-Header Content-Type mit der charset-Angabe erfolgt. Außerdem ist eine gleichnamige Meta-Angabe sinnvoll, wenn die Seite nicht im Webserver-Kontext steht, beispielsweise, wenn sie lokal gespeichert wurde, oder der Webserver keine charset-Angabe macht. Prüfe die HTTP-Header mit einer Browser-Extension, wie httpliveheaders für den Firefox.

                            • b) die Ausgaben auch tatsächlich in der Kodierung UTF-8 erfolgen.

                            • Daten aus und in Richtung MySQL in der Verbindungskodierung übertragen werden (müssen). Wenn diese von der Kodierung der Felder (Nur die Feldkodierung ist letzlich ausschlaggebend. Datenbank- bzw. Tabellenkodierungsangaben sind Defaultwerte für neu erstellte Tabellen bzw. Felder ohne explizite Angabe.) abweicht, kodiert MySQL die Daten selbständig um (was gegebenenfalls prinzipbedingt nicht verlustfrei geht). Zum Aushandeln der Verbindungskodierung sollte man die Funktion mysql_set_character_set() bzw. deren Pendants in der jeweiligen Programmierumgebung bevorzugen (PHP z.B. mysql_set_charset()), oder zumindest für ISO-8859-x und UTF-8 alternativ ein SET NAMES-Statement nach dem Verbindungsaufbau senden.

                            • du weißt, dass wenn der phpMyAdmin etwas richtig anzeigt, diese Daten ordnungsgemäß kodiert in MySQL stehen - und umgekehrt, wenn nicht, etwas nicht in Ordnung ist.

                            • sich ein Browser gemäß HTTP-Header, Meta-Angabe und Raten (in dieser Prioritätsreihenfolge) die Zeichenkodierung zum Dekodieren der Daten ermittelt. Im Menü Ansicht->(Zeichen)kodierung kann man die Kodierung umstellen, und sehen, was wäre, wenn für die Daten eine andere Kodierung deklariert wäre.

                            echo "$verabschiedung $name";

                            1. hey, danke für die ausführliche antwort;
                              ich werde deinen rat beherzigen und mich noch einmal grundlegender mit zeichenkodierung beschäftigen;

                              mein problem konnte ich jetzt allerdings lösen:

                              mysql_query('SET NAMES "utf8"');  
                              header("Content-type: text/html; charset=utf8");
                              

                              und bei der formatierung für die ausgabe:
                              htmlentities($text, ENT_COMPAT, 'UTF-8');

                              nochmal danke an euch alle!!!

                              1. echo $begrüßung;

                                hey, danke für die ausführliche antwort;
                                ich werde deinen rat beherzigen und mich noch einmal grundlegender mit zeichenkodierung beschäftigen;

                                mein problem konnte ich jetzt allerdings lösen:
                                mysql_query('SET NAMES "utf8"');

                                Die Funktion mysql_set_charset() steht dir (wegen zu alter PHP-Version) nicht zur Verfügung? Dann solltest du nicht nur aus dem Grund dringend eine aktuelle PHP-Version in Erwägung ziehen.

                                und bei der formatierung für die ausgabe:
                                htmlentities($text, ENT_COMPAT, 'UTF-8');

                                HTML-Entities benötigst du nicht. Du hast nun UTF-8 und kannst damit alle Zeichen direkt UTF-8-kodiert ausgeben. Der Umweg über eine nummerische Zeichenreferenz ist nicht notwendig. Lediglich die HTML-spezifischen Zeichen müssen berücksichtigt werden, und das erledigt htmlspecialchars(). Für htmlspecialchars() benötigst du auch den charset-Parameter nicht, der entfaltet bei UTF-8 und ISO-8859-x keine Wirkung.

                                echo "$verabschiedung $name";

            2. Zuerstmal indem Du sie als UTF abspeicherst. Je nach Editor, den Du benutzt sollte es da Moeglichkeiten geben. Windows Notepad z.B. bietet unter 'save as' die Moeglichkeit den Zeichencode zu waehlen.

              Speichert aber dann die BOM mit, oder?

              Struppi.

              1. Moin!

                Speichert aber dann die BOM mit, oder?

                Nö. Jedenfalls seh ich da nix von, in meinen Dokumenten. (auffer Arbeit)

                --
                "Die Diebesgilde beklagte sich darueber, dass Mumm in aller Oeffentlichkeit behauptet hatte, hinter den meisten Diebstaehlen steckten Diebe."
                      - T. Pratchett
  2. echo $begrüßung;

    sry, falls so eine frage schon gestellt wird; ich habe mit der suche nichts gefunden (der suchterm 'ä' is nicht wirklich sinnvoll :))

    Du verwendest unzureichende Suchbegriffe. Das Thema ist schon zigfach behandelt worden. Eine Suche nach MySQL und Umlaute sollte bessere Ergebnisse bringen (auch ausführlichere als die bisherigen Antworten).

    echo "$verabschiedung $name";