• Publicidad

44 recetas para trabajar con Unicode en Perl

Así que programas sin strict y las expresiones regulares son otro modo de hablar. Aquí encontrarás respuestas de nivel avanzado, no recomendable para los débiles de corazón.

Re: 44 recetas para trabajar con Unicode en Perl

Notapor explorer » 2012-04-20 16:11 @716

℞ 10: Nombres de caracteres personalizados

Como muchas otras recetas demuestran, el pragma charnames ofrece un considerable poder a la hora de usar y manipular caracteres Unicode a partir de sus nombres. Su opción :alias le permite crear nombres con ámbito léxico, a caracteres actuales, o incluso dar nombres útiles a caracteres de uso privado que no lo tengan:
Sintáxis: [ Descargar ] [ Ocultar ]
Using perl Syntax Highlighting
  1.  use charnames ":full", ":alias" => {
  2.      ecute => "LATIN SMALL LETTER E WITH ACUTE",
  3.      "APPLE LOGO" => 0xF8FF, # carácter de uso privado
  4.  };
  5.  
  6.  "\N{ecute}"
  7.  "\N{APPLE LOGO}"
Coloreado en 0.004 segundos, usando GeSHi 1.0.8.4

Puede sobreescribir los nombres actuales (léxicamente, claro) con diferentes caracteres.

Esta característica tiene algunas limitaciones. Para un mejor efecto, los alias deben ceñirse a las reglas de los identificadores ASCII y no deben parecerse a los cuantificadores de expresiones regulares. Solo puede crear un alias para un carácter cada vez; existen otras opciones para crear un alias a una secuencia de caracteres.

Como siempre, la documentación del pragma charnames ofrece más detalles.

Artículo original (en inglés)
JF^D Perl programming & Raku programming. Grupo en Telegram: https://t.me/Perl_ES
Avatar de Usuario
explorer
Administrador
Administrador
 
Mensajes: 14475
Registrado: 2005-07-24 18:12 @800
Ubicación: Valladolid, España

Publicidad

Re: 44 recetas para trabajar con Unicode en Perl

Notapor explorer » 2012-04-21 09:23 @433

℞ 11: Nombres de códigos de carácter CJK

CJK se refiere a Chino, Japonés y Coreano. En el contexto de Unicode, normalmente se refiere a los ideogramas Han usados en el Chino moderno y sistemas de escritura Japonés. Como es de esperar, los lenguajes pictóricos como el Chino, hace la gestión Unicode más compleja.

Sinogramas como "東京" devuelven nombres de caracteres de CJK UNIFIED IDEOGRAPH-6771 y CJK UNIFIED IDEOGRAPH-4EAC, porque sus "nombres" varían entre los lenguajes. El módulo de CPAN Unicode::Unihan tiene una gran base de datos para decodificarles (a estos y a mucho más), siempre que sea capaz de entender su salida.
Sintáxis: [ Descargar ] [ Ocultar ]
Using perl Syntax Highlighting
  1.  # cpan -i Unicode::Unihan
  2.  use Unicode::Unihan;
  3.  my $str   = "東京";
  4.  my $unhan = Unicode::Unihan->new;
  5.  for my $lang (qw(Mandarin Cantonese Korean JapaneseOn JapaneseKun)) {
  6.      printf "CJK $str in %-12s is ", $lang;
  7.      say $unhan->$lang($str);
  8.  }
Coloreado en 0.001 segundos, usando GeSHi 1.0.8.4
imprime:
Sintáxis: [ Descargar ] [ Ocultar ]
Using text Syntax Highlighting
 CJK 東京 in Mandarin     is DONG1JING1
 CJK 東京 in Cantonese    is dung1ging1
 CJK 東京 in Korean       is TONGKYENG
 CJK 東京 in JapaneseOn   is TOUKYOU KEI KIN
 CJK 東京 in JapaneseKun  is HIGASHI AZUMAMIYAKO
Coloreado en 0.000 segundos, usando GeSHi 1.0.8.4

