Questa è una grande domanda. Per investigare, possiamo approfondire un po 'usando Devel::Peek per vedere cosa viene effettivamente memorizzato nelle nostre stringhe (o in altre variabili).
primo luogo permette di iniziare con una stringa ASCII
$ perl -MDevel::Peek -E 'Dump "string"'
SV = PV(0x9688158) at 0x969ac30
REFCNT = 1
FLAGS = (POK,READONLY,pPOK)
PV = 0x969ea20 "string"\0
CUR = 6
LEN = 12
Poi possiamo accendere unicode strati IO e fare lo stesso
$ perl -MDevel::Peek -CSAD -E 'Dump "string"'
SV = PV(0x9eea178) at 0x9efcce0
REFCNT = 1
FLAGS = (POK,READONLY,pPOK)
PV = 0x9f0faf8 "string"\0
CUR = 6
LEN = 12
Da lì Proviamo a aggiungere manualmente alcuni caratteri estesi
$ perl -MDevel::Peek -CSAD -e 'Dump "string \x{2665}"'
SV = PV(0x9be1148) at 0x9bf3c08
REFCNT = 1
FLAGS = (POK,READONLY,pPOK,UTF8)
PV = 0x9bf7178 "string \342\231\245"\0 [UTF8 "string \x{2665}"]
CUR = 10
LEN = 12
Da ciò si può chiaramente vedere che Perl l'ha interpretato correttamente come utf8. Il problema è che se non do gli ottetti utilizzando il \x{}
sfuggire la rappresentazione sembra più la stringa normale
$ perl -MDevel::Peek -CSAD -E 'Dump "string ♥"'
SV = PV(0x9143058) at 0x9155cd0
REFCNT = 1
FLAGS = (POK,READONLY,pPOK)
PV = 0x9168af8 "string \342\231\245"\0
CUR = 10
LEN = 12
Tutti Perl vede è byte e non ha modo di sapere che loro si intende come un carattere Unicode , a differenza di quando hai inserito gli ottetti sfuggiti sopra. Ora lascia usare decode
e vedere cosa succede
$ perl -MDevel::Peek -CSAD -MEncode=decode -E 'Dump decode "utf8", "string ♥"'
SV = PV(0x8681100) at 0x8683068
REFCNT = 1
FLAGS = (TEMP,POK,pPOK,UTF8)
PV = 0x869dbf0 "string \342\231\245"\0 [UTF8 "string \x{2665}"]
CUR = 10
LEN = 12
TADA!, ora puoi vedere che la stringa è correttamente rappresentata internamente corrispondente a ciò che hai inserito quando hai usato l'escape \x{}
.
La risposta effettiva è "decodifica" dai byte ai caratteri, ma penso che abbia più senso quando si visualizza l'output Peek.
Infine, è possibile effettuare il Perl si vede il codice sorgente come utf8 tramite utf8
pragma, in questo modo
$ perl -MDevel::Peek -CSAD -Mutf8 -E 'Dump "string ♥"'
SV = PV(0x8781170) at 0x8793d00
REFCNT = 1
FLAGS = (POK,READONLY,pPOK,UTF8)
PV = 0x87973b8 "string \342\231\245"\0 [UTF8 "string \x{2665}"]
CUR = 10
LEN = 12
['perldoc perlguts'] (http://perldoc.perl.org/perlguts.html) avrà alcune informazioni. Nota che le stringhe di solito non sono magiche; sembra che siano a volte. –
Grazie Jon, questa è la migliore risposta finora. perlguts sembra divertente.E credimi non credo nella magia, specialmente quando si tratta di Perl. – spinkus
Ho trovato [questo] (http://plosquare.blogspot.in/2009/04/viewing-internal-representation-of.html) anche utile. –