592 Stimmen

Warum vermeidet das moderne Perl standardmäßig UTF-8?

Ich frage mich, warum die meisten modernen Lösungen, die mit Perl entwickelt wurden, nicht die UTF-8 standardmäßig.

Ich weiß, dass es viele Legacy-Probleme für Kern-Perl-Skripte gibt, bei denen es Dinge kaputt machen kann. Aber aus meiner Sicht ist es in den 21 st Jahrhunderts, sollten große neue Projekte (oder Projekte mit einer großen Perspektive) ihre Software von Grund auf UTF-8-fest machen. Dennoch sehe ich nicht, dass dies geschieht. Zum Beispiel, Elch ermöglicht strenge und Warnungen, aber nicht Unicode . Modern::Perl reduziert auch Boilerplate, aber keine UTF-8-Behandlung.

Warum? Gibt es Gründe, UTF-8 in modernen Perl-Projekten im Jahr 2011 zu vermeiden?


Der Kommentar von @tchrist wurde zu lang, also füge ich ihn hier hinzu.

Es scheint, dass ich mich nicht klar ausgedrückt habe. Lassen Sie mich versuchen, einige Dinge hinzuzufügen.

tchrist und ich sehen die Situation ziemlich ähnlich, aber unsere Schlussfolgerungen sind völlig gegensätzlich. Ich stimme zu, die Situation mit Unicode ist kompliziert, aber das ist der Grund, warum wir (Perl-Benutzer und Programmierer) eine Schicht (oder ein Pragma) brauchen, die den Umgang mit UTF-8 so einfach macht, wie er heutzutage sein muss.

tchrist auf zu viele Aspekte hinweisen, um sie zu behandeln, werde ich tagelang oder sogar wochenlang lesen und darüber nachdenken. Doch das ist nicht mein Anliegen. tchrist versucht zu beweisen, dass es nicht nur einen einzigen Weg gibt, "UTF-8 zu aktivieren". Ich habe nicht so viel Wissen, um das zu bestreiten. Also bleibe ich bei Live-Beispielen.

Ich habe herumgespielt mit Rakudo und UTF-8 war einfach da wie ich es brauchte . Ich hatte keine Probleme, es hat einfach funktioniert. Vielleicht gibt es einige Einschränkungen irgendwo tiefer, aber am Anfang funktionierte alles, was ich getestet habe, wie ich erwartet hatte.

Sollte das nicht auch ein Ziel in modernem Perl 5 sein? Ich betone es noch mehr: Ich schlage nicht UTF-8 als Standard-Zeichensatz für den Perl-Kern vor, sondern die Möglichkeit, ihn zu aktivieren mit einem Ruck für diejenigen, die sich entwickeln nouveau Projekte.

Ein weiteres Beispiel, aber mit einem eher negativen Ton. Frameworks sollen die Entwicklung erleichtern. Vor einigen Jahren habe ich Web-Frameworks ausprobiert, sie aber einfach weggeworfen, weil "UTF-8 aktivieren" so obskur war. Ich habe nicht herausgefunden, wie und wo ich die Unicode-Unterstützung einbinden kann. Es war so zeitaufwändig, dass ich es einfacher fand, den alten Weg zu gehen. Jetzt habe ich gesehen, dass es hier ein Kopfgeld gibt, um das gleiche Problem zu lösen mit Maurer 2: Wie kann man Mason2 UTF-8 sauber machen? . Es handelt sich also um ein ziemlich neues Framework, aber seine Verwendung mit UTF-8 erfordert tiefes Wissen über seine Interna. Es ist wie ein großes rotes Schild: STOP, benutze mich nicht!

Ich mag Perl sehr. Aber der Umgang mit Unicode ist schmerzhaft. Ich renne immer noch gegen Wände. Irgendwie tchrist ist richtig und beantwortet meine Fragen: neue Projekte ziehen UTF-8 nicht an, weil es in Perl 5 zu kompliziert ist.

4 Stimmen

Hallo Leute - es gibt ein paar Anzeichen, die auf diese Kommentare hinweisen. Ich habe einen Schnappschuss der Kommentare hier gemacht und sie in diesen Chatroom gestellt, wo ihr die Diskussion weiterführen könnt: chat.stackoverflow.com/rooms/846/

16 Stimmen