Si tiene en mente un esquema específico de romanización, use el módulo específico:
Sintáxis: [ Descargar ] [ Ocultar ]
Using perl Syntax Highlighting
  1.  # cpan -i Lingua::JA::Romanize::Japanese
  2.  use Lingua::JA::Romanize::Japanese;
  3.  my $k2r = Lingua::JA::Romanize::Japanese->new;
  4.  my $str = "東京";
  5.  say "Japanese for $str is ", $k2r->chars($str);
Coloreado en 0.001 segundos, usando GeSHi 1.0.8.4
imprime:
Sintáxis: [ Descargar ] [ Ocultar ]
Using text Syntax Highlighting
 Japanese for 東京 is toukyou
Coloreado en 0.000 segundos, usando GeSHi 1.0.8.4


Artículo original (en inglés)
JF^D Perl programming & Raku programming. Grupo en Telegram: https://t.me/Perl_ES
Avatar de Usuario
explorer
Administrador
Administrador
 
Mensajes: 14475
Registrado: 2005-07-24 18:12 @800
Ubicación: Valladolid, España

Re: 44 recetas para trabajar con Unicode en Perl

Notapor explorer » 2012-04-23 18:35 @816

℞ 12: De/codificación explícita

Mientras que el preámbulo Unicode Perl estándar hace que los gestores de archivos de Perl use la codificación UTF-8 por defecto, los gestores de archivo no son las únicas fuentes y sumideros de datos. En ciertas ocasiones, como al leer de una base de datos, puede recibir texto codificado que necesitará decodificar.

El módulo principal Encode ofrece dos funciones para manejar estas conversiones. (Recuerde que decode() significa convertir octetos, de una codificación conocida, a la forma Unicode interna de Perl; y decode() significa convertir de la forma interna de Perl a una codificación conocida).
Sintáxis: [ Descargar ] [ Ocultar ]
Using perl Syntax Highlighting
  1. use Encode qw(encode decode);
  2.  
  3. # a partir de unos $bytes, conteniendo octetos de una codificación conocida
  4. my $cars = decode("shiftjis", $bytes, 1);
  5.  
  6. # a partir de unos $cars, que son una cadena codificada en el formato interno de Perl
  7. my $bytes = encode("MIME-Header-ISO_2022_JP", $chars, 1);
Coloreado en 0.001 segundos, usando GeSHi 1.0.8.4

Para flujos que tengan la misma codificación, no use encode/decode; en su lugar active la codificación cuando abra el archivo o, inmediatamente después con binmode, tal y como se describe en una receta posterior. Recuerde la regla canónica de Unicode: siempre de/codifique en las fronteras de su aplicación.

Artículo original (en inglés)
JF^D Perl programming & Raku programming. Grupo en Telegram: https://t.me/Perl_ES
Avatar de Usuario
explorer
Administrador
Administrador
 
Mensajes: 14475
Registrado: 2005-07-24 18:12 @800
Ubicación: Valladolid, España

Re: 44 recetas para trabajar con Unicode en Perl

Notapor explorer » 2012-04-26 12:24 @558

℞ 13: Decodificar los argumentos del programa en utf8

Mientras que el preámbulo Unicode Perl estándar hace que los gestores de archivos usen la codificación UTF-8 por defecto, los gestores de archivo no son las únicas fuentes y destinos de datos. Los argumentos en la línea de comandos de sus programas, disponibles a través de @ARGV, también pueden necesitar ser decodificados.

Puede hacer que Perl maneje esta operación por si solo automáticamente, de dos formas distintas; y una más, usted mismo, de forma manual. Como se documenta en perldoc perlrun, la opción -C controla las características Unicode. Use el modificador A para que Perl trate a sus argumentos como cadenas UTF-8:
Sintáxis: [ Descargar ] [ Ocultar ]
Using bash Syntax Highlighting
$ perl -CA ...
Coloreado en 0.002 segundos, usando GeSHi 1.0.8.4

Puede, naturalmente, usar -C en la línea shebang de sus programas.

La segunda forma es usar la variable de entorno PERL_UNICODE. Toma los mismos valores que la opción -C. Para obtener los mismos efectos que -CA, escriba:
Sintáxis: [ Descargar ] [ Ocultar ]
Using bash Syntax Highlighting
$ export PERL_UNICODE=A
Coloreado en 0.001 segundos, usando GeSHi 1.0.8.4

