Phillipp: Französische Zeichen umwandeln (é,â,...)

Hallo,

wie kann ich französische Buchstaben mit Accents in jene ohne Accents umwandeln? Alle Versuche mit =~s und =~tr haben nicht funktioniert...

$str =~ s/é/e/;
$str =~ tr/éèêëçâîô/eeeecaio/;

Muss ich vielleicht das Zeichen im Regex anders codieren?

Grüße,
Philipp

  1. Hi,

    Hallo,

    wie kann ich französische Buchstaben mit Accents in jene ohne Accents umwandeln? Alle Versuche mit =~s und =~tr haben nicht funktioniert...

    $str =~ s/é/e/;
    $str =~ tr/éèêëçâîô/eeeecaio/;

    Muss ich vielleicht das Zeichen im Regex anders codieren?

    Ich habe es nicht getestet, aber es müsste gehen, wenn du den ASCII-Code der Zeichen im RegExp angibst.

    Das geht mit
    \xnn     bei Zeichen mit dem Hex-Code nn (ASCII-Text)
    \x{nnnn} Zeichen mit dem Hex-Code nnnn (bei Unicode-Zeichen)
    (Quelle)

    Laut dieser Tabelle müsstest du beispielsweise für "á" beispielsweise "\xE1" schreiben können.

    mfG,
    steckl

    1. Hi,

      Das geht mit
      \xnn     bei Zeichen mit dem Hex-Code nn (ASCII-Text)
      \x{nnnn} Zeichen mit dem Hex-Code nnnn (bei Unicode-Zeichen)

      Laut dieser Tabelle müsstest du beispielsweise für "á" beispielsweise "\xE1" schreiben können.

      Wenn ich
      $str = "Opéra"; habe und
      $str =~ s/\xE9/e/; darauf anwende, sollte Opéra eigentlich zu Opera werden, bleibt bei mir aber Opéra...

      1. Wenn ich
        $str = "Opéra"; habe und
        $str =~ s/\xE9/e/; darauf anwende, sollte Opéra eigentlich zu Opera werden, bleibt bei mir aber Opéra...

        Dann beherzige bitte die Tipps für Fragende, denn mit den mageren Infos, die Du preisgibst, können wir Dir nicht helfen.

        Siechfred

        --
        Hinter den Kulissen passiert viel mehr, als man denkt, aber meistens nicht das, was man denkt.
      2. Hi

        $str = "Opéra"; habe und
        $str =~ s/\xE9/e/; darauf anwende, sollte Opéra eigentlich zu Opera werden, bleibt bei mir aber Opéra...

        ich weiß nicht was du für ein Zeichensatz hast aber bei mir funtioniert es!!!

        $str = "Opéra";
        $str =~ s/\xE9/e/;
        print $str;

        vielleicht solltest du mal mit

        print ord("é") dir den Dezimalcode ausgeben lassen.

        Bye
         KurtZ

        PS: @Siechfred: zum Thema Perl5 Module weiternutzen http://www.heise.de/ix/artikel/2007/08/127/

        1. Hi,

          $str = "Opéra";
          $str =~ s/\xE9/e/;
          print $str;

          Ich versteh die Welt nicht mehr...
          Das o. g. Beispiel funktioniert so bei mir auch.
          Aber im folgenden Beispiel funktioniert es nicht mehr.

          $str=<stdin>;
          $str =~ s/\xE9/e/;
          print "$str";

          Scheint ja nicht das gleiche zu sein... Weiß jemand genaueres?

          1. Aber im folgenden Beispiel funktioniert es nicht mehr.

            $str=<stdin>;

            Du bist also in der Konsole, dort werden die Zeichen anders kodiert.

            my $str='Opéra';#<stdin>;  
            print "Vorher: $str\n";  
              
            $str =~ s/é/e/;  
            print "Nacher: $str";
            

            Struppi.

            1. Hi,

              Du bist also in der Konsole, dort werden die Zeichen anders kodiert.

              Gibt es denn eine Möglichkeit, mit Accents eingegebene e's (a's, etc.) in normale e's (a's,...) umzuwandeln?

              Grüße,

              1. Hi,

                Du bist also in der Konsole, dort werden die Zeichen anders kodiert.

                Gibt es denn eine Möglichkeit, mit Accents eingegebene e's (a's, etc.) in normale e's (a's,...) umzuwandeln?

                Natürlich, die wurde dir doch bereits gezeigt.
                Die Frage die sich bei dir stellt ist der Zeichensatz bzw. <a href="http://de.wikipedia.org/wiki/Codepage">Codepage</a> du verwendest. Wenn du den Perl Code in einem Windows editor schreibst benutzt du i.d.R. 1252 in der Konsole bzw. MS DOS Fenster hast du aber meistens 437

                Was du jetzt machen musst, hängt davon ab wo du die Ausgabe nun haben willst.

                Struppi.

                1. Okay, dann hab ich das noch nicht ganz verstanden...

                  Ich benutze als Editor UltraEdit und das DOS Command Window.
                  Mein Script sieht unter Berücksichtigung der vorherigen Postings bisher so aus:

                  #/usr/bin/perl -w

                  print"Eingabe: ";
                  $str=<stdin>;
                  print "Vorher: $str\n";
                  $str =~ s/\xE9/e/;
                  print "Nachher: $str\n";

                  <stdin>

                  und die Ausgabe lautet

                  Eingabe: <Opéra>
                  Vorher: Opéra
                  Nachher: Opéra

                  Die Codes sehe ich also auf dieser Seite
                  http://www.torsten-horn.de/techdocs/ascii.htm
                  unter ANSI und die betreffenen Zeichen sind Exx und Fxx.
                  Also s/\xExx/wasauchimmer/; Soweit richtig?

                  Im Script klappt es leider immer noch nicht. Was muss ich anders machen?

                  Grüße,

                  1. Ich benutze als Editor UltraEdit und das DOS Command Window.

                    Okay, dann mach mal folgendes:

                    print "Eingabe: ";  
                    my $str = <STDIN>;  
                    print "Codiert: ", sprintf("%02X", ord $str);
                    

                    Das ergibt bei mir bei Eingabe von 'é' den Wert 82, für 'è' den Wert 8A. Das Ganze angewendet:

                    $str =~ tr/\x82\x8A/e/;

                    funktioniert hier mit ActiveState Perl 5.8.8 unter Windows XP Home bestens.

                    Zur Erklärung: Was wie codiert ist, hängt von der eingestellten Codepage ab, bei mir ist es CP850. Gib mal in der Kommandozeile "mode con /status" ein, dann wird Dir die Codepage ausgegeben, danach richtet sich, welche Hexwerte Deine Sonderzeichen haben müssen.

                    Siechfred

                    --
                    Hinter den Kulissen passiert viel mehr, als man denkt, aber meistens nicht das, was man denkt.
                    1. print "Eingabe: ";

                      my $str = <STDIN>;
                      print "Codiert: ", sprintf("%02X", ord $str);

                      
                      >   
                      > Das ergibt bei mir bei Eingabe von 'é' den Wert 82, für 'è' den Wert 8A. Das Ganze angewendet:  
                      >   
                      > `$str =~ tr/\x82\x8A/e/;`{:.language-Perl}  
                        
                      Klasse, jetzt hat es geklappt.  
                      Vielen Dank!  
                        
                      Grüße,  
                      Phillipp
                      
                      1. Klasse, jetzt hat es geklappt.

                        Freut mich.

                        Ich weiß nicht, ob das Script nur für Deinen Hausgebrauch ist, ansonsten kannst Du via Win32::Console die aktuelle Codepage auslesen und auch ändern. Denn um Dein Programm unter allen Win32-Installationen lauffähig zu halten, wäre es m.E. angebracht, vor dem Einlesen von STDIN die Codepage explizit zu setzen, die Dein Programm erwartet:

                        use strict;  
                        use Win32::Console;  
                          
                        my $defaultCP = Win32::Console::InputCP();          # holen der aktuellen Einstellung  
                        Win32::Console::InputCP(850) if $defaultCP != 850;  # Setzen von CP850, wenn erforderlich  
                        # hier das STDIN-Gedöns  
                        Win32::Console::InputCP($defaultCP);                # Rücksetzen auf voreigestellten Wert
                        

                        Für Ausgaben in die Konsole gibt es übrigens das Gegenstück Win32::Console::OutputCP(), das auf die gleiche Art funktioniert.

                        Siechfred

                        --
                        Hinter den Kulissen passiert viel mehr, als man denkt, aber meistens nicht das, was man denkt.
                  2. Hallo

                    du ich verlier die Geduld ...

                    1. du postest Code der angeblich nicht funktioniert aber bei dir läufts dann doch.

                    2. hab ich dir gesagt du sollst einfach mit ord() die Codes ermitteln und in hex umwandeln.

                    Im Script klappt es leider immer noch nicht. Was muss ich anders machen?

                    das eigene Hirn belasten?

                    Leb Wohl
                      Kurt

              2. Hallo,

                Du bist also in der Konsole, dort werden die Zeichen anders kodiert.

                Gibt es denn eine Möglichkeit, mit Accents eingegebene e's (a's, etc.) in normale e's (a's,...) umzuwandeln?

                Aber ja, so wie beschrieben, wenn du die richtigen Hex-Codes der eingegebenen Zeichen kennst. Das hängt von der verwendeten Konsole ab. Unter Unix/Linux geschieht die Codierung meines Wissens gemäß ISO-8859, Unter Windows ist es meist ANSI. Es gibt je nach Ländereinstellung verschiedene ISO-8859 bzw. ANSI-Codierungen. Apple-Maschinen haben wieder eigene Codierungen.

                Gruß, Don P

  2. wie kann ich französische Buchstaben mit Accents in jene ohne Accents umwandeln? Alle Versuche mit =~s und =~tr haben nicht funktioniert...

    Was war das Ergebnis? Wie ist der String im Script kodiert, UTF-8?

    Muss ich vielleicht das Zeichen im Regex anders codieren?

    Du kannst, musst aber nicht. Du kannst das charnames-Pragma verwenden, Du kannst die Schreibeweise \x{xx} verwenden (UTF-8) oder \x1B (Hexcode laut ASCII- bzw. ANSI-Tabelle), je nach verwendeter Zeichenkodierung.

    Siechfred

    --
    Hinter den Kulissen passiert viel mehr, als man denkt, aber meistens nicht das, was man denkt.