La pagina perldoc
per length() mi dice che dovrei usare bytes::length(EXPR)
per trovare una stringa Unicode in byte, oppure la pagina bytes echeggia questo.Come trovo la lunghezza di una stringa Unicode 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";
L'output di questo script, però, non è d'accordo con la pagina di manuale:
ASCII: 26
ASCII bytes: 26
Unicode: 35
Unicode bytes: 35
Mi sembra di lunghezza() e byte :: lunghezza() restituiscono lo stesso per entrambe le ASCII & stringhe Unicode . Il mio editore è impostato per scrivere file come UTF-8 di default, quindi immagino che Perl interpreti l'intero script come Unicode, cioè che length() gestisce automaticamente le stringhe Unicode in modo corretto?
Modifica: Vedere il mio commento; la mia domanda non ha molto senso, perché length() è non che funziona "correttamente" nell'esempio precedente - mostra la lunghezza della stringa Unicode in byte, non caratteri. Il reson che ho originariamente imbattuto in questo è per un programma in cui ho bisogno di impostare l'intestazione Content-Lenth (in byte) in un messaggio HTTP. Avevo letto su Unicode in Perl e mi aspettavo di dover fare un po 'di fanciness per far funzionare le cose, ma quando length() ha restituito esattamente quello di cui avevo bisogno a destra del pipistrello, ero confuso! Vedere la risposta accettata per una panoramica di use utf8
, use bytes
e no bytes
in Perl.
Non vedo perché dici che length() gestisce correttamente le stringhe Unicode. Nell'esempio length() restituisce lo stesso risultato di bytes :: length(), ovvero il numero di byte, non il numero di caratteri (che sarebbe corretto). – Inshallah
In altre parole, length ($ unicode) interpreta la stringa come ASCII, non come unicode. – Inshallah
Hai assolutamente ragione! Mi ero completamente dimenticato di questo fatto: nel mio programma, sto usando length() per impostare l'intestazione Content-Length in un messaggio HTTP, che deve essere in byte. Dopo aver letto i documenti length(), mi aspettavo che quella funzione restituisse qualcosa di non corretto, ma in realtà è esattamente ciò che voglio quando Perl è in modalità 'use bytes ': la lunghezza della stringa Unicode in byte, piuttosto che caratteri. –