Casablanca: Ruby

Hallo Forum,

ich lerne gerade Ruby on Rails (Version 2.2) und das erste Problem, das ich habe ist die UTF9-Kodierung. Ich bekomme immer die Fehlermeldung: invalid multibyte char (utf 8).

Gesucht habe ich viel. Das mit

#!/bin/env ruby
# encoding: UTF-8

funktioniert auch nicht.

Gruß

akzeptierte Antworten

  1. Hallo Casablanca,

    ich lerne gerade Ruby on Rails (Version 2.2)

    Ich gehe davon aus, dass du Ruby 2.2 nutzt und Rails 4.2? Du wirklich Rails 2.2 nutzt: nicht machen. Das ist völlig veraltet und wird seit Jahren nicht mehr gepflegt.

    und das erste Problem, das ich habe ist die UTF9-Kodierung. Ich bekomme immer die Fehlermeldung: invalid multibyte char (utf 8).

    Du meinst also die UTF-8-Kodierung ;-)

    Gesucht habe ich viel. Das mit

    #!/bin/env ruby
    # encoding: UTF-8
    

    funktioniert auch nicht.

    Schreibst du deinen Quelltext denn wirklich in UTF-8? Du benötigst einen Editor, der in der Lage ist, Dateien mit dieser Kodierung zu speichern. Z.B. Sublime Text wäre so einer.

    LG,
    CK

    1. Hallo Christian,

      danke für die Antwort. Ruby ist für mich ein Neuland. Ich weiss nicht, was ich noch da installieren muss. Ich glaub, ich habe nur Ruby installieret. Ich weiss nicht ganz genau, was der Unterschied zwischen den beiden ist und was da was macht.

      Gruß

      1. Hallo Casablanca,

        danke für die Antwort. Ruby ist für mich ein Neuland.

        Klasse, dass du dich mit dieser schönen Sprache beschäftigst!

        Ich weiss nicht, was ich noch da installieren muss.

        Für Rails benötigst du Ruby selber und Ruby on Rails.

        Ich glaub, ich habe nur Ruby installieret. Ich weiss nicht ganz genau, was der Unterschied zwischen den beiden ist und was da was macht.

        Ruby ist eine Programmiersprache. Rails ist ein Framework, das es einem vereinfacht, Web-Anwendungen zu schreiben. Wenn du letzteres möchtest, lege ich dir diesen Guide nahe, den habe ich damals als sehr hilfreich empfunden.

        LG,
        CK

        1. Danke schön.

    2. Hallo nochmal,

      leider ist das Problem mit UTF-8 auch nach der Installation von neuesten Version von Rails immer noch da. Eine Idee?

      Gruß

      1. Hallo Casablanca,

        leider ist das Problem mit UTF-8 auch nach der Installation von neuesten Version von Rails immer noch da. Eine Idee?

        Stelle sicher, dass deine Datei auch mit UTF-8 gespeichert wurde. Ernsthaft, das geht einfach nicht anders. Du musst das sicherstellen. Wenn dir dein Editor keine Möglichkeit gibt, das Encoding auszuwählen, benutze einen anderen Editor.

        LG,
        CK

  2. Nurmalso nebenbei: Alles was auf STDOUT geht oder in Dateihandle sind bytes. Die Kodierung kommt erst im Ausgabegerät ins Spiel, sprich Konsole, Browser usw. Erst der Browser macht aus den 3 betreffenden Bytes ein für den Besucher sichtbares EUR Zeichen, natürlich nur dann, wenn das dem Browser mitgeteilt wurde.

    Dein script jedoch schickt die Ausgabe nicht direkt an den Browser sondern nach STDOUT. D.h., wie die Zeichen danach kodiert sein sollen, muss Dein Script gar nicht wissen. Es muss nur die richtigen Bytes auf STDOUT ausgeben.

    Das funktioniert so mit PHP, Perl und jeder anderen PL ebenso.

    1. Hallo pl,

      Dein script jedoch schickt die Ausgabe nicht direkt an den Browser sondern nach STDOUT.

      Das ist falsch. Rails ist nicht Perl und arbeitet nicht über CGI. Bei Rails wird ein Application Server gestartet, hier wird direkt in einen Socket geschrieben.

      D.h., wie die Zeichen danach kodiert sein sollen, muss Dein Script gar nicht wissen.

      Das ist falsch. Ruby ist nicht Perl. (Und auch in Perl ist das nicht vollständig richtig, schlage unter use utf8 nach). Ruby geht prinzipiell erstmal davon aus, dass der Sourcecode in UTF-8 vorliegt.

      LG,
      CK

      1. Hallo pl,

        Dein script jedoch schickt die Ausgabe nicht direkt an den Browser sondern nach STDOUT.

        Das ist falsch. Rails ist nicht Perl und arbeitet nicht über CGI. Bei Rails wird ein Application Server gestartet, hier wird direkt in einen Socket geschrieben.

        Auch das ist Bytesemantic. Socket ist IO.

        D.h., wie die Zeichen danach kodiert sein sollen, muss Dein Script gar nicht wissen.

        Das ist falsch. Ruby ist nicht Perl. (Und auch in Perl ist das nicht vollständig richtig, schlage unter use utf8 nach). Ruby geht prinzipiell erstmal davon aus, dass der Sourcecode in UTF-8 vorliegt.

        IO war schon immer Byte-Semantic. Und es gab auch hier im Forum schon mal Leute, die das begriffen hatten. Ist aber schon paar Jahre her und die sind längst weg.

        1. Hallo pl,

          Dein script jedoch schickt die Ausgabe nicht direkt an den Browser sondern nach STDOUT.

          Das ist falsch. Rails ist nicht Perl und arbeitet nicht über CGI. Bei Rails wird ein Application Server gestartet, hier wird direkt in einen Socket geschrieben.

          Auch das ist Bytesemantic. Socket ist IO.

          Du schreibst „nicht direkt an den Browser sondern nach STDOUT“ - das ist nachweisbar falsch und hat nichts mit „Bytesemantic“ oder ähnlichem zu tun.

          D.h., wie die Zeichen danach kodiert sein sollen, muss Dein Script gar nicht wissen.

          Das ist falsch. Ruby ist nicht Perl. (Und auch in Perl ist das nicht vollständig richtig, schlage unter use utf8 nach). Ruby geht prinzipiell erstmal davon aus, dass der Sourcecode in UTF-8 vorliegt.

          IO war schon immer Byte-Semantic.

          Das ist nicht richtig. Ruby unterscheidet auch bei I/O zwischen den Encodings, und auch Perl tut das. Oder was meinst du, wofür

          open(my $fh, "<:encoding(UTF-8)", "filename")
              || die "can't open UTF-8 encoded filename: $!";
          

          das UTF-8 hier steht? Zur Zierde? Auch Perl kann I/O-Processing. Die Zeiten haben sich weiterentwickelt. Dass, was man damals[tm] gemacht hat, direkt die Bytes zu manipulieren, das macht man heute eigentlich nur noch in PHP und den Low-Level-Sprachen. Die anderen Sprachen haben heutzutage eingebauten Unicode-Support (der war in PHP auch geplant, wurde dann aber zusammen mit Version 6 gestrichen).

          Und im konkreten Fall: nein. Ruby muss wissen, welches Encoding die Daten haben, weil es einem sonst um die Ohren fliegt.

          Und es gab auch hier im Forum schon mal Leute, die das begriffen hatten. Ist aber schon paar Jahre her und die sind längst weg.

          Du musst nicht denken, dass ich nicht verstehe, worauf du hinaus willst. Es ist nur so, dass sich in den letzten Jahren viel verändert hat.

          LG,
          CK

          1. Das ist nicht richtig. Ruby unterscheidet auch bei I/O zwischen den Encodings, und auch Perl tut das. Oder was meinst du, wofür

            open(my $fh, "<:encoding(UTF-8)", "filename")
                || die "can't open UTF-8 encoded filename: $!";
            

            das UTF-8 hier steht?

            Es sorgt dafür, dass am IO Layer von Character- auf Byte-Semantic umgeschaltet wird. Sicher gabs auch in Perl wesentliche Änderungen, bsp. ist mit 5.8 Encode in den Core gekommen und die Unicode-Unterstützung wird ständig verbessert.

            Aber IO (Sockets, Dateihandle, STDIN, STDOUT...) war schon immer Byte-Semantic und auf diesem Level gibt es keine Kodierung.

            So gibt ein print "äöü" nicht etwa Zeichen aus sondern Bytes und zwar genauso, wie sie in derselben Datei gespeichert sind.

            Ob das Bytes für UTF-8 sind oder ISO/ANSI-irgendwas ist dem Perl-Interpreter oder einem c-Compiler völlig Wurscht.

            1. Hallo pl,

              Es sorgt dafür, dass am IO Layer von Character- auf Byte-Semantic umgeschaltet wird.

              Ach! Sieh an. Ist ja nicht so als hätte ich nicht genau das gesagt ;-)

              Sicher gabs auch in Perl wesentliche Änderungen, bsp. ist mit 5.8 Encode in den Core gekommen und die Unicode-Unterstützung wird ständig verbessert.

              Ja. Eine begrüssenswerte Entwicklung.

              Aber IO (Sockets, Dateihandle, STDIN, STDOUT...) war schon immer Byte-Semantic und auf diesem Level gibt es keine Kodierung.

              Das stimmt nicht (mehr). Klar, vor 10 Jahren hattest du recht. Heute nicht.

              So gibt ein print "äöü" nicht etwa Zeichen aus sondern Bytes und zwar genauso, wie sie in derselben Datei gespeichert sind.

              Das ist abhängig von der Implementation von print. In C hast du recht, in Ruby und Perl nicht (mehr), denn da gibt es das Output Processing.

              Ob das Bytes für UTF-8 sind oder ISO/ANSI-irgendwas ist dem Perl-Interpreter [… völlig Wurscht.]

              Nein. Es kann ihm egal sein, es ist aber nicht zwangsläufig der Fall. Versuch mal etwa chinesische Schriftzeichen in eine Datei zu schreiben, die mit Latin1 geöffnet wurde:

              → ckruse@sunshine ~  % cat test.pl 
              #!/usr/bin/perl -w
              
              use utf8;
              
              open(my $fh, ">:encoding(ISO-8859-1)", "fasel.txt") || die("Could not open fasel.txt: $!");
              print $fh "象形字";
              close($fh);
              
              # eof
              → ckruse@sunshine ~  % perl test.pl      
              "\x{8c61}" does not map to iso-8859-1 at test.pl line 7.
              "\x{5f62}" does not map to iso-8859-1 at test.pl line 7.
              "\x{5b57}" does not map to iso-8859-1 at test.pl line 7.
              → ckruse@sunshine ~  % cat fasel.txt 
              \x{8c61}\x{5f62}\x{5b57}
              

              Beachte, dass in der Datei tatsächlich die Escape-Sequenzen stehen.

              oder einem c-Compiler völlig Wurscht.

              Dem C-Compiler ist es in der Tat völlig wurscht, denn der hat kein eingebautes Unicode-Handling.

              LG,
              CK