• 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.

44 recetas para trabajar con Unicode en Perl

Notapor explorer » 2012-04-02 18:49 @826

Perl.com comienza la publicación de las 44 recetas que Tom Christiansen creó para trabajar con Unicode en Perl 5.
Esta es una traducción de esas publicaciones.




℞ 0: Preámbulo estándar

A menos que se indique lo contrario, todos los ejemplos de este recetario requieren este preámbulo estándar para funcionar correctamente, con el #! ajustado a su sistema:

Sintáxis: [ Descargar ] [ Ocultar ]
Using perl Syntax Highlighting
  1. #!/usr/bin/env perl
  2.  
  3. use utf8;      # los literales e identificadores pueden estar en UTF-8
  4. use v5.12;     # o siguientes, para activar la característica "unicode_strings"
  5. use strict;    # entrecomilla las cadenas de caracteres, declara las variables
  6. use warnings;  # activado por defecto
  7. use warnings  qw(FATAL utf8);    # advertencia fatal en caso de fallos de codificación
  8. use open      qw(:std :utf8);    # flujos no declarados, en UTF-8
  9. use charnames qw(:full :short);  # no necesarios en v5.16
  10.  
Coloreado en 0.013 segundos, usando GeSHi 1.0.8.4

Esto obligará, incluso a los programadores de Unix, a hacer binmode sobre flujos binarios, o abrirlos con :raw, pero es la única forma de acceder a ellos de una forma portátil.

ATENCIÓN: use autodie y use open no se llevan bien, el uno con el otro.

Esta combinación de características pone a Perl en un conocido estado de compatibilidad Unicode y rigor estricto, para que las siguientes operaciones se comporten como se espera.

Artículo original (en inglés)
JF^D Perl Programming Language
Avatar de Usuario
explorer
Administrador
Administrador
 
Mensajes: 12608
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-04 18:37 @817

℞ 1: filtro genérico de comprensión Unicode

Unicode permite múltiples representaciones de los mismos caracteres. Comparar estas cadenas por su equivalencia (ordenar, buscar, coincidencia exacta) requiere cuidado, incluyendo una estrategia coherente y consistente para normalizar estas representaciones a formas suficientemente conocidas. Presentamos Unicode::Normalize.

Para manejar Unicode eficientemente, siempre descomponga a la entrada, y luego recomponga a la salida.
Sintáxis: [ Descargar ] [ Ocultar ]
Using perl Syntax Highlighting
  1.  use Unicode::Normalize;
  2.  
  3.  while (<>) {
  4.      $_ = NFD($_);   # descomponer + reordenar canónicamente
  5.      ...
  6.  } continue {
  7.      print NFC($_);  # recomponer (donde sea posible) + reordenar canónicamente
  8.  }
Coloreado en 0.005 segundos, usando GeSHi 1.0.8.4

Vea el FAQ sobre Normalización Unicode para más detalles.

Artículo original (en inglés)
JF^D Perl Programming Language
Avatar de Usuario
explorer
Administrador
Administrador
 
Mensajes: 12608
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-07 15:53 @703

℞ 2: Ajuste fino de las advertencias Unicode

Es fácil equivocarse con Unicode, especialmente cuando se maneja entradas desde el usuario y tratando con múltiples codificaciones. Perl estará encantado en ayudarle a detectar condiciones inesperadas de sus datos. Perl también estará encantado de permitirle decidir si estas condiciones inesperadas merecen la pena ser advertidas.

A partir de v5.14, Perl distingue tres subclases de advertencias UTF-8. Mientras que ya existía la categoría léxica de advertencias utf8 antes de 5.14, ahora puede manejar estas advertencias individualmente:
Sintáxis: [ Descargar ] [ Ocultar ]
Using perl Syntax Highlighting
  1.  use v5.14;                  # subadvertencias no disponibles en versiones anteriores
  2.  no warnings "nonchar";      # los 66 no-caracteres prohibidos
  3.  no warnings "surrogate";    # UTF-16/CESU-8 sin sentido
  4.  no warnings "non_unicode";  # para códigos de carácter superiores a 0x10_FFFF
Coloreado en 0.005 segundos, usando GeSHi 1.0.8.4

Artículo original (en inglés)
JF^D Perl Programming Language
Avatar de Usuario
explorer
Administrador
Administrador
 
Mensajes: 12608
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-07 16:03 @710

℞ 3: Declare el fuente en UTF-8 para los identificadores y literales

Sin poner la -siempre- criticada declaración use utf8, meter UTF-8 en sus literales e identificadores no funcionará correctamente. Si está usando el preámbulo Unicode Perl estándar (℞ 0), sí que funcionará bien. Si lo hace, puede hacer cosas como esta:

