• 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-06-12 02:46 @157

℞ 40: Comparación regional insensible al tamaño de caja y a los diacríticos

Ya sabe cómo comparar cadenas Unicode mientras ignora las diferencias en el tamaño de caja y de los diacríticos (℞ 39). Esta aproximación usa el algoritmo estándar de cotejo Unicode. Para realizar una comparación similar mientras se respete alguna regla específica de la configuración regional, use Unicode::Collate::Locale:
Sintáxis: [ Descargar ] [ Ocultar ]
Using perl Syntax Highlighting
  1.  my $de = Unicode::Collate::Locale->new(
  2.             locale => "de__phonebook",
  3.           );
  4.  
  5.  # ahora esto devuelve verdadero:
  6.  $de->eq("tschüß", "TSCHUESS");  # note que ü => UE, ß => SS
  7.  
Coloreado en 0.003 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: 14480
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-06-14 05:04 @253

℞ 41: Ruptura de líneas en Unicode

Si ha intentado ajustar una gran cantidad de texto dentro de una zona de pantalla demasiado estrecha para todo el ancho del texto, ha estado jugando con la ruptura de líneas (o ajuste de palabras). Tal como lo espera, ahora en Unicode, la especificación provee de un Algoritmo de ruptura de líneas Unicode (Unicode Line Breaking Algorithm) que respeta las oportunidades de ruptura de línea disponibles por el texto Unicode.

Los caracteres Unicode, naturalmente, pueden tener propiedades que influyen en estas reglas.

También, como cabría esperar de Perl, un módulo implementa el Unicode Line Breaking Algorithm. Instale Unicode::LineBreak. Este módulo respeta los puntos de ruptura directos e indirectos así como el ancho de los grafemas del texto. Su uso básico es sencillo:
Sintáxis: [ Descargar ] [ Ocultar ]
Using perl Syntax Highlighting
  1.  use Unicode::LineBreak;
  2.  use charnames qw(:full);
  3.  
  4.  my $para = "This is a super\N{HYPHEN}long string. " x 20;
  5.  my $fmt  = Unicode::LineBreak->new;
  6.  print $fmt->break($para), "\n";
Coloreado en 0.001 segundos, usando GeSHi 1.0.8.4

