Niels Jakob: Probleme mit Umlauten

Hallo :)

Ich habe ein Formular in dessen Ausgabe ich alle Umlaute durch 'ae' etc ersetzen möchte.

Hierzu benutze ich ein ganz simples:

$message = str_replace("ä","ae",$message);
(etc)

Was auch super funktioniert solange ich das 'ä' von Hand in das Textfeld schreibe.

Mein Problem ist nun, dass wenn ich dorthin Text aus z.B. einer PDF Datei kopiere, er die Umlauten lässt - die Suche mit str_replace erkennt also die ä nicht.

Was kann ich da tun? Ich habe von den ganzen Kodierungen, UTF, ISO etc überhaupt keine Ahnung und blicke überhaupt nicht durch :(

Danke schonmal =)

  1. Dein Problem liegt daran, dass Du unterschiedliche Zeichenkodierungen (ISO, UTF) innerhalb des gleichen Kontext verwendest. Stelle alles auf UTF-8 um und Deine diesbezüglichen Probleme werden verschwinden.

    Gruß, LX

    --
    RFC 1925, Satz 2: Egal, wie fest man schiebt, ganz gleich, wie hoch die Priorität ist, man kann die Lichtgeschwindigkeit nicht erhöhen.
    1. Dein Problem liegt daran, dass Du unterschiedliche Zeichenkodierungen (ISO, UTF) innerhalb des gleichen Kontext verwendest. Stelle alles auf UTF-8 um und Deine diesbezüglichen Probleme werden verschwinden.

      Gruß, LX

      Vielen Dank für die Antwort.

      Wie mache ich das denn genau? Ich habe dies versucht..

      $message = utf8_encode($_POST["message"]);

      ..das gibt mir aber "xxx" (das kann ich hier scheinbar gar nicht schreiben) für das ä, das ich von Hand schreibe und "xxx" (das auch nicht :P) für das das ich aus der PDF Datei kopiere

      Wozu soll das gut sein?

      Naja, das Ersetzen der Umlaute war eigentlich nur als Hilfslösung gedacht, weil ich dachte, dass das vielleicht einfacher wäre.
      Aber das grundlegende Problem ist, dass er die Umlaute als solche nicht erkennt. Wenn ich es so formatiert kriege, dass str_replace sie erkennt, dann kann ich sie auch drinlassen (wirr..).

      1. Wenn alles, was innerhalb Deines Projekts passiert, bereits in UTF-8 kodiert ist, solltest Du Funktionen wie utf8_encode gar nicht mehr benötigen.

        Gruß, LX

        --
        RFC 1925, Satz 2: Egal, wie fest man schiebt, ganz gleich, wie hoch die Priorität ist, man kann die Lichtgeschwindigkeit nicht erhöhen.
        1. Wenn alles, was innerhalb Deines Projekts passiert, bereits in UTF-8 kodiert ist, solltest Du Funktionen wie utf8_encode gar nicht mehr benötigen.

          Gruß, LX

          Hmmm..

          ich hab den encode quatsch jetzt wieder weggemacht und dafür oben

          header('content-type: text/html; charset=utf-8');

          hingeschrieben.

          Jetzt zeigt er die ä alle wunderbar als solche an (yay!).

          Aaaber: wenn ich jetzt schreibe..

          $message = str_replace("ä","ae",$message);

          ..und mein $message aus einem von Hand getippten ä und einem aus einer PDF Datei kopierten besteht..
          ..dann ersetzt er NUR das erste, nicht dass kopierte :(

          Was kann man da jetzt noch machen?

          1. Hallo!

            Was kann man da jetzt noch machen?

            Zusätzlich noch

            str_replace("\xE4", "ae", $message);

            verwenden.

            Gruß, LX

            --
            RFC 1925, Satz 2: Egal, wie fest man schiebt, ganz gleich, wie hoch die Priorität ist, man kann die Lichtgeschwindigkeit nicht erhöhen.
            1. Zusätzlich noch

              str_replace("\xE4", "ae", $message);

              verwenden.

              Gruß, LX

              Danke nochmal.

              Funktioniert leider immer noch nicht - er lässt es einfach bei den ä :S

              Kann es sein, dass das was ich will vlt gar nicht geht weil der Text im Formular aus verschiedenen Quellen kommt und daher unterschiedlich kodiert ist? Ich pack's einfach nich.. :(

              1. Hallo!

                Normalerweise sollte \xE4 das "ä" in ISO-Kodierung sein.

                Dass das nicht funktioniert, kann 2 Gründe haben: 1. PHP erkennt \xE4 nicht als C-kodiertes Zeichen, 2. in Wahrheit ist das Zeichen, was Du in str_replace ersetzen läßt, bereits ISO-kodiert. in diesem Fall solltest Du noch \uC3A4 ersetzen (das UTF-8-Zeichen "ä"); zur Hilfe hier ein Link zur UTF8-Zeichentabelle.

                Gruß, LX

                --
                RFC 1925, Satz 2: Egal, wie fest man schiebt, ganz gleich, wie hoch die Priorität ist, man kann die Lichtgeschwindigkeit nicht erhöhen.
                1. Normalerweise sollte \xE4 das "ä" in ISO-Kodierung sein.

                  Wenn ein ISO-codiertes ä in einem utf-8-Text auftaucht dann ist das ein Zeichen mit einer 1 im führendem Bit. Innerhalb des utf-8 wird dann auf das nächste Byte zugegriffen und beide Bytes dann als ein Zeichen dargestellt, was m.E. beliebige Werte annehmen kann. Von daher kann man m.E. nur

                  a) zurückschalten nach ISO
                  b) ä austauschen gegen ae
                  c) wieder schalten nach utf-8
                  d) ae austauschen gegen ä

                  1. Hi!

                    Wenn ein ISO-codiertes ä in einem utf-8-Text auftaucht dann ist das ein Zeichen mit einer 1 im führendem Bit. Innerhalb des utf-8 wird dann auf das nächste Byte zugegriffen und beide Bytes dann als ein Zeichen dargestellt, was m.E. beliebige Werte annehmen kann.

                    Es können bei UTF-8 bis zu drei Byte folgen. Zeichen mit zwei Folgebytes kommen auch hierzulande vor, beispielsweise das €-Zeichen. Die Folgebytes dürfen auch nicht beliebig sein, sondern müssen mit der Bit-Sequenz 10 anfangen. Ein guter UTF-8-Lesemechanismus sollte ein falsches Folgebyte als ungültig erkennen und es normal interpretieren. Der ungültige Sequenzbeginn kann durch das Replacement-Character � dargestellt werden.

                    Von daher kann man m.E. nur
                    a) zurückschalten nach ISO
                    b) ä austauschen gegen ae
                    c) wieder schalten nach utf-8
                    d) ae austauschen gegen ä

                    Es gibt gültige Sequenzen von ae usw., die einen Fehler ergäben, ersetzte man sie durch ein ä. Und es gibt Konvertiertools, die ohne Kollateralschaden zwischen Zeichenkodierungen umkodieren können (wenn mit der Zielkodierung die entsprechenden Zeichen dargestellt werden können, was bei ISO-8859-1 nach UTF-8 der Fall ist).

                    Lo!

                    1. Hey,

                      vielen Dank für die ganzen Antworten. Ich hab jetzt ein bisschen rumgewurschelt und es irgendwie hinbekommen.

  2. @@Niels Jakob:

    nuqneH

    Ich habe ein Formular in dessen Ausgabe ich alle Umlaute durch 'ae' etc ersetzen möchte.

    Wozu soll das gut sein?

    Qapla'

    --
    Gut sein ist edel. Andere lehren, gut zu sein, ist noch edler. Und einfacher.
    (Mark Twain)
  3. hi,

    Mein Problem ist nun, dass wenn ich dorthin Text aus z.B. einer PDF Datei kopiere, er die Umlauten lässt - die Suche mit str_replace erkennt also die ä nicht.

    Ja, das wird gerne übersehen, dass die Zeichen, die kopiert werden auch in einer bestimmten Kodierung vorliegen und die Kodierung dann mitkopiert wird.

    Ich habe von den ganzen Kodierungen, UTF, ISO etc überhaupt keine Ahnung und blicke überhaupt nicht durch :(

    Studieren heißt: Sich bemühen.

    Horst Mühe

    --
    Eine Kuh macht muh. Viele Kühe machen mühe.