2012-02-29 8 views
18

¿Cuál es la forma correcta de escribir Unicod-aware one-liners en Perl? La manera obvia:escribiendo Unicade-aware one-liners en Perl

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

... un poco parece funcionar a primera vista, pero esto es sólo un accidente: el Unicode se interpreta como bytes como muestra el siguiente ejemplo:

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

Simplemente usando la bandera -C para ajustar el STDIN/STDOUTetc. a UTF-8 no es suficiente por sí mismo:

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

... porque ahora el texto en -e no se interpreta como Unicode.

Así que este es el camino a seguir (suponiendo un escenario en su sano juicio - es decir, una en forma "*.UTF‑8") así:

$ perl -C -Mutf8 [...] 

Respuesta

16

Sí, la carga de la utf8 pragma se requiere para interpretar el “” UTF-8 secuencia en el código fuente como un personaje más bien como bytes separados.

El modificador de línea de comandos Perl -C y la utf8 pragma son independiente de la Localidad, pero de comandos de la shell echo no lo es.

+0

¿Qué quiere decir que el comando 'echo' no es independiente de la configuración regional? – tchrist

+0

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

7

me gusta usar utf8::all si necesito para manejar Unicode

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

PS. utilizando -C también es necesario dar indicadores específicos también, que yo sepa

+5

[ '-C' por su propia cuenta (no seguido de cualquier número o la opción de la lista) (...) tiene el mismo efecto que' -CSDL'.] (Http://p3rl.org/run#*-C-%5b_number%2flist_%5d*) – daxim

+0

¿La razón de la votación negativa es? (@daxim: gracias por aclarar esto) –

+0

Gracias - ese módulo parece útil; Es una lástima que no haya una manera incorporada simple y clara de obtener el mismo efecto. –

0

en Windows 7:

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