El resultado del método break() es un array de líneas partidas por puntos válidos. (El número máximo predeterminado de columnas es 76, así que este ejemplo funciona bien para correo electrónico y consola. Vea la documentación del módulo para otras opciones de configuració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: 14480
Registrado: 2005-07-24 18:12 @800
Ubicación: Valladolid, España

Re: 44 recetas para trabajar con Unicode en Perl

Notapor explorer » 2012-06-19 16:40 @736

℞ 42: Texto Unicode en hash DBM, forma tediosa

Mientras que Perl 5 tiene un gran cuidado sobre manejar Unicode correctamente dentro del mundo del propio Perl, cada vez que sale de las interioridades de Perl, está cruzando una barrera en la que quizás necesite que algo sea codificado o decodificado. Esto sucede cuando al realizar E/S a través de una red o en archivos, cuando se le habla a una base de datos, o incluso cuando se usa XS al usar una biblioteca compartida en Perl.

Por ejemplo, considere el módulo principal DB_File, que le permite usar los archivos Berkeley DB para el almacenamiento persistente en Perl de pares clave/valor.

Usar una cadena normal Perl como una clave o un valor para un hash DBM lanzará una excepción sobre que se ha encontrado un carácter ancho, si algún código de carácter no entra en un byte. Aquí está la manera de cómo gestionar manualmente la traslación:
Sintáxis: [ Descargar ] [ Ocultar ]
Using perl Syntax Highlighting
  1.  use DB_File;
  2.  use Encode qw(encode decode);
  3.  tie %dbhash, "DB_File", "ruta_al_archivo";
  4.  
  5.  # STORE
  6.  
  7.  # asumimos que $uni_clave y $uni_valor son cadenas Unicode abstractas
  8.  my $enc_clave = encode("UTF-8", $uni_clave, 1);
  9.  my $enc_valor = encode("UTF-8", $uni_valor, 1);
  10.  $dbhash{$enc_clave} = $enc_valor;
  11.  
  12.  # FETCH
  13.  
  14.  # asumimos que $uni_clave contiene una cadena normal Perl (Unicode abstracta)
  15.  my $enc_clave = encode("UTF-8", $uni_clave, 1);
  16.  my $enc_valor = $dbhash{$enc_clave};
  17.  my $uni_valor = decode("UTF-8", $enc_clave, 1);
Coloreado en 0.002 segundos, usando GeSHi 1.0.8.4

Realizando usted mismo de forma manual esta codificación y decodificación, sabe que su archivo de almacenamiento tendrá una representación consistente de sus datos. La codificación correcta depende del tipo de los datos que almacene y las capacidades del código externo, naturalmente.

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: 14480
Registrado: 2005-07-24 18:12 @800
Ubicación: Valladolid, España

Re: 44 recetas para trabajar con Unicode en Perl

Notapor explorer » 2012-06-20 19:33 @856

℞ 43: Texto Unicode en hash DBM, forma fácil

Algunas bibliotecas Perl requieren que pase a través del aro para manejar datos Unicode (℞ 42). ¡Ojalá todo funcionara tan fácilmente como el pragma open de Perl!

Para archivos DBM, aquí se muestra cómo gestionar implícitamente la traslación; todo el codificado y descodificado se realiza automáticamente, igual que si fueran flujos configurados con una codificación particular. El módulo DBM_Filter le permite aplicar filtros a las claves y valores para manipular sus contenidos antes de almacenarlos o recuperarlos. El módulo incluye un filtro "utf8". Úselo así:
Sintáxis: [ Descargar ] [ Ocultar ]
Using perl Syntax Highlighting
  1.  use DB_File;
  2.  use DBM_Filter;
  3.  
  4.  my $dbobj = tie %dbhash, "DB_File", "ruta_al_archivo";
  5.  $dbobj->Filter_Value_Push("utf8");  # este es el punto mágico
  6.  
  7.  # STORE
  8.  
  9.  # asumimos que $uni_clave y $uni_valor son cadenas Unicode abstractas
  10.  $dbhash{$uni_clave} = $uni_valor;
  11.  
  12.  # FETCH
  13.  
  14.  # $uni_clave contiene una cadena Perl normal (Unicode abstracta)
  15.  my $uni_valor = $dbhash{$uni_clave};
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: 14480
Registrado: 2005-07-24 18:12 @800
Ubicación: Valladolid, España

Re: 44 recetas para trabajar con Unicode en Perl

Notapor explorer » 2012-06-22 20:29 @895

℞ 44: PROGRAMA: Demo de cotejo Unicode e impresión

En las anteriores recetas hemos explicado cómo funciona Unicode y mostramos cómo usarlo en sus programas. Si ha seguido estas recetas, sabrá mucho más que la mayoría de los programadores.

¿Cómo poner todo esto junto?

Aquí hay un programa completo que muestra cómo hacer uso de la ordenación sensible a la configuración regional, tamaño de caja según Unicode, y gestión de la impresión de distintos anchos cuando alguno de los caracteres toman cero o dos columnas, no solo una columna cada vez. Cuando lo ejecute, el programa produce una bonita salida alineada (aunque la calidad de la alineación depende de la calidad de su fuente de letras Unicode, naturalmente):

Sintáxis: [ Descargar ] [ Ocultar ]
Using text Syntax Highlighting
    Crème Brûlée....... €2.00
    Éclair............. €1.60
    Fideuà............. €4.20
    Hamburger.......... €6.00
    Jamón Serrano...... €4.45
    Linguiça........... €7.00
    Pâté............... €4.15
    Pears.............. €2.00
    Pêches............. €2.25
    Smørbrød........... €5.75
    Spätzle............ €5.50
    Xoriço............. €3.00
    Γύρος.............. €6.50
    막걸리............. €4.00
    おもち............. €2.65
    お好み焼き......... €8.00
    シュークリーム..... €1.85
    寿司............... €9.99
    包子............... €7.50
Coloreado en 0.000 segundos, usando GeSHi 1.0.8.4

Aquí está el programa, testado en v5.14.
Sintáxis: [ Descargar ] [ Ocultar ]
Using perl Syntax Highlighting
  1.  #!/usr/bin/env perl
  2.  # umenu - demo de ordenación e impresión de comida Unicode
  3.  #
  4.  # (obligatorio y, cada vez más largo, preámbulo)
  5.  #
  6.  use utf8;
  7.  use v5.14;                       # para la ordenación según la configuración regional y unicode_strings
  8.  use strict;
  9.  use warnings;
  10.  use warnings  qw(FATAL utf8);    # hace fatales los fallos de codificación
  11.  use open      qw(:std :utf8);    # los flujos estándar de E/S, en UTF-8
  12.  use charnames qw(:full :short);  # innecesario en v5.16
  13.  
  14.  # módulos estándar
  15.  use Unicode::Normalize;          # estándar en la distribución perl v5.8
  16.  use List::Util qw(max);          # estándar en la distribución perl v5.10
  17.  use Unicode::Collate::Locale;    # estándar en la distribución perl v5.14
  18.  
  19.  # módulos cpan
  20.  use Unicode::GCString;           # desde CPAN
  21.  
  22.  # declaraciones previas
  23.  sub relleno($$$);
  24.  sub anchocol(_);
  25.  sub titula(_);
  26.  
  27.  my %precio = (
  28.      "γύρος"             => 6.50, # gyros, Griego
  29.      "pears"             => 2.00, # like um, pears
  30.      "linguiça"          => 7.00, # spicy sausage, Portuguese
  31.      "xoriço"            => 3.00, # chorizo sausage, Catalan
  32.      "hamburger"         => 6.00, # burgermeister meisterburger
  33.      "éclair"            => 1.60, # dessert, French
  34.      "smørbrød"          => 5.75, # sandwiches, Norwegian
  35.      "spätzle"           => 5.50, # Bayerisch noodles, little sparrows
  36.      "包子"              => 7.50, # bao1 zi5, steamed pork buns, Mandarin
  37.      "jamón serrano"     => 4.45, # country ham, Spanish
  38.      "pêches"            => 2.25, # peaches, French
  39.      "シュークリーム"    => 1.85, # cream-filled pastry like éclair, Japanese
  40.      "막걸리"            => 4.00, # makgeolli, Korean rice wine
  41.      "寿司"              => 9.99, # sushi, Japanese
  42.      "おもち"            => 2.65, # omochi, rice cakes, Japanese
  43.      "crème brûlée"      => 2.00, # tasty broiled cream, French
  44.      "fideuà"            => 4.20, # more noodles, Valencian (Catalan=fideuada)
  45.      "pâté"              => 4.15, # gooseliver paste, French
  46.      "お好み焼き"        => 8.00, # okonomiyaki, Japanese
  47.  );
  48.  
  49.  # busca el mayor ancho permitido para la columna del nombre
  50.  my $ancho = 5 + max map { anchocol } keys %precio;
  51.  
  52.  # So the Asian stuff comes out in an order that someone
  53.  # who reads those scripts won't freak out over; the
  54.  # CJK stuff will be in JIS X 0208 order that way.
  55.  my $cotejo  = Unicode::Collate::Locale->new( locale => "ja" );
  56.  
  57.  for my $item ($cotejo->sort(keys %precio)) {
  58.      print relleno(titula($item), $ancho, ".");
  59.      printf " €%.2f\n", $precio{$item};
  60.  }
  61.  
  62.  sub relleno($$$) {
  63.      my($cadena, $ancho, $rellenocar) = @_;
  64.      return $cadena . ($rellenocar x ($ancho - anchocol($cadena)));
  65.  }
  66.  
  67.  sub anchocol(_) {
  68.      my($cadena) = @_;
  69.      return Unicode::GCString->new($cadena)->columns;
  70.  }
  71.  
  72.  sub titula(_) {
  73.      my($cadena) = @_;
  74.      $cadena     =~ s{ (?=\pL)(\S)     (\S*) }
  75.                      { ucfirst($1) . lc($2)  }xge;
  76.      return $cadena;
  77.  }
Coloreado en 0.003 segundos, usando GeSHi 1.0.8.4

Suficientemente simple, ¿no es así? Poniéndolo junto, todo funciona bien.

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: 14480
Registrado: 2005-07-24 18:12 @800
Ubicación: Valladolid, España

Re: 44 recetas para trabajar con Unicode en Perl

Notapor explorer » 2012-07-01 09:27 @435

Esta serie le ha mostrado diversas características de Unicode a través de ejemplos, así como diversas técnicas para trabajar con Unicode correcta y fácilmente, con las recientes publicaciones de Perl 5. Ahora sabe más que muchos programadores en cómo trabajar con Unicode, pero su viaje a la maestría, continúa.

Perl 5 incluye diversas piezas de documentación que explican Unicode y el soporte de Unicode en Perl. Vea perlunicode, perluniprops, perlre, perlrecharclass, perluniintro, perlunitut y perlunifaq.

Perl 5 y CPAN ofrecen diversos módulos y distribuciones para un uso efectivo de Unicode. Igual que en Perl 5.16, muchos de estos están en la biblioteca básica. Muchos de ellos funcionan tan bien como en versiones anteriores de Perl 5, aunque para obtener el correcto, mayor y mejor soporte para Unicode, considere usar Perl 5.14 o 5.16.

Entre esos módulos se incluyen:

La distribución CPAN Unicode::Tussle trae muchos programas en línea de comandos para ayudar en el trabajo con Unicode, incluyendo algunos que reemplazan total o parcialmente a utilerías estándares: tcgrep en lugar de egrep, uniquote en lugar de cat -v o hexdump, uniwc en lugar de wc, unilook en lugar de look, unifmt en lugar de fmt, y ucsort en lugar de sort. Para examinar los nombres y propiedades de caracteres Unicode, vea los programas uniprops, unichars, y uninames. También ofrece programas que son filtros generales pero con soporte Unicode: unititle y unicaps; uniwide y uninarrow; unisupers y unisubs; nfd, nfc, nfkd y nfkc; y uc, lc y tc.

Finalmente, vea la última publicación del Estándar Unicode (los números de página son desde la versión 6.0.0), incluyendo los anexos específicos e informes técnicos:
§3.13 Default Case Algorithms, página 113
§4.2 Case, páginas 120-122
Case Mappings, páginas 166-172, especialmente Caseless Matching comenzando en la página 170
UAX #44: Unicode Character Database
UTS #18: Unicode Regular Expressions
UAX #15: Unicode Normalization Forms
UTS #10: Unicode Collation Algorithm
UAX #29: Unicode Text Segmentation
UAX #14: Unicode Line Breaking Algorithm
UAX #11: East Asian Width

Tom Christiansen escribió esta serie, con alguna pizca asistencial de Larry Wall y Jeffrey Friedl.

La mayor parte de estos ejemplos vienen de la actual edición del "Libro del Camello", es decir, de la 4ª edición de Programming Perl, Copyright © 2012 Tom Christiansen y otros, 2012-02-13 de O'Reilly Media. El código es libremente redistribuible, y se recomienda trasplantar, doblar, dividir y mutilar cualquiera de los ejemplos de esta serie, como quiera que sea, para ser incluidos en sus propios programas sin ningún tipo de gravamen alguno. Un reconocimiento a través de un comentario en el código es algo cortés, pero no requerido.

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: 14480
Registrado: 2005-07-24 18:12 @800
Ubicación: Valladolid, España

Anterior

Volver a Avanzado

¿Quién está conectado?

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

cron