Puede desactivar temporalmente este tratamiento Unicode automático con PERL_UNICODE=0.

Finalmente, puede decodificar los contenidos de @ARGV usted mismo, de forma manual, con el módulo Encode:
Sintáxis: [ Descargar ] [ Ocultar ]
Using perl Syntax Highlighting
  1. use Encode qw(decode_utf8);
  2. @ARGV = map { decode_utf8($_, 1) } @ARGV;
Coloreado en 0.001 segundos, usando GeSHi 1.0.8.4


Artículo original (en inglés)
JF^D Perl programming & Raku programming. Grupo en Telegram: https://t.me/Perl_ES
Avatar de Usuario
explorer
Administrador
Administrador
 
Mensajes: 14475
Registrado: 2005-07-24 18:12 @800
Ubicación: Valladolid, España

Re: 44 recetas para trabajar con Unicode en Perl

Notapor explorer » 2012-04-27 06:29 @312

℞ 14: Decodificar los argumentos del programa según la codificación de la configuración regional

Mientras que lo más normal, en los modernos sistemas operativos, que sus argumentos de la línea de comandos estén codificados en UTF-8, @ARGV puede usar otras codificaciones. Si ha configurado su sistema con una configuración regional correcta, puede necesitar decodificar @ARGV adecuadamente. Y lo debe hacer de forma manual, a diferencia del decodificado automático de @ARGV en UTF-8.

Instale el módulo Encode::Locale desde CPAN:
Sintáxis: [ Descargar ] [ Ocultar ]
Using perl Syntax Highlighting
  1. # cpan -i Encode::Locale
  2. use Encode qw(locale);
  3. use Encode::Locale;
  4.  
  5. # use "locale" como un arg. a encode/decode
  6. @ARGV = map { decode(locale => $_, 1) } @ARGV;
Coloreado en 0.001 segundos, usando GeSHi 1.0.8.4


Artículo original (en inglés)
JF^D Perl programming & Raku programming. Grupo en Telegram: https://t.me/Perl_ES
Avatar de Usuario
explorer
Administrador
Administrador
 
Mensajes: 14475
Registrado: 2005-07-24 18:12 @800
Ubicación: Valladolid, España

Re: 44 recetas para trabajar con Unicode en Perl

Notapor explorer » 2012-04-27 19:49 @867

℞ 15: Declarar STD{IN,OUT,ERR} para que sean UTF-8

Siempre convierta hacia o desde su codificación deseada, en las fronteras de sus programas. Esto incluye a los gestores de archivos estándares STDIN, STDOUT, y STDERR.

Como se documenta en perldoc perlrun, la variable de entorno PERL_UNICODE o la opción en la línea de comandos -C permiten indicarle a Perl que de/codifique desde y hacia estos gestores de archivos, en UTF-8, con la opción S:
Sintáxis: [ Descargar ] [ Ocultar ]
Using bash Syntax Highlighting
$ perl -CS ...
# o
$ export PERL_UNICODE=S
Coloreado en 0.001 segundos, usando GeSHi 1.0.8.4

Dentro de su programa, el pragma open le permite indicar la codificación por defecto para estos gestores de archivos, todo de una vez:
Sintáxis: [ Descargar ] [ Ocultar ]
Using perl Syntax Highlighting
  1. use open qw(:std :utf8);
Coloreado en 0.001 segundos, usando GeSHi 1.0.8.4

Debido a que Perl usa capas E/S para implementar la codificación y decodificación, también puede usar el operador binmode sobre los gestores de archivo, directamente:
Sintáxis: [ Descargar ] [ Ocultar ]
Using perl Syntax Highlighting
  1. binmode(STDIN,  ":utf8");
  2. binmode(STDOUT, ":utf8");
  3. binmode(STDERR, ":utf8");
Coloreado en 0.001 segundos, usando GeSHi 1.0.8.4


Artículo original (en inglés)
JF^D Perl programming & Raku programming. Grupo en Telegram: https://t.me/Perl_ES
Avatar de Usuario
explorer
Administrador
Administrador
 
Mensajes: 14475
Registrado: 2005-07-24 18:12 @800
Ubicación: Valladolid, España

