• 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-05-08 18:45 @822

℞ 20: Tamaño de caja en Unicode

La gestión del tamaño de caja en Unicode es muy diferente del de ASCII. Algo de la complejidad de Unicode viene del hecho de que los caracteres Unicode pueden cambiar dramáticamente cuando cambian de mayúsculas a minúsculas y al revés. Por ejemplo, el Griego tiene dos caracteres sigma minúscula, dependiendo de cuando la letra está en el medio (σ) o en el final (ς) de una palabra. El Griego solo tiene una sigma mayúscula (Σ). (Algunos textos clásicos griegos del periodo Heleno usan una variante de forma creciente de sigma llamada sigma lunate, o ϲ).

El tamaño de caja es importante para cuando se necesita cambiarlo y para realizar coincidencia sensible al tamaño de caja:
Sintáxis: [ Descargar ] [ Ocultar ]
Using perl Syntax Highlighting
  1.  uc("henry ⅷ")  # "HENRY Ⅷ"
  2.  uc("tschüß")   # "TSCHÜSS"  note ß => SS
  3.  
  4.  # ambos son verdad:
  5.  "tschüß"  =~ /TSCHÜSS/i   # note ß => SS
  6.  "Σίσυφος" =~ /ΣΊΣΥΦΟΣ/i   # note la igualdad de Σ,σ,ς
Coloreado en 0.002 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

Publicidad

Re: 44 recetas para trabajar con Unicode en Perl

Notapor explorer » 2012-05-09 17:05 @753

℞ 21: Comparaciones Unicode insensibles al tamaño de caja

Unicode es más que un juego de caracteres expandido. Unicode es un conjunto de reglas sobre cómo los caracteres se comportan y un conjunto de propiedades de cada carácter.

Comparando cadenas de caracteres para ver su equivalencia, a menudo requiere normalizadas a una forma estándar. Esta forma normalizada a menudo requiere que todos los caracteres estén en un tamaño de caja específico. ℞ 20: Tamaño de caja en Unicode demuestra que convertir entre mayúsculas y minúsculas de caracteres Unicode es más complicado que simplemente trasladar [A-Z] a [a-z]. (¡Recuerde también que muchas caracteres tiene una forma para los titulares!).

La solución más limpia para las comparaciones normalizadas es realizar un plegado de caja en lugar de trasladar un subconjunto de caracteres en otro. Perl v5.16 añadió una nueva característica: fc(), o "foldcase", para realizar el plegado de caja Unicode tal como el modificador de patrones /i siempre ha hecho. Esta característica está disponible esta disponible para otros Perl gracias al módulo de CPAN Unicode::CaseFold:
Sintáxis: [ Descargar ] [ Ocultar ]
Using perl Syntax Highlighting
  1.  use feature "fc"; # fc() es función desde v5.16
  2.  # O
  3.  use Unicode::CaseFold;
  4.  
  5.  # ordenación insensible al tamaño de caja
  6.  my @ordenado = sort { fc($a) cmp fc($b) } @lista;
  7.  
  8.  # ambas son ciertas:
  9.  fc("tschüß")  eq fc("TSCHÜSS")
  10.  fc("Σίσυφος") eq fc("ΣΊΣΥΦΟΣ")
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-10 19:30 @854

℞ 22: Buscando secuencias de ruptura de línea Unicode con expresiones regulares

Unicode define varios caracteres que proporcionan un espacio en blanco vertical, como el retorno de carro o los caracteres de nueva línea. Unicode también reúne varios caracteres bajo la bandera de una secuencia de ruptura de línea. Una ruptura de línea Unicode coincide con el grafema de dos caracteres CRLF o con cualquiera de los siete caracteres de espacio en blanco verticales.

Como se documenta en perldoc perlrebackslash, la secuencia de expresión regular \R coincide con cualquier secuencia Unicode de ruptura de línea. (De forma similar, la secuencia \v coincide con cualquier carácter de espacio en blanco vertical).

Esto es útil para manejarse con ficheros de texto que viene de diferentes sistemas operativos:
Sintáxis: [ Descargar ] [ Ocultar ]
Using perl Syntax Highlighting
  1.  s/\R/\n/g;  # normalizar todas las rupturas de línea a \n
Coloreado en 0.002 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-13 16:20 @722

℞ 23: Obtener la categoría de un carácter

Unicode es un conjunto de caracteres y una lista de reglas y propiedades aplicadas a estos caracteres. La Base de datos de Caracteres Unicode reúne estas propiedades. El módulo principal Unicode::UCD ofrece acceso a estas propiedades.

Estas propiedades generales agrupan los caracteres en grupos, como caracteres en mayúscula, minúscula, símbolos de puntuación, símbolos matemáticos, y más. (Vea general_categories() de Unicode::UCD, para más información).

La función charinfo() devuelve una referencia a un hash conteniendo abundante información sobre el carácter Unicode carácter en cuestión. En particular, el valor de 'category' contiene el nombre abreviado de la categoría del carácter.

