HP-User: Umlaute und

Hallo Leute

Kann jemand eine Aussage treffen, bezüglich der Verwendung "ucfirst" in Perl in Kombination mit Umlauten?

Beispiel:
--------------------------------
$Beispiel = ucfirst ($Beispiel);
--------------------------------

Wenn in $Beispiel der Text

"übung"

drin steht und mann aber nach ucfirst

"Übung"

haben möchte, scheint das nicht zu funktionieren. Als Ergebnis erhalte ich lediglich

"bung"

Demnach werden Umlaute wohl nicht unterstützt?

Gruß HP-User

  1. Lieber HP-User,

    anscheinend hast Du ein Kodierungsproblem.

    In welcher Zeichenkodierung ist der String abgefasst, in welcher Zeichenkodierung sind Deine Scriptdateien abgefasst und wie prüfst Du das jeweils?

    Da ich mit Perl keine Erfahrungen habe, weiß ich nicht, wie ucfirst() bei Umlauten verfährt, auch wenn das Handbuch von intern wird UTF-8 verwandt spricht.

    Liebe Grüße,

    Felix Riesterer.

    --
    ie:% br:> fl:| va:) ls:[ fo:) rl:| n4:? de:> ss:| ch:? js:) mo:} zu:)
  2. hi,

    Demnach werden Umlaute wohl nicht unterstützt?

    Seit Perl v5.6 unterscheidet Perl zwischen Oktetten und Zeichenketten. Für UTF-8-Zeichenketten gibt es den internen ScalarValue UTF-8, kurz: SvUTF8.

    Das Verhalten der String-Funktionen ist abhängig davon, ob Oktetten oder Zeichenketten übergeben werden, z.B.:

      
    use utf8;  
    print length 'ä'; # 1, also 1 Zeichen  
      
    no utf8;  
    print length 'ä'; # 2, also 2 Oktetten  
    
    

    Ähnlich ists mit anderen Stringfunktionen uc(), ucfirst() usw.

    ucfirst('ä') liefert nur dann, ein 'Ä', wenn
    1. das Script in utf-8 gespeichert wurde
    2. use utf8; eingebunden wurde

    use utf8 wirkt jedoch nur auf die im Script selbst notierten Literale, in og. Bsp. 'ä'

    Hast Du UTF-8 in einer Variable $s, funktioniert uc($s) nur dann, wenn in $s keine Oktetten sind sondern eine UTF-8-kodierte Zeichenkette als SvUTF8. Mit Modul Encode (seit v5.8 verfügbar) kannst Du zwischen Oktetten und Zeichenketten vermitteln.

    Grundregel auch: Alles was IO ist, muss als Oktetten vorliegen. Wenn Du einen SvUTF8 mit print auf STDOUT gibts (CGI -> Webserver) kommt ggf. eine Fehlermeldung, auf jeden Fall sind die Umlaute verstümmelt. Vor dem print also den SvUTF8 wieder als Oktetten deklarieren oder dem IO-Layer mitteilen, dass UTF-8 kommt.

    Das Thema ist ein bischen komplex, hierzu musst Du noch Einiges an Eigenleistung erbringen ;)

    Verwandt damit ist 'use bytes; no bytes;' umschalten zwischen Character- oder Bytesemantic.

    In oder aus Richtung mysql ist der SvUTF8 voll kompatibel, so kann Perl mit mysql vollständig zeichenorientiert kommunizieren.

    Hotti

    1. Hallo zusammen

      Um das nochmal zu präzisieren:

      PerlScript wird als utf-8 geschrieben und (ich glaub binär wars) auf den Server hochgeladen.

      Dieses Script greift mit "open" auf eine CSV-Datei, die ebenfalls in utf-8
      geschrieben wurde zu.

      Wärend man sich über Leerstellen und Sonderzeichen keine gedanken machen muss (ausgenommen den Separator), gibt es eben mit den deutschen Umlauten bei der Wiedergabe Probleme. Diese äußern sich so, daß eben der Umlaut unterschlagen wird - er ist einfach weg.

      Interessant: Wird ein Textstück von der CSV-Datei in einen Skalar (so heissen doch jetzt die Variablen in Perl *g*) gepackt und ausgegeben - z.B. als HTML-Code - so kommt der auch perfekt im Browser des Client an _inklusive_ den Umlauten. Also da geht es!

      Es scheint wirklich nur daran zu liegen, daß ucfirst die Umlaute nicht kennt.
      Womöglich muss ich mir da eine if-Abfrage bauen, die bei vorliegnden Umlauten das Ä per chr() Zwangsausgibt. So oder so ähnlich. :-)

      Gruß HP-User

      1. OK, hab noch was vergessen.

        Alles in utf-8 geschrieben, aber ich hab tatsächlich im Script oben kein "use utf8;"  verwendet. Danke!

        Gruß HP-User

        1. Alles in utf-8 geschrieben, aber ich hab tatsächlich im Script oben kein "use utf8;"  verwendet. Danke!

          Pragma utf8 wirkt nur auf Literale, die im Script selbst notiert sind. In einer Datei jedoch stehen IMMER Oktetten, auch dann, wenn das UTF-8 ist.

            
          use utf8;  
          my $str = <FILEHANDLE>;  
          # has no effect!!!  
          
          

          Jetzt kommen wir wieder zu dem Hinweis, der schon von Kollegen gegeben wurde:

            
          use Text::CSV;  
          
          

          Mit diesem Modul bekommst Du UTF-8-kodierte Strings. Wenn Du die Datei selbst einliest, bekommst Du Oktetten (ohne weitere eigene Initiativen).

          Alles was an Stringfunktionen (uc, ucfirst usw.) geht, das müssen Zeichenketten sein, mit Oktetten gehts schief.

          Hotti