2012-02-29 8 views
18

Qual è il modo corretto di scrivere one-liner con riconoscimento Unicode in Perl? Il modo ovvio:Scrittura di one-liner con riconoscimento Unicode in Perl

$ echo 'フーバー' | perl -lne 'print if /フ/' 
フーバー 

... sembra un pò per lavorare a prima vista, ma questo è solo un incidente: l'Unicode viene interpretato come byte come illustrato nell'esempio seguente:

$ echo 'フーバー != フウバー' | perl -mString::Diff=diff -lne 'print join(" ", diff($1, $2)) if /(.*)!=(.*)/'                     => 29 
フ?[??]バー[ ] { }フ?{??}バー 

Usando solo la bandiera -C per impostare la STDIN/STDOUTecc a UTF-8 non è sufficiente di per sé:

$ echo 'フーバー' | perl -C -lne 'print if /フ/' 
[no output] 

... perché ora il testo in -e non viene interpretato come Unicode.

Quindi questa è la strada da percorrere (assumendo una LOCALE sano di mente - che è, uno in forma "*.UTF‑8") come questo:

$ perl -C -Mutf8 [...] 

risposta

16

Sì, il caricamento del utf8 pragma è tenuto ad interpretare il “” sequenza UTF-8 nel codice sorgente come carattere invece come byte separati.

L'interruttore della riga di comando Perl -C e il pragma utf8 sono indipendenti dalla locale, ma il comando echo della shell non lo è.

+0

Cosa vuoi dire se il comando 'echo' non è indipendente dalla locale? – tchrist

+0

'$ LANG = ja_JP.sjis bash␤ $ echo -n フ | uniquote -b␤ ¥ x83t␤ $ echo -n フ | hex␤0000 83 74' vs. '$ LANG = de_AT.UTF-8 bash␤ $ echo -n フ | uniquote -b␤ \ xE3 \ x83 \ x95␤ $ echo -n フ | hex␤0000 e3 83 95' – daxim

7

Mi piace usare utf8::all se ho bisogno di gestire unicode

echo 'フーバー' | perl -Mutf8::all -lne 'print if /フ/' 

PS. utilizzando -C è necessario anche dare flag specifici anche, per quanto ne so

+5

[ '-C' da solo (non seguito da un numero qualsiasi o l'opzione lista) (...) ha lo stesso effetto di' -CSDL'.] (Http://p3rl.org/run#*-C-%5b_number%2flist_%5d*) – daxim

+0

Il motivo del downvoting è? (@daxim: grazie per averlo chiarito) –

+0

Grazie - quel modulo sembra utile; Peccato che non ci sia un modo altrettanto semplice e chiaro per ottenere lo stesso effetto. –

0

in Windows 7:

chcp 65001 
perl -M"charnames':full'" -E "say qq{I \N{HEAVY BLACK HEART} PSGI.}" 
Problemi correlati