2012-06-15 35 views
9

Estoy escribiendo un programa que funciona con documentos en Perl y muchos de los documentos tienen caracteres como ä, ö, ü, é, etc (tanto mayúsculas como minúsculas). Me gustaría reemplazarlos con contrapartes de ASCII a, o, u, e, etc. ¿Cómo lo haría en Perl?Cómo convertir letras con acentos, diéresis, etc. en sus equivalentes ASCII en Perl?

Una de las soluciones en las que pensé es tener un hash con claves siendo los diéresis y los acentos, y los valores siendo ASCII, pero eso requiere que tenga una lista de todos los diéresis y acentos, que no 't have, y si construyera una lista, seguramente echaría de menos a muchos ya que no estoy familiarizado con todos los personajes posibles que podrían tener diéresis, acentos y otros signos diacríticos.

+2

Tratar de eliminar los acentos casi siempre es lo incorrecto. Supongo que quieres: [¿Cómo hacer coincidir cadena con diacrítico en Perl?] (Http://stackoverflow.com/q/7429964) – daxim

+1

En caso negativo: [¿Cómo puedo sustituir caracteres Unicode por ASCII en Perl?] (Http: //stackoverflow.com/q/2309215) [¿Cómo puedo cambiar los caracteres latinos extendidos a sus equivalentes ASCII sin acentos?] (http://stackoverflow.com/q/450026) – daxim

+0

Creo que el primer párrafo de Texto :: Unidecode la descripción del módulo define los casos de uso potencial lo suficientemente bien.) No se trata solo de intercalación. – raina77ow

Respuesta

23

Como de costumbre, si piensas en un problema que ciertamente no es solo tuyo, ya hay una solución en CPAN.) En este caso se llama Text::Unidecode

use warnings; 
use strict; 
use utf8; 
use Text::Unidecode; 
print unidecode('ä, ö, ü, é'); # will print 'a, o, u, e' 
3

Text::Unidecode

ver las muchas renuncias, pero es probable que sólo lo que es necesario si sólo tiene texto latino con diacríticos.

0

lo hice esta subrutina y alimentar cada palabra a través de él. Esto podría ser lento.

sub store_utf82_encoding{ 
##see file UTF8vowels.txt 
#converts UTF8 Euro vowels to nearest English equivant 

    my $name=$_[0]; 
    $name =~m/\x00c0/A/g; #Agrav 
    $name =~m/\x00c1/A/g; # Aacute 
    $name =~m/\x00c2/A/g; # Acap 
    $name =~m/\x00c3/A/g; # Atilde 
    $name =~m/\x00c4/A/g; # Auml 
    $name =~m/\x00c5/A/g; # Aring 
    $name =~m/\x00c6/AE/g; # AE 
    $name =~m/\x00c7/Ch/g; # Ccedilla 
    $name =~m/\x00c8/E/g; #Egrav 
    $name =~m/\x00c9/E/g; # Eacute 
    $name =~m/\x00ca/E/g; # Ecap 
    $name =~m/\x00cb/E/g; # Euml 
    $name =~m/\x00cc/I/g; # Igrav 
    $name =~m/\x00cd/I/g; # Iacut 
    $name =~m/\x00ce/I/g; # Icap 
    $name =~m/\x00cf/I/g; # Iuml 
    $name =~m/\x00d0/Th/g; #CapEth 
    $name =~m/\x00d1/NY/g; # Ntild 
    $name =~m/\x00d2/O/g; # Ograv 
    $name =~m/\x00d3/O/g; # Oacute 
    $name =~m/\x00d4/O/g; # Ocap 
    $name =~m/\x00d5/Th/g; # Otilde 
    $name =~m/\x00d6/O/g; # Ouml 
    $name =~m/\x00d8/O/g; # Ostroke 
    $name =~m/\x00d9/U/g; # Ugrav 
    $name =~m/\x00da/U/g; # Uacute 
    $name =~m/\x00db/U/g; # Ucap 
    $name =~m/\x00dc/U/g; # Uuml 
    $name =~m/\x00dd/Y/g; # Yacute 
    $name =~m/\x00de/Th/g; # CapThorn 
    $name =~m/\x00df/SS/g; # GermanUCss Ezette 
    $name =~m/\x00e0/a/g; # agrav 
    $name =~m/\x00e1/a/g; # aacute 
    $name =~m/\x00e2/a/g; # acap 
    $name =~m/\x00e3/a/g; # atilde 
    $name =~m/\x00e4/a/g; # auml 
    $name =~m/\x00e5/a/g; # aring 
    $name =~m/\x00e6/ae/g; # ae 
    $name =~m/\x00e7/ch/g; # ccedilla 
    $name =~m/\x00e8/e/g; # egrav 
    $name =~m/\x00e9/e/g; # eacute 
    $name =~m/\x00ea/e/g; # ecap 
    $name =~m/\x00eb/e/g; # euml 
    $name =~m/\x00ec/i/g; # igrav 
    $name =~m/\x00ed/i/g; # iacute 
    $name =~m/\x00ee/i/g; # icap 
    $name =~m/\x00ef/i/g; # iuml 
    $name =~m/\x00f0/th/g; # lowercase eth 
    $name =~m/\x00f1/ny/g; # ntilde 
    $name =~m/\x00f2/o/g; # ograv 
    $name =~m/\x00f3/o/g; # oacute 
    $name =~m/\x00f4/o/g; # ocap 
    $name =~m/\x00f5/th/g; # otilde 
    $name =~m/\x00f6/o/g; # ouml 
    $name =~m/\x00f8/o/g; # ostroke 
    $name =~m/\x00f9/u/g; # ugrav 
    $name =~m/\x00fa/u/g; # uacute 
    $name =~m/\x00fb/u/g; # ucap 
    $name =~m/\x00fc/u/g; # uuml 
    $name =~m/\x00fe/th/g; # lowercase thorn 
    $name =~m/\x00fd/y/g; # yacute 
    $name =~m/\x00ff/y/g; # yuml 

return $name; 

} #endsub store_utf82_encoding 
Cuestiones relacionadas