¿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
/STDOUT
etc. 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 [...]
¿Qué quiere decir que el comando 'echo' no es independiente de la configuración regional? – tchrist
'$ LANG = ja_JP.sjis bash $ echo -n フ | uniquote -b ¥ x83t $ echo -n フ | hex0000 83 74' contra '$ LANG = de_AT.UTF-8 bash $ echo -n フ | uniquote -b \ xE3 \ x83 \ x95 $ echo -n フ | hex0000 e3 83 95' – daxim