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?
2 Stimmen
@Billy ONeal: Wenn ich die @tchrist-Liste überfliege, gibt es nicht das eine und einzige Heilmittel. Ich stimme zu. Dennoch gibt es eine gemeinsame Ebene der UTF-8-Behandlung, die gerade so pluggbar ist und die Entwicklern hilft, ins Spiel zu kommen. Ich denke, das Wissen in diesem neuen Modul
utf8::all
ist ein sehr guter Anfang. Wenn es (oder eine ähnliche Funktionalität) in Kern undperluniintro
es als Schnellstart vorschlagen, wäre viel besser.0 Stimmen
@jrockway: Was ist der Zweck von Modern::Perl? Reduktion von Boilerplate und Einführung von Best Practices der heute in Perl verfügbaren Technologien. Einschließlich UTF-8 Handhabung passt hier sehr gut, IMHO. Ähnlich bei Moose: es ist ein modernes Objektsystem für Perl. Warum also nicht einen weiteren Schritt machen und UTF-8 als Standardzeichensatz in Moose einbauen?
15 Stimmen
Was soll das bedeuten? Moose hat nichts mit Textmanipulation zu tun. Warum sollte es etwas über die Zeichenkodierung wissen, geschweige denn eine Standardkodierung für Sie auswählen? (Wie auch immer, der Grund, warum die Pragmas, die Sie auflisten, die Kodierung nicht berühren, ist, dass die Konvention für Perl-Pragmas ist, sich auf lexikalisch Verhalten. Die Annahme, dass die gesamte Welt, einschließlich anderer Module, UTF-8 ist, ist einfach falsch. Dies ist nicht PHP oder Ruby hier.)
9 Stimmen
(Auch ... "die meisten Modern Perl Anwendungen" brechen bei UTF-8? Ich habe sicherlich noch nie eine Anwendung geschrieben, weder Perl noch andere, die nicht Unicode-sauber ist).
15 Stimmen
Nb. tchrist (Tom Christiansen) hat seine [ ausbildung.perl.com/OSCON2011/index.html Tom Christiansens Materialien für die OSCON 2011] über Unicode. Das Material mit dem Titel "Unicode Support Shootout: The Good, The Bad, & the (mostly) Ugly" behandelt die Unicode-Unterstützung in verschiedenen Programmiersprachen. Nur Google Go und Perl5 bieten volle Unicode-Unterstützung, nur Google Go ist integriert (Perl6 wird nicht erwähnt).
0 Stimmen
Bezieht sich Ihre Frage speziell auf ein bestimmtes Betriebssystem? Die meistgewählte Antwort scheint Linux-spezifisch zu sein. Oder zumindest spezifisch für andere Unices als MacOS X.
0 Stimmen
@hippietrail: Ich arbeite hauptsächlich mit Linux, aber ich habe viele UTF-8-bezogene Perl-Fragen auch für Win gesehen. Ich habe zu wenig Kenntnisse über MacOS X, aber soweit ich weiß, sollten die gleichen Fragen auch für Mac aktuell sein. Wenn nicht, bin ich froh darüber und freue mich darauf, bald mit Perl auf dem Mac zu arbeiten.
6 Stimmen
Wenn ich mich auf einem POSIX-System befinde und
ENV['LC_ALL']
z.B. auf "en_US.UTF-8" gesetzt ist, dann ist das eine explizite Absichtserklärung, die Perl honorieren sollte, indem es annimmt, dass seine Standardeingabe als UTF-8 kodiert ist, und seine Standardausgabe ebenso kodiert. Wenn mein Code nicht funktioniert, weil er einige der vielen Feinheiten von Unicode nicht beherrscht, sollte ich ihn vielleicht nicht in einer Umgebung laufen lassen, die behauptet sein Unicode. Ich verstehe nicht, warum Perl die Locale-Einstellungen ignorieren sollte zugunsten dessen, was auch immer der Standard ist.0 Stimmen
Ich habe nicht viel darüber nachgedacht, aber utf8::all scheint für meine grundlegenden Bedürfnisse zu funktionieren. FWIW, ich denke, die Art der (öffentlichen) Einfachheit der utf-8 Verwendung in Java ist etwas, das Perl enorm profitieren könnte.
1 Stimmen
Ich weiß, das ist ein wenig off-topic und trolly, aber warum nicht loswerden anachronistischen Sprachen wie Perl und PHP und nur Python verwenden und haben Unicode der Standard sein. Um in eine bestimmte Kodierung zu konvertieren, tun Sie
'string'.encode('utf-8')
(Sie erhaltenb'string'
) und um diese binäre Zeichenkette wieder in Unicode zu konvertieren, tun Sieb'string'.decode('utf-8')
(Sie erhalten'string'
). Jetzt können Sie aufhören, darüber nachzudenken. Das wäre meine Art, die Dinge im Jahr 2019 zu erledigen. Alt zu sein bedeutet in der Regel, stabil zu sein, aber es bedeutet oft auch, dass man hässliche Dinge nicht loswird (das betrifft natürlich auch Python).1 Stimmen
@Nils Denn wenn man sich um die Kodierung und Dekodierung binärer Bitmuster kümmern muss, macht man es falsch. UTF-8 ist nichts anderes als eine Kodierung, und Sie sollten sich niemals Gedanken über die einzelnen, bytegroßen Codeeinheiten machen müssen. Sie sollten höchstens über abstrakte Codepunkte nachdenken - und nicht darüber, ob sie groß- oder klein-endlich sind :) Kodierung und Dekodierung sollten praktisch immer an den Grenzen der Schnittstellenschichten für den Austausch mit externen Einheiten stattfinden. Vertrauen Sie mir, die Intrakonvertierung von Codepunkten mit Bitmustern ist die am wenigsten Ihrer Sorgen, wenn es um Unicode geht.
2 Stimmen
@tchrist Ich bin mir nicht sicher, ob ich Ihren Standpunkt verstehe. Python verwendet intern überall Unicode und es gibt keinen Grund, sich über Bits und Bytes Gedanken zu machen. len('aou') == len('äöü') == len(''). Wenn ein Modul keine Kodierungsdeklaration hat, nimmt Python utf-8 an und dekodiert es in Unicode. Die Windows-Dateisystem- und Konsolenkodierung wurde in v3.6 auf UTF-8 umgestellt. Alle relevanten python 3 Bibliotheken kodieren in utf-8 und verwenden intern unicode. Nur wenn open() Dateien im Textmodus ohne den Kodierungsparameter öffnet (was keine Bibliothek tut), wird Python immer noch locale.getpreferredencoding() bevorzugen.
3 Stimmen
Das wird sich in Perl 7 ändern .