POD2-IT

 view release on metacpan or  search on metacpan

IT/perluniintro.pod  view on Meta::CPAN

carattere", il concetto di "carattere" E<egrave> molto piE<ugrave>
deterministico. In questo documento, assumiamo questo secondo punto di
vista: un "carattere" E<egrave> un code point Unicode, sia un
carattere base o un carattere da combinare.

Per alcune combinazioni, esistono caratteri I<precombinati>.  C<LATIN
CAPITAL LETTER A WITH ACUTE> ("lettera A latina maiuscola con accento
acuto", NdT), ad esempio, E<egrave> definito come singolo code
point. Questi caratteri precombinati, comunque, esistono solo per
alcune combinazioni, e sono previsti principalmente per supportare
conversioni avanti-e-indietro tra Unicode e standard precedenti (come
ad esempio i vari ISO 8859). Nel caso generale, il metodo di
composizione E<egrave> piE<ugrave> estendibile. Per supportare
conversioni tra i vari modi di comporre i caratteri, sono state
definite varie I<forme di normalizzazione> ("I<normalization forms>"
in inglese, NdT) per produrre rappresentazioni uniformi.

Per mantenere la compatibilitE<agrave> con le codifiche precedenti,
l'idea di "un numero unico per ciascun carattere" non si realizza del
tutto: invece, c'E<egrave> "almeno un numero per ciascun
carattere". Lo stesso carattere potrebbe essere rappresentato in modo
diverso in diverse codifiche. Neppure l'inverso E<egrave> sempre vero:
alcuni code point non hanno un corrispondente carattere assegnato. In
primo luogo, esistono code point non allocati all'interno di blocchi
altrimenti usati. In secondo luogo, ci sono speciali caratteri di
controllo Unicode che non rappresentano veri e propri "caratteri".

Un'idea diffusa relativamente a Unicode sostiene che sia "a 16 bit",
ovvero, che Unicode sia rappresentato da C<0x10000> (ovvero 65536)
caratteri, da C<0x0000> a C<0xFFFF>. B<< CiE<ograve> E<egrave>
falso. >> A partire dalla versione 2.0 (Luglio 1996), Unicode
E<egrave> stato definito fino a 21 bit (C<0x10FFFF>), e dalla versione
3.1 (Marzo 2001) sono stati definiti caratteri oltre C<0xFFFF>. I
primi C<0x10000> caratteri sono chiamati il I<Piano 0>, o I<Basic
Multilingual Plane> (BMP). Con Unicode 3.1, sono definiti in totale 17
piani, anche se ancora non sono affatto pieni di caratteri definiti.

Un'altra idea diffusa E<egrave> che i blocchi di 256 caratteri abbiamo
qualcosa a che vedere con le lingue -- che ciascun blocco definisca i
caratteri usati in una lingua o insieme di lingue.  B<< Neanche questo
E<egrave> vero. >> La divisione in blocchi esiste, ma E<egrave> quasi
del tutto accidentale -- un effetto collaterale del modo con cui i
caratteri sono stati, e sono ancora, allocati. Invece, esiste il
concetto di I<script>, che E<egrave> molto piE<ugrave> utile:
c'E<egrave> lo script C<Latin>, lo script C<Greek>, et cetera.  Gli
script di solito coprono varie parti di diversi blocchi. Per maggiori
informazioni, leggete L<Unicode::UCD>.

I code point Unicode sono soltanto numeri, astratti. Per essere
comunicati, questi numeri devono essere I<codificati> ("I<encoded>" in
inglese, NdT) o I<serializzati> in qualche modo. Unicode definisce
svariate I<forme di codifica dei caratteri>, di cui I<UTF-8> E<egrave>
forse la piE<ugrave> nota.  UTF-8 E<egrave> una codifica a lunghezza
variabile che rappresenta i caratteri Unicode come sequenze da 1 a 6
byte (se ci si limita ai caratteri attualmente definiti ne bastano
4). Altre codifiche sono UTF-16 e UTF-32, e le loro varianti
big-endian e little-endian (UTF-8 E<egrave> invariante). Lo standard
ISO/IEC 10646 definisce le forme UCS-2 e UCS-4.

Per ulteriori informazioni sulle codifiche -- ad esempio, per sapere
cosa sono i I<surrogati> e i I<byte order marks> (BOM) -- leggete
L<perlunicode>.

=head2 Il supporto Unicode in Perl

A partire da Perl 5.6.0, Perl ha avuto la capacitE<agrave> di gestire
nativamente Unicode. Ad ogni modo, Perl 5.8.0 E<egrave> la minima
versione raccomandata per lavorare seriamente con Unicode. La versione
di manutenzione 5.6.1 ha corretto molti dei problemi della prima
implementazione di Unicode, ma ad esempio le espressioni regolari
ancora non funzionano con Unicode nella 5.6.1.

B<< A partire da Perl 5.8.0, l'uso di C<use utf8> non E<egrave>
piE<ugrave> necessario. >> In versione precedenti la direttiva C<utf8>
era usata per dichiarare che le operazioni del blocco o file corrente
avrebbero dovuto tener conto di Unicode. Si E<egrave> scoperto che
questo modello era sbagliato, o quantomeno scomodo: la
"UnicoditE<agrave>" E<egrave> ora associata ai dati, anzichE<eacute>
alle operazioni. Resta solo un caso in cui serve un esplicito C<use
utf8>: se il vostro stesso script Perl E<egrave> codificato in UTF-8,
potete usare caratteri Unicode negli identificatori, nelle costanti
stringa e nelle espressioni regolari, scrivendo C<use utf8>. Questo
non E<egrave> il comportamento predefinito perchE<eacute> script
salvati in altre codifiche a 8 bit (ad esempio ISO 8859-1)
provocherebbero errori. Cfr. L<utf8>.

=head2 Il modello Unicode di Perl

Perl supporta sia stringhe di caratteri nativi a 8 bit, come prima
della 5.6, che stringhe di caratteri Unicode. Il principio E<egrave>
che Perl tenta di mantenere i dati come byte piE<ugrave> a lungo
possibile, ma quando non E<egrave> piE<ugrave> possibile evitare la
"UnicoditE<agrave>", i dati vengono automaticamente convertiti in
Unicode.

Internamente, al momento, Perl usa la codifica a 8 bit nativa della
piattaforma (ad esempio Latin-1), qualunque essa sia, usando UTF-8 per
codificare le stringhe Unicode. In particolare, se tutti i code point
nella stringa sono minori di C<0xFF>, Perl usa la codifica a 8 bit
nativa. Altrimenti usa UTF-8.

Un utente di Perl normalmente non deve preoccuparsi di come Perl
codifichi internamente le stringhe, ma ciE<ograve> diventa rilevante
quando si scrivono stringhe Unicode in un canale ("stream", NdT) senza
uno strato PerlIO -- un canale con la codifica predefinita. In questo
caso, i byte della codifica interna (quella nativa, o UTF-8, a seconda
della stringa), vengono usati pari pari, e verrE<agrave> emesso un
avvertimento di "Wide character" se tali stringhe contengono caratteri
oltre C<0xFF>.

Ad esempio,

      perl -e 'print "\x{DF}\n", "\x{0100}\x{DF}\n"'              

produce una mistura piuttosto inutile di byte in codifica nativa e
UTF-8, oltre che un avvertimento:

     Wide character in print at ...

Per emettere UTF-8, usate lo strato C<:utf8>. Inserendo



( run in 1.017 second using v1.01-cache-2.11-cpan-5a3173703d6 )