Matze2K: Das ewige Leid mit den Umlauten -» Perl -» HTML

Hallo @all,

ich weiss nicht, wieviele sich an dieser Sache schon die Zähne
ausgebissen haben - ich bin gerad dabei ! Ich habe schon soviele
Möglichkeiten durchprobiert und auch schon mal ins Archiv geschaut
aber - nichts ! Ich finde einfach keine Lösung ! Dabei kann es so
schwer gar nicht sein !
Ich habe in den DOS-Editor Daten eingegeben und diese in einer Datei abgespeichert ! Diese habe ich dann auf einen Unix-Server gestellt
und verusche nun verzweifelt den Inhalt mit Hilfe eines Perl-Scriptes richtig auszulesen ! Hier werden aber ständig die Umlaute
nicht HTML-Konform ausgegeben !

Einer Meiner Versuche:

for(<FILE>)

{
$_ =~ s/ä/ä/g;
                       usw. (für andere Umlaute)
push (@data, $_);
}

Wie gesagt, es läuft nicht !

Ich wäre über eine Antwort wirklich sehr erfreut !

Matze2K

  1. Hi,

    for(<FILE>)

    {

    »»  $_ =~ s/ä/ä/g;

    usw. (für andere Umlaute)

    »»  push (@data, $_);

    }

    while (<FILE>) {
      s/ä/ä/g;
      push @data, $_;
    }

    Du willst aber eigentlich HTML::Entities benutzen.

    Wie gesagt, es läuft nicht !

    Als da hieße?

    Cheatah

    1. Als da hieße?

      Er ersetzt die Umlaute nicht ! Auch mit while(<FILE>) funktioniert es
      nicht ! Ich versteh' es einfach nicht !

      Hast Du vielleicht noch eine Idee ??

      Vielen Dank

      Matze2K

      1. Hi,

        Er ersetzt die Umlaute nicht ! Auch mit while(<FILE>) funktioniert es
        nicht ! Ich versteh' es einfach nicht !

        was für Debug-Ausgaben hast Du versucht? Wo ist das Script / die Datei online lesbar?

        Hast Du vielleicht noch eine Idee ??

        Ja, die steht aber schon in meiner vorherigen Antwort.

        Cheatah

        1. Vielen Dank für Eure Tips, aber es funktioniert einfach nicht !

          Nochmal das Script:

          open(DB, "<$save_path");  #öffnen der DOS-ASCII-file

          while ($line = <DB>)
          {
            chop($line);                                      
            chop($line);                                      
            $line =~ s/ü/ü/g; @cheatah was meinst du mit HTML::En???
            push(@data, $line);                              
          }

          Vielleicht noch eine Idee ?

          Die Ausgabe ist bspw.: "dies ist leider ungültig"
                                                    <->

          Danke

          Matze2K

          1. hallo

            <ACHTUNG>
            ich bin selbst nich so ne art anfänger, d.h was ich jetz sage könnte falsch sein, ich glaub aber es stimmt...
            </ACHTUNG>

            $line =~ s/ü/ü/g;

            damit suchst du nach "ü" und ersetzt es mit "ü", bringt also gar nix. was cheatah meinte ist, du musstt folgendes schreiben:

            $line =~ s/ü/ü/g;

            dann wird "ü" mit "ü" ersetzt, und es funktioniert...

            gruss
            Eckhart

            1. mist! das forum übersetzt es gleich wieder zu ü, man kann also nicht sehen was ich meine...

              $line =~ s/ü/&_uuml_;/g;

              ohne die beiden unterstriche, dann sollte es klappen...

              1. Hallo,

                mist! das forum übersetzt es gleich wieder zu ü, man kann also

                nicht sehen was ich meine... KANN DIR NUR RECHT GEBEN !

                Ich meinte:

                open(DB, "<$save_path");  #öffnen der DOS-ASCII-file

                while ($line = <DB>)
                {
                  chop($line);                                      
                  chop($line);                                      
                  $line =~ s/ü/&_uuml_;/g;
                  push(@data, $line);                              
                }

                Trotzedem noch einen Einfall, warum es nicht klappt ???

                Matze2K

                1. Trotzedem noch einen Einfall, warum es nicht klappt ???

                  Gaehn! Ich habe dir doch schon mitgeteilt, wo dein Fehler liegt. Da Du deine Datei unter MSDOS erstellt hast, kommt kein latin1-ü darin vor. Die Ersetzungen bringen also gar nichts.

                  Peter

                  1. :-(

                    Stadt hier rumzugaehen könntest Du mir vielleicht sagen, wie man dann
                    das Problem alternativ lösen kann !

                    Vielen Dank

                    Matze2K

                    1. Hallo Matze2K,

                      ist recht lustig der thread.
                      Vielleicht ist Dir mein Kommentar dazu entgangen.

                      Wenn Du 'ü' schreibst, kann das ja im Editor recht nett aussehen, aber das Script auf einem anderen Rechner glaubt, Du hast ' à' oder was auch immer gemeint. Und deshalb findet er kein 'ü' und ersetzt es auch nicht.

                      Nochmals mit anderen Worten: "ASCII-Zeichentabellen können in unterschiedlichen Betriebsystemen unterschiedlich aufgebaut sein!'.

                      Das ist das Problem, daß wir alle haben, seit irgendwer draufgekommen ist, daß es auf der Welt mehr als 256 verschiedene Schriftzeichen gibt.

                      Um alle Unklarheiten zu entfernen, sag' uns bitte die Ascii-Werte deiner Umlaute im Original und auf Deiner Unix-Mühle.
                      Dazu gehts Du, wenn Du es sonst nicht rausbekommst,  wie folgt vor:
                      1.) erstelle auf beiden Systemen eine Datei mit folgendem Inhalt:
                      'äöüÄÖÜß'
                      ( Das mußt Du aber auf beiden System extra machen. Also nicht mit Windows-Editor und dann per FTP (binär vielleicht noch) auf den Unix-Rechner übertragen.
                      2.) Ermittle irgendwie die Ascii-Werte
                      3.) Vergleiche beide Ergebnisse und wenn dann noch nicht alles klar ist, dann melde Dich wieder.

                      hier ein kleines, nicht gerade berauschendes stück Perl-Code, daß das erledigt. (Ui, da werden wieder Proteste kommen)

                      #!/usr/bin/perl
                      $x = 'äöüÄÖÜß';
                      $x =~ s/(.)/$1.'='.ord($1)."\n"/ge;
                      print $x;

                      Dann solltest Du vielleicht noch Dein lokales auf den Server übertragen (genau so, wie Du es mit der anderen Datei gemacht hast) und dir ansehen, ob bei der Übertragung auch noch was umgemodelt wird.

                      Dies Test möchte ich Dir genre Empfehlen um Deinem Problem auf die Spur zu kommen.

                      Grüße
                         Klaus

                      1. Hallo Klaus,

                        danke für Deine ausführliche Antwort - wird ein hartes Stück Arbeit !
                        Was ich allerdings nicht ganz verstehe: ich weiss, dass es verschiedene Zeichensätze gibt, die unterschiedlich aufgebaut sind -
                        warum aber ist der ASCII-Zeichensatz mal so und mal so einprogrammiert ?

                        Danke nochmal

                        Matze2K

                        1. Hallo Matze2K,

                          Hallo Klaus,

                          danke für Deine ausführliche Antwort - wird ein hartes Stück
                          Arbeit !

                          ähm .. kann es sein das du <98208.html> nicht gelesen hast?

                          Gruss,
                          Carsten

                2. Hallo,

                  open(DB, "<$save_path");  #öffnen der DOS-ASCII-file

                  Vielleicht erstmal die unter Unix überflüssigen CR Zeichen ( \r ) entfernen.

                  siehe auch
                  <../../sfarchiv/2000_2/t14099.htm#a71916>

                  while ($line = <DB>)
                  {

                  »»   chop($line);                                      
                  »»   chop($line);                    
                  »»   $line =~ s/ü/&_uuml_;/g;

                  Jetzt hier, falls es nicht eh schon funktioniert(glaube es aber kaum ;-), statt dem "ü" usw, die Hexwerte aus der DOS-ASCII Tabelle einsetzen:

                  siehe auch:
                  <../../sfarchiv/1999_4/t08386.htm#a42273>

                  »»   push(@data, $line);

                  }

                  wenn noch was fehlt:
                  http://www.teamone.de/cgi-local/sfasuch.pl?suchausdruck=ASCII+DOS&feld=alle&hits=alle

                  Viel Vergnügen noch

                  Christoph

            2. Hi,

              was cheatah meinte ist, du musstt folgendes schreiben:

              use HTML::Entities;
              print HTML::Entities::encode_entities('Gänzlich vühle Ümläutä');

              Cheatah

          2. Hallo Matze2K,

            Die Ausgabe ist bspw.: "dies ist leider ungültig"

            Tja, das ist ein DOS ü und kein Windows ü.
            Wenn du dein Script unter Windows edierst passiert das nicht.

            Der Windows-Zeichensatz ist (100%?) identisch zum Web-üblichen
            iso-8859-1 ("Latin-1") Zeichensatz.
            <../../thb.htm#a201>

            Aber der DOS Zeichensatz ist anders. Und das unlesbare ü oben
            ist ein DOS ü!

            Zeichencodes (hex)
               DOS   WIN
            ä  84    e4
            ö  94    f6
            ü  81    fc
            Ä  8E    c4
            Ö  99    d6
            Ü  9A    dc
            ß  E1    df

            Da man in Perl mit \0x84 Zeichen mit ihrem Hex-Codes angeben kann müsste
            folgendes gehen :

            $line =~ s/\0x81/ü/g;

            wenn du DOS-Codes wandeln willst bzw.

            $line =~ s/\0xfc/ü/g;

            für Windows Codes, und zwar unabhängig vom Zeichensatz des Editors mit dem
            du das erstellst.

            Gruss,
            Carsten

            1. Moin Kartsen,

              ich weiss auch nicht was los ist - ich hab's eingesetzt
              und es läuft einfach nicht - krieg bald das heulen hier!

              Bitte schau nochmal: ---Script---

              open (DB, "<$save_path");

              while ($line = <DB>)
              {
              chop($line);                                                                                    
              chop($line);
              $line =~ s/\0x84/&_*uuml;/g;  *gegen HTML-Umwandlung
              push(@data, $line);                              
              }

              Vielen Dank

              Matze2K

              1. Hi Matze2K,

                »»  $line =~ s/\0x84/&_*uuml;/g;  *gegen HTML-Umwandlung

                falsch, da:
                ä  84 -> ä
                ö  94 -> ö
                ü  81 -> ü
                Ä  8E -> &Auml;
                Ö  99 -> &Ouml;
                Ü  9A -> &Uuml;
                ß  E1 -> ß

                muss es ja wohl:
                $line =~ s/\0x84/ä/g;
                heissen um ein ä zu konvertieren und:
                $line =~ s/\0x81/ü/g;
                um ein ü zu konviertieren.

                <../../tgch.htm#a1>
                <../../tgck.htm#a6>

                Gruss,
                Carsten

      2. Hallo,

        Er ersetzt die Umlaute nicht ! Auch mit while(<FILE>) funktioniert es
        nicht ! Ich versteh' es einfach nicht !

        Hast Du vielleicht noch eine Idee ??

        Ich hätte da was. Wer ich bin ? Der wahrscheinlich grösste Umlaut-Depp den ich kenne ;-)

        Nein, ich hab schon mal in einem ellenlangen Thread mich über mein Umlautproblem ausgelassen. Der müsste auch irgendwo im Archiv sein - sehr interessant: wir haben uns wirklich angeregt über ASCII-Tabellen u.s.w. unterhalten. Ich habe dabei jedenfalls viel gelernt.

        Mein Problem war: ich wollte eine Mail mit Bestell- und Personenbezogenen Daten verschicken. Da schnell mal jemand Müller heisst, hatte ich schnell mal ein Problem: Er hies nämlich in der mail Müller !! Etwas unschön.

        Schlussendlich half mir dieses kleine Unterprogramm.

        // sub encode_mail() {
        //    $mail_rows =~ s/ä/ä/g;   $mail_rows =~ s/Ä/Ä/g;
        //    $mail_rows =~ s/ü/ü/g;   $mail_rows =~ s/Ü/Ü/g;
        //    $mail_rows =~ s/ö/ö/g;   $mail_rows =~ s/Ã-/Ö/g;
        //    $mail_rows =~ s/ß/ß/g;
        // }

        ... Zwar nicht der Weisheit letzter Schluss, aber es ist einfach und funktioniert.

        Allerdings kam das ganze bei mir aus einem Formular. Wenn ich Umlaute aus einer Datei einlese gibts bei mir keine Probleme !

        Versuch doch mal das:

        // open (FILE, $filename) die "Can't open $filename: $!";
        // while ($line = <FILE>) {
        //    push(@data, $line); # oder was immer du mit den Daten vorhast!
        // }
        // close (FILE) die "Can't close $filename: $!";

        Ich hoffe ich habe dein Problem richtig verstanden!

        grüsse
        bernhard

      3. Als da hieße?

        Er ersetzt die Umlaute nicht ! Auch mit while(<FILE>) funktioniert es
        nicht ! Ich versteh' es einfach nicht !

        Behandle die Ausgangsdatei mit recode (recode ibmpc:lat1). Du kannst vielleicht auch waehrend der Laufzeit Convert::Recode einsetzen.

        Peter

  2. Hallo,

    Ich habe in den DOS-Editor Daten eingegeben und diese in einer Datei abgespeichert ! Diese habe ich dann auf einen Unix-Server gestellt

    Kann es sein, daß Du ein Problem mit den Zeichensätzen hast? Stichwort:  'DOS-Editor'
    DOS und Windows verwenden unterschiedliche ASCII-Kodes für Umlaute, und bei Unix ist's auch so.
    Das muß jetzt nicht unbedingt sein, aber sieht ganz danach aus.

    Nur so eine Idee.

    klaus