Es tut mir leid, aber ich stimme @tchrist zu - UTF-8 ist extrem schwierig. Es gibt kein Framework oder Tool, das einfach "einen Schalter umlegt" und es dann richtig handhabt. Das ist etwas, worüber man direkt nachdenken muss, wenn man seine Anwendung entwirft - nichts, was irgendein Framework oder eine Sprache für einen erledigen kann. Wenn rakudo nur zufällig für Sie funktioniert hat, waren Sie nicht abenteuerlich genug mit Ihren Testfällen -- denn es wird mehrere der Beispiele in @tchrist's Antwort nehmen und dann ausschlachten.

12 Stimmen

Was genau erhoffen Sie sich von Moose oder Modern::Perl? Auf magische Weise zufällig kodierte Zeichendaten in Dateien und Datenbanken wieder in gültige Daten verwandeln?

10voto

geekosaur Punkte 55917

Es gibt eine wirklich erschreckende Menge an altem Code da draußen in der Wildnis, vieles davon in Form von CPAN-Modulen. Ich habe festgestellt, dass ich ziemlich vorsichtig sein muss, wenn ich Unicode aktiviere, wenn ich externe Module verwende, die davon betroffen sein könnten, und ich versuche immer noch, einige Unicode-bezogene Fehler in mehreren Perl-Skripten, die ich regelmäßig verwende, zu identifizieren und zu beheben (insbesondere, iTiVo scheitert bei allem, was nicht 7-Bit-ASCII ist, aufgrund von Transkodierungsproblemen).

0 Stimmen

Ich meinte die Verwendung des -C Option, um sicherzustellen, dass Perl auf derselben Seite steht wie ich, was Unicode angeht, denn es entscheidet sich immer wieder, ISO 8859/1 statt Unicode zu verwenden, obwohl ich explizit die $LANG y $LC_ALL richtig. (Möglicherweise handelt es sich dabei um Fehler in den Locale-Bibliotheken der Plattform.) Wie auch immer, es ist äußerst ärgerlich, dass ich iTivo nicht für Programme mit Akzenten verwenden kann, weil die Perl-Skripte, die die Arbeit erledigen, mit Konvertierungsfehlern umfallen.

3 Stimmen

Eine einsame -C ohne Optionen ist fehlerhaft und fehleranfällig . Sie brechen die Welt. Setze die PERL5OPT nehmbar an -C und Sie werden sehen, was ich meine. Wir haben dies bereits in Version 5.8 versucht, und es war eine Katastrophe. Man kann und darf Programmen, die das nicht erwarten, einfach nicht sagen, dass sie es jetzt mit Unicode zu tun haben, ob sie es wollen oder nicht. Es gibt auch Sicherheitsprobleme. Zumindest sollte alles, was die print while <> bricht ab, wenn binäre Daten übergeben werden. Das gilt auch für den gesamten Datenbankcode. Das ist eine schreckliche Idee.

1 Stimmen

Ich habe eigentlich ganz allgemein gesprochen, nicht speziell. -C ohne Optionen. Der spezifische Aufruf, mit dem ich gearbeitet habe, war -CSDA . Allerdings hing ich lange Zeit mit 5.8.x fest (hallo MacPorts...), also ist das vielleicht war Teil davon.

2voto

rurban Punkte 3830

Sie sollten die Funktion für Unicode-Zeichenfolgen aktivieren, und dies ist die Standardeinstellung, wenn Sie v5.14 verwenden;

Sie sollten nicht wirklich Unicode-Bezeichner verwenden, insbesondere nicht für fremden Code über utf8, da sie in perl5 unsicher sind, nur cperl hat das richtig gemacht. Siehe z.B.. http://perl11.org/blog/unicode-identifiers.html

Bezüglich utf8 für Ihre Filehandles/Streams: Sie müssen die Kodierung Ihrer externen Daten selbst bestimmen. Eine Bibliothek kann das nicht wissen, und da nicht einmal libc utf8 unterstützt, sind richtige utf8-Daten selten. Es gibt mehr wtf8, die Windows-Abweichung von utf8.

BTW: Moose ist nicht wirklich "Modern Perl", sie haben nur den Namen gekapert. Moose ist perfektes postmodernes Perl im Larry-Wall-Stil, gemischt mit Bjarne Stroustrup-Stil, mit einer eklektischen Abweichung von der korrekten Perl6-Syntax, z.B. der Verwendung von Strings für Variablennamen, einer schrecklichen Fields-Syntax und einer sehr unausgereiften naiven Implementierung, die 10x langsamer ist als eine korrekte Implementierung. cperl und perl6 sind die wahren modernen Perls, bei denen die Form der Funktion folgt und die Implementierung reduziert und optimiert ist.

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X