Die perldoc
Seite für length() sagt mir, dass ich bytes::length(EXPR)
verwenden sollte, um eine Unicode-Zeichenfolge in Bytes zu finden, und die bytes-Seite echo dies.Wie finde ich die Länge einer Unicode-Zeichenfolge in Perl?
use bytes;
$ascii = 'Lorem ipsum dolor sit amet';
$unicode = 'Lørëm ípsüm dölör sît åmét';
print "ASCII: " . length($ascii) . "\n";
print "ASCII bytes: " . bytes::length($ascii) . "\n";
print "Unicode: " . length($unicode) . "\n";
print "Unicode bytes: " . bytes::length($unicode) . "\n";
Die Ausgabe dieses Skripts jedoch nicht mit der Man-Page:
ASCII: 26
ASCII bytes: 26
Unicode: 35
Unicode bytes: 35
Es scheint mir, Länge() und Bytes :: Länge() geben die gleiche für beide ASCII & Unicode-Strings . Ich habe meinen Editor so eingestellt, dass Dateien standardmäßig als UTF-8 geschrieben werden, also denke ich, dass Perl das ganze Skript als Unicode interpretiert - bedeutet das, dass length() Unicode-Strings automatisch korrekt behandelt?
Bearbeiten: Siehe meinen Kommentar; meine Frage macht nicht viel Sinn, denn length() ist nicht funktioniert "richtig" im obigen Beispiel - es zeigt die Länge der Unicode-Zeichenfolge in Bytes, nicht Zeichen. Der Resonator, über den ich ursprünglich gestolpert bin, ist für ein Programm, in dem ich den Content-Lenth-Header (in Bytes) in einer HTTP-Nachricht setzen muss. Ich hatte in Perl über Unicode gelesen und rechnete damit, dass ich etwas Geschick machen musste, um die Dinge zum Laufen zu bringen, aber als length() genau das zurückgab, was ich rechts vom Schläger brauchte, war ich verwirrt! Siehe die akzeptierte Antwort für eine Übersicht über use utf8
, use bytes
und no bytes
in Perl.
Ich sehe nicht, warum Sie die Länge sagen() richtig Unicode-Strings behandelt. In Ihrem Beispiel gibt length() dasselbe Ergebnis wie bytes :: length() an, das ist die Anzahl der Bytes, nicht die Anzahl der Zeichen (was richtig wäre). – Inshallah
Mit anderen Worten interpretiert Länge ($ Unicode) die Zeichenfolge als ASCII, nicht als Unicode. – Inshallah
Sie sind absolut richtig! Ich hatte diese Tatsache völlig übersehen - in meinem Programm verwende ich length(), um den Content-Length-Header in einer HTTP-Nachricht zu setzen, die in Bytes sein muss. die Länge() docs Nach der Lektüre, ich habe erwartet, dass die Funktion etwas falsch zurück, aber es ist genau in der Tat, was ich will, wenn Perl ist in 'verwenden bytes' Modus: die Länge des Unicode-String in Bytes, anstatt Zeichen. –