Re: 44 recetas para trabajar con Unicode en Perl

Notapor explorer » 2012-04-30 18:43 @821

℞ 16: Declarar STD{IN,OUT,ERR} para que estén codificados según la configuración regional

Siempre convierta hacia o desde su codificación deseada, en las fronteras de sus programas. Esto incluye a los gestores de archivos estándares STDIN, STDOUT, y STDERR. Mientras que lo más común, en los sistemas operativos modernos, es soportar UTF-8 en las configuraciones de los gestores de archivo, quizás puede necesitar otras codificaciones distintas.

Perl puede respetar sus actuales configuraciones regionales para sus gestores de archivo por defecto. Empiece instalando el módulo Encode::Locale desde CPAN.
Sintáxis: [ Descargar ] [ Ocultar ]
Using perl Syntax Highlighting
  1. # cpan -i Encode::Locale
  2. use Encode;
  3. use Encode::Locale;
  4.  
  5. # o como un flujo para binmode u open
  6. binmode STDIN,  ":encoding(console_in)"  if -t STDIN;
  7. binmode STDOUT, ":encoding(console_out)" if -t STDOUT;
  8. binmode STDERR, ":encoding(console_out)" if -t STDERR;
Coloreado en 0.001 segundos, usando GeSHi 1.0.8.4

El módulo Encode::Locale le permite usar "aquella codificación que la terminal asociada espera" para los gestores de archivo de entrada y salida asociados a los terminales. También le permite especificar "aquella codificación que el sistema de archivos usa para los nombres de archivos"; vea la documentación para más información.

Artículo original (en inglés)
JF^D Perl programming & Raku programming. Grupo en Telegram: https://t.me/Perl_ES
Avatar de Usuario
explorer
Administrador
Administrador
 
Mensajes: 14475
Registrado: 2005-07-24 18:12 @800
Ubicación: Valladolid, España

Re: 44 recetas para trabajar con Unicode en Perl

Notapor explorer » 2012-05-01 16:39 @735

℞ 17: Hacer la E/S por defecto a utf8

Si ha tenido la mala suerte de ver el aviso Unicode "wide character in print" (carácter ancho en impresión), quiere decir que se le olvidó configurar la apropiada codificación Unicode en el gestor de archivo, en algún lugar de su programa. Recuerde que la regla de manejo Unicode en Perl es "siempre de/codifique en las fronteras de su programa".

Puede fácilmente decodificar STDIN, STDOUT y STDERR como UTF-8 por defecto, o decodificar STDIN, STDOUT y STDERR según la configuración regional por defecto, o usar binmode para configurar la codificación en un gestor de archivo específico.

De otra manera, puede poner la codificación por defecto en todos los gestores de archivo a lo largo de todo el programa, o en contextos léxicos. Como se documenta en perldoc perlrun, están disponibles la opción -C y la variable de entorno PERL_UNICODE. Use la opción D para hacer que todos los gestores de archivos por defecto sigan la codificación UTF-8. Es decir, archivos abiertos sin un argumento de codificación serán en UTF-8:
Sintáxis: [ Descargar ] [ Ocultar ]
Using bash Syntax Highlighting
$ perl -CD ...
# o
$ export PERL_UNICODE=D
Coloreado en 0.001 segundos, usando GeSHi 1.0.8.4

El pragma open configura la codificación por defecto en todas las operaciones de gestores de archivos, en su ámbito léxico:
Sintáxis: [ Descargar ] [ Ocultar ]
Using perl Syntax Highlighting
  1. use open qw(:utf8);
Coloreado en 0.001 segundos, usando GeSHi 1.0.8.4

Note que el pragma open es, actualmente, incompatible con el pragma autodie.

Artículo original (en inglés)
JF^D Perl programming & Raku programming. Grupo en Telegram: https://t.me/Perl_ES
Avatar de Usuario
explorer
Administrador
Administrador
 
Mensajes: 14475
Registrado: 2005-07-24 18:12 @800
Ubicación: Valladolid, España

Re: 44 recetas para trabajar con Unicode en Perl

Notapor explorer » 2012-05-04 07:45 @365