Sintáxis: [ Descargar ] [ Ocultar ]
Using perl Syntax Highlighting
  1. use utf8;
  2.  
  3.  my $medida   = "Ångström";
  4.  my @μsoft     = qw( cp852 cp1251 cp1252 );
  5.  my @ὑπέρμεγας = qw( ὑπέρ  μεγας );
  6.  my @鯉        = qw( koi8-f koi8-u koi8-r );
Coloreado en 0.005 segundos, usando GeSHi 1.0.8.4

Si olvida use utf8, los bytes superiores serán malinterpretados como caracteres individuales, y nada funcionará bien. Recuerde que este pragma solo afecta a la interpretación de UTF-8 literal en su código fuente.

Artículo original (en inglés)
JF^D Perl Programming Language
Avatar de Usuario
explorer
Administrador
Administrador
 
Mensajes: 12608
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-09 17:59 @791

℞ 4: Caracteres y sus números

¿Necesita trasladar un código de carácter a un carácter o un carácter a su código de carácter? Las funciones ord y chr trabajan transparentemente con todos los códigos de carácter, no solo con ASCII, ni siquiera solo con Unicode.
Sintáxis: [ Descargar ] [ Ocultar ]
Using perl Syntax Highlighting
  1.  # caracteres ASCII
  2.  ord("A")
  3.  chr(65)
  4.  
  5.  # caracteres del Plano multilingual básico
  6.  ord("Σ")
  7.  chr(0x3A3)
  8.  
  9.  # más allá de ese plano
  10.  ord("n")               # MATHEMATICAL ITALIC SMALL N
  11.  chr(0x1D45B)
  12.  
  13.  # ¡más allá de Unicode! (hasta el MAXINT)
  14.  ord("\x{20_0000}")
  15.  chr(0x20_0000)
Coloreado en 0.006 segundos, usando GeSHi 1.0.8.4

(Recuerde activar el preámbulo estándar de Unicode Perl para usar UTF-8 en cadenas literales en su código fuente y para codificar la salida adecuadamente).

Artículo original (en inglés)
JF^D Perl Programming Language
Avatar de Usuario
explorer
Administrador
Administrador
 
Mensajes: 12608
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-10 15:38 @693

℞ 5: Literales Unicode por número de carácter

En un literal interpolado, bien sea una cadena de caracteres con comillas dobles, o una expresión regular, puede especificar un carácter por su número usando el escape \x{HHHHHH}.

Sintáxis: [ Descargar ] [ Ocultar ]
Using text Syntax Highlighting
 Cadena: "\x{3a3}"
 Regex:  /\x{3a3}/

 Cadena: "\x{1d45b}"
 Regex:  /\x{1d45b}/

 # funciona bien incluso en rangos que no son del Plano Básico Multilingual
 /[\x{1D434}-\x{1D467}]/
Coloreado en 0.000 segundos, usando GeSHi 1.0.8.4

El BMP (o Basic Multilingual Plane -Plano Básico Multlingual-, o Plano 0) contiene los caracteres Unicode más normales; cubre desde 0x0000 hasta 0xFFFD. Caracteres en otros planos son mucho más especializados. A menudo incluyen caracteres de interés histórico.

Use las tablas Unicode para encontrar los números de los caracteres, o vea la receta ℞ 4 para traducir caracteres a números, y viceversa.

Artículo original (en inglés)
JF^D Perl Programming Language
Avatar de Usuario
explorer
Administrador
Administrador
 
Mensajes: 12608
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-15 12:34 @565

℞ 6: Obtener el nombre de un carácter a partir de su número

Unicode le permite referirse a los caracteres por número o por nombre. A los ordenadores no les importa, pero a los humanos, sí. Cuando tenga un número de carácter, puede traducirlo a su nombre con el pragma charnames:

Sintáxis: [ Descargar ] [ Ocultar ]
Using perl Syntax Highlighting
  1. use charnames ();
  2. my $name = charnames::viacode(0x03A3);
Coloreado en 0.004 segundos, usando GeSHi 1.0.8.4

charnames::viacode() devuelve el nombre Unicode completo del código de carácter indicado- en el ejemplo, GREEK CAPITAL LETTER SIGMA-. Puede incluir esto como una cadena literal en su código fuente como "\N{GREEK CAPITAL LETTER SIGMA}".

Use charnames::string_vianame() para convertir un nombre Unicode al carácter Unicode correcto, en tiempo de ejecución.

Artículo original (en inglés)
JF^D Perl Programming Language
Avatar de Usuario
explorer
Administrador
Administrador
 
Mensajes: 12608
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-16 16:46 @740

℞ 7: Obtener el número de un carácter a partir de su nombre