Para encontrar la categoría general de un código de carácter numérico:
Sintáxis: [ Descargar ] [ Ocultar ]
Using perl Syntax Highlighting
  1. use Unicode::UCD qw(charinfo);
  2. my $cat = charinfo(0x3A3)->{category};  # "Lu"
Coloreado en 0.001 segundos, usando GeSHi 1.0.8.4

Para traducir esta categoría en algo más amigable:
Sintáxis: [ Descargar ] [ Ocultar ]
Using perl Syntax Highlighting
  1. use Unicode::UCD qw( charinfo general_categories );
  2. my $categories = general_categories();
  3. my $cat        = charinfo(0x3A3)->{category};  # "Lu"
  4. my $full_cat   = $categories{ $cat }; # "UppercaseLetter" (Mayúscula)
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-14 16:49 @742

℞ 24: Desactivar la consideración Unicode de las clases de caracteres incorporadas

Muchos manuales de expresiones regulares pasan por alto el hecho de que las clases de caracteres incorporadas incluyen mucho más que los caracteres ASCII. En particular, las clases como "carácter de palabra" (\w), "límite de palabra" (\b), "espacio en blanco" (\s) y "dígito" (\d) respetan la norma Unicode.

Perl 5.14 añade el modificador de expresiones regulares /a para desactivar el funcionamiento Unicode en \w, \b, \s, \d, y las clases POSIX. Restringe estas clases a que solo coincidan con caracteres ASCII. Use el pragma re para restringir estas clases en un ámbito léxico:
Sintáxis: [ Descargar ] [ Ocultar ]
Using perl Syntax Highlighting
  1.  use v5.14;
  2.  use re "/a";
Coloreado en 0.001 segundos, usando GeSHi 1.0.8.4

... o use el modificador /a para afectar a solo una expresión regular:
Sintáxis: [ Descargar ] [ Ocultar ]
Using perl Syntax Highlighting
  1.  my($num) = $str =~ /(\d+)/a;
Coloreado en 0.001 segundos, usando GeSHi 1.0.8.4

Siempre puede especificar propiedades Unicode, como \p{ahex} y \p{POSIX_Digit}. Las propiedades siguen trabajando normalmente sin importar qué conjunto de modificadores (/d /u /l /a /aa) estén en activo.

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-17 14:20 @639

℞ 25: Usar propiedades Unicode en expresiones regulares con \p, \P

Cada código de carácter Unicode tiene una o más propiedades, indicando las reglas que se aplican a ese código de carácter. El motor de expresiones regulares de Perl conoce estas propiedades; use la secuencia metacarácter \p{} para coincidir con un código de carácter que posea esta propiedad, y a la inversa, \P{} para coincidir con la ausencia de esta propiedad en el código de carácter.

Cada propiedad tiene un nombre corto y nombre largo. Por ejemplo, para coincidir con cualquier código de carácter que tenga la propiedad Letter, puede usar \p{Letter} o \p{L}. De forma similar, puede usar \P{Uppercase} o \P{Upper}. La sección "Unicode Character Properties" (Propiedades de los Caracteres Unicode) en el documento perldoc perlunicode describe estas propiedades con mayor detalle.

Ejemplos de estas propiedades útiles en expresiones regulares:
Sintáxis: [ Descargar ] [ Ocultar ]
Using text Syntax Highlighting
 \pL, \pN, \pS, \pP, \pM, \pZ, \pC
 \p{Sk}, \p{Ps}, \p{Lt}
 \p{alpha}, \p{upper}, \p{lower}
 \p{Latin}, \p{Greek}
 \p{script=Latin}, \p{script=Greek}
 \p{East_Asian_Width=Wide}, \p{EA=W}
 \p{Line_Break=Hyphen}, \p{LB=HY}
 \p{Numeric_Value=4}, \p{NV=4}
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-05-18 21:12 @925

℞ 26: Propiedades de caracteres personalizadas

La receta ℞ 25 explicaba que todo carácter Unicode tiene una o más propiedades, especificadas por el consorcio Unicode. Puede extender esta regla para definir sus propias propiedades para que Perl las pueda usar.

Una propiedad personalizada es una función cuyo nombre comienza con In o Is, y que retorna una cadena conforme a un formato especial. La sección "Propiedades de caracteres definidas por el usuario" de perldoc perlunicode describe este formato con más detalle.