℞ 18: Hacer que toda la E/S y argumentos trabajen por defecto en utf8

La regla principal del manejo Unicode en Perl es "siempre codifique y decodifique en las fronteras de su programa".

Si ha configurado todo de tal manera que todos los datos que entran y salen usen codificación UTF-8, puede hacer que Perl realice por usted la apropiada codificación y decodificación. Como se documenta en perldoc perlrun, la opción -C y la variable de entorno PERL_UNICODE están disponibles. Use la opción S para hacer que los gestores de archivo estándares de entrada, salida y error usen codificación UTF-8. Use la opción D para hacer que todos los gestores de archivos usen codificación UTF-8. Use la opción A para decodificar los elementos @ARGV como UTF-8:
Sintáxis: [ Descargar ] [ Ocultar ]
Using bash Syntax Highlighting
$ perl -CSDA ...
# or
$ export PERL_UNICODE=SDA
Coloreado en 0.001 segundos, usando GeSHi 1.0.8.4

Dentro de su programa, puede obtener los mismos efectos con el pragma open para establecer las codificaciones por defecto en los gestores de archivo y el módulo Encode para decodificar los elementos de @ARGV:
Sintáxis: [ Descargar ] [ Ocultar ]
Using perl Syntax Highlighting
  1. use open qw(:std :utf8);
  2. use Encode qw(decode_utf8);
  3. @ARGV = map { decode_utf8($_, 1) } @ARGV;
Coloreado en 0.001 segundos, usando GeSHi 1.0.8.4


Artículo original (en inglés)
JF^D Perl programming & Raku programming. Grupo en Telegram: https://t.me/Perl_ES
Avatar de Usuario
explorer
Administrador
Administrador
 
Mensajes: 14475
Registrado: 2005-07-24 18:12 @800
Ubicación: Valladolid, España

Re: 44 recetas para trabajar con Unicode en Perl

Notapor explorer » 2012-05-05 15:03 @669

℞ 19: Abrir archivo con una codificación específica

Mientras que es delicado configurar la codificación Unicode por defecto para E/S (℞ 17), algunas veces la codificación por defecto no es correcta. En ese caso, especifique manualmente la codificación para un gestor de archivo, en la opción de modo en open, o con el operador binmode. Las capas E/S de Perl manejarán por usted la codificación y decodificación. Esta es la forma normal de gestionar texto codificado, sin llamar a funciones de bajo nivel.

Para especificar la codificación de un gestor de archivo para la entrada:
Sintáxis: [ Descargar ] [ Ocultar ]
Using perl Syntax Highlighting
  1. open(my $in_archivo, "< :encoding(UTF-16)", "textowindows");
  2. # O
  3. open(my $in_archivo, "<", "textowindows");
  4. binmode($in_archivo, ":encoding(UTF-16)");
  5.  
  6. # ...
  7. my $linea = <$in_archivo>;
Coloreado en 0.001 segundos, usando GeSHi 1.0.8.4

Para especificar la codificación de un gestor de archivo para la salida:
Sintáxis: [ Descargar ] [ Ocultar ]
Using perl Syntax Highlighting
  1. open($out_archivo, "> :encoding(cp1252)", "textowindows");
  2. # O
  3. open(my $out_archivo, ">", "textowindows");
  4. binmode($out_archivo, ":encoding(cp1252)");
  5.  
  6. # ...
  7. print $out_archivo "algún texto\n";
Coloreado en 0.001 segundos, usando GeSHi 1.0.8.4

Aquí se pueden especificar más capas aparte de la de codificación. Por ejemplo, el conjuro ":raw :encoding(UTF-16LE) :crlf" incluye una gestión CRLF implícita. Ver PerlIO para más detalles.

Artículo original (en inglés)
JF^D Perl programming & Raku programming. Grupo en Telegram: https://t.me/Perl_ES
Avatar de Usuario
explorer
Administrador
Administrador
 
Mensajes: 14475
Registrado: 2005-07-24 18:12 @800
Ubicación: Valladolid, España

AnteriorSiguiente

Volver a Avanzado

¿Quién está conectado?

Usuarios navegando por este Foro: No hay usuarios registrados visitando el Foro y 1 invitado

cron