Unicode le permite referirse a los caracteres por número o por nombre. A los ordenadores no les importa, pero a los humanos, sí. Cuando tenga un nombre de carácter, puede traducirlo a su número con el pragma charnames:

Sintáxis: [ Descargar ] [ Ocultar ]
Using perl Syntax Highlighting
  1. use charnames ();
  2. my $number = charnames::vianame("GREEK CAPITAL LETTER SIGMA");
Coloreado en 0.004 segundos, usando GeSHi 1.0.8.4

Esto es, por supuesto, lo opuesto a la receta ℞ 6.

Ver la receta ℞ 4 para traducir este número al carácter apropiado.

Artículo original (en inglés)
JF^D Perl Programming Language
Avatar de Usuario
explorer
Administrador
Administrador
 
Mensajes: 12608
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-16 17:11 @757

℞ 8: Nombres de caracteres Unicode

Use la notación \N{charname} para obtener el carácter correspondiente a ese nombre para ser usado en la interpolación de literales (dobles comillas y expresiones regulares). En v5.16, existe un implícito
Sintáxis: [ Descargar ] [ Ocultar ]
Using perl Syntax Highlighting
  1. use charnames qw(:full :short);
Coloreado en 0.004 segundos, usando GeSHi 1.0.8.4

Pero antes de v5.16, debe explicitar qué conjunto de caracteres quiere. Los nombres :full son los nombres, alias o secuencias de caracteres Unicode officiales, compartiendo todos el mismo espacio de nombres.
Sintáxis: [ Descargar ] [ Ocultar ]
Using perl Syntax Highlighting
  1. use charnames qw(:full :short latin greek);
  2.  
  3. "\N{MATHEMATICAL ITALIC SMALL N}"      # :full
  4. "\N{GREEK CAPITAL LETTER SIGMA}"       # :full
Coloreado en 0.005 segundos, usando GeSHi 1.0.8.4

Cualquier otra cosa es una abreviatura por conveniencia específica de Perl. Especifique una o más nombres de etiquetas si quiere usar nombres abreviados.
Sintáxis: [ Descargar ] [ Ocultar ]
Using perl Syntax Highlighting
  1. "\N{Greek:Sigma}"                      # :short
  2. "\N{ae}"                               #  latin
  3. "\N{epsilon}"                          #  greek
Coloreado en 0.005 segundos, usando GeSHi 1.0.8.4

La versión de Perl v5.16 también soporta una etiqueta :loose para poder especificar nombres de caracteres de forma difusa, que funciona como la coincidencia difusa de los nombres de propiedades, es decir, no tiene en cuanta las mayúsculas/minúsculas, espacios en blanco y guiones bajos:
Sintáxis: [ Descargar ] [ Ocultar ]
Using perl Syntax Highlighting
  1. "\N{euro sign}"                        # :loose (a partir de v5.16)
Coloreado en 0.004 segundos, usando GeSHi 1.0.8.4

(No tiene por qué usar el pragma charnames para interpolar caracteres Unicode por número dentro de los literales con la secuencia \N{...}).

Artículo original (en inglés)
JF^D Perl Programming Language
Avatar de Usuario
explorer
Administrador
Administrador
 
Mensajes: 12608
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-17 13:22 @599

℞ 9: Nombres de secuencias Unicode

Unicode incluye la característica de nombres de secuencias de caracteres, que combina múltiple caracteres Unicode bajo un solo nombre. El pragma charnames permite el uso de nombres de secuencias en literales, de la misma manera a como permite el uso de nombres de caracteres Unicode en literales (ver receta ℞ 8).

En Perl, estos nombres de secuencias aparecen como nombres de caracteres pero devuelven múltiples códigos de carácter. Fíjese en el comportamiento de la impresión de vectores %vx de printf:
Sintáxis: [ Descargar ] [ Ocultar ]
Using perl Syntax Highlighting
  1. use charnames qw(:full);
  2. my $seq = "\N{LATIN CAPITAL LETTER A WITH MACRON AND GRAVE}";
  3. printf "U+%v04X\n", $seq;  # U+0100.0300
Coloreado en 0.005 segundos, usando GeSHi 1.0.8.4

Mientras cada versión de Unicode puede actualizar la lista oficial de nombres de secuencias, la última versión del archivo de datos Unicode Named Sequences está siempre disponible. Perl 5.14 soporta Unicode 6.0, y Perl 5.16 soportará Unicode 6.1.

Artículo original (en inglés)
JF^D Perl Programming Language
Avatar de Usuario
explorer
Administrador
Administrador
 
Mensajes: 12608
Registrado: 2005-07-24 18:12 @800
Ubicación: Valladolid, España

Siguiente

Volver a Avanzado

¿Quién está conectado?

Usuarios navegando por este Foro: No hay usuarios registrados visitando el Foro y 0 invitados