Para definir en tiempo de compilación sus propias propiedades de caracteres personalizadas para usar en exp. reg.:
Sintáxis: [ Descargar ] [ Ocultar ]
Using perl Syntax Highlighting
  1.  # usando caracteres de uso privado
  2.  sub In_Tengwar { "E000\tE07F\n" }
  3.  
  4.  if (/\p{In_Tengwar}/) { ... }
  5.  
  6.  # mezclando con las propiedades existentes
  7.  sub Is_GraecoRoman_Title {<<'END_OF_SET'}
  8.  +utf8::IsLatin
  9.  +utf8::IsGreek
  10.  &utf8::IsTitle
  11.  END_OF_SET
  12.  
  13.  if (/\p{Is_GraecoRoman_Title}/ { ... }
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-18 21:29 @937

℞ 27: Normalización Unicode

La prescripción 1 le recordaba que siempre ha de descomponer y recomponer datos Unicode en las fronteras de su aplicación. Unicode::Normalize puede hacer mucho más por usted. Soporta múltiples Formas de Normalización Unicode.

Normalización, naturalmente, toma datos Unicode de formas arbitrarias y las canoniza a una representación estándar. (Donde un carácter complejo puede estar compuesto de múltiples caracteres, la normalización en la descomposición ajusta estos caracteres en un orden canónico. La composición Normalizada combina estos caracteres a un único carácter compuesto, cuando sea posible. Sin esta normalización, puede imaginar la dificultad de determinar cuándo una cadena es lógicamente equivalente a otra).

Típicamente, debería mostrar sus datos en NFD (la forma de descomposición canónica) en la entrada y en NFC (descomposición canónica seguido por una composición canónica) en la salida. Usar las funciones NFKC o NFKD mejora las prestaciones en las búsquedas, asumiendo que haya hecho la misma normalización al texto a ser localizado.

Note que esta normalización es más que solo dividir y unir precombinados glifos compatibles; también reordena marcas de acuerdo a las clases de combinación canónica y poda a los que queden sueltos.
Sintáxis: [ Descargar ] [ Ocultar ]
Using perl Syntax Highlighting
  1.  use Unicode::Normalize;
  2.  my $nfd  = NFD($orig);
  3.  my $nfc  = NFC($orig);
  4.  my $nfkd = NFKD($orig);
  5.  my $nfkc = NFKC($orig);
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-21 17:07 @754

℞ 28: Convertir valores numéricos Unicode no-ASCII

Los dígitos Unicode abarcan mucho más que los caracteres ASCII 0 - 9.

A menos que haya usado /a o /aa, \d coincide con muchos más caracteres que solo los dígitos ASCII. ¡Eso es bueno! Desafortunadamente, la conversión de Perl implícita de cadena a número, actualmente, no reconoce dígitos Unicode. Aquí indicaremos cómo convertir estas cadenas de forma manual.

Como de costumbre, el módulo Unicode::UCD ofrece acceso a la base de datos de caracteres Unicode. Su función num() puede convertir en número los dígitos Unicode y cadenas de dígitos Unicode.
Sintáxis: [ Descargar ] [ Ocultar ]
Using perl Syntax Highlighting
  1.  use v5.14;  # necesario para la función num()
  2.  use Unicode::UCD qw(num);
  3.  my $cadena = "tengo Ⅻ y ४५६७ y ⅞ y así";
  4.  my @numeros = ();
  5.  while (/$cadena =~ (\d+|\N)/g) {  # ¡No solo ASCII!
  6.     push @numeros, num($1);
  7.  }
  8.  say "@numeros";   #     12      4567      0.875
  9.  
  10.  use charnames qw(:full);
  11.  my $nv = num("\N{RUMI DIGIT ONE}\N{RUMI DIGIT TWO}");
Coloreado en 0.001 segundos, usando GeSHi 1.0.8.4

Como advierte la documentación de num(), la función falla en el lado de la seguridad. No todas las colecciones de dígitos Unicode forman números válidos. Puede, entonces, considerar normalizar cadenas complejas Unicode (℞ 27) antes de convertirlas a número.

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-23 18:55 @830

℞ 29: Coincidir con agrupaciones de grafemas Unicode en exp.reg.

En los días del ASCII, hablábamos de caracteres y bytes. Vimos pocas diferencias entre ellos. En el mundo Unicode, los caracteres tienen bastante más que siete bits de datos. Mucho mejor para hablar de colecciones de bytes en crudo y caracteres, o incluso código de carácter Unicode.

Los "caracteres" visibles para el programador son códigos de carácter que coinciden con /./s, pero los "caracteres" visibles para el usuario son los grafemas que coinciden con /\X/.

Es decir, el metacarácter de exp.reg. \X coincide con lo que Unicode llama "agrupación de grafema extendido". Donde el usuario puede ver un simple carácter (como una consonante con tilde), la representación Unicode puede ser la consonante, más alguna combinación de caracteres, más la marca de la tilde. Use \X para coincidir con la secuencia entera:
Sintáxis: [ Descargar ] [ Ocultar ]
Using perl Syntax Highlighting
  1.  # Busca vocal *más* cualquier combinación con diacrítico, subrayado, etc.
  2.  my $nfd = NFD($original);
  3.  $nfd =~ / (?=[aeiou]) \X /xi
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

AnteriorSiguiente

Volver a Avanzado

¿Quién está conectado?

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