2012-06-15 8 views
9

Sto scrivendo un programma che funziona con i documenti in Perl e molti dei documenti hanno caratteri come ä, ö, ü, é, etc (sia maiuscolo che minuscolo). Mi piacerebbe sostituirli con le controparti ASCII a, o, u, e, etc. Come lo farei in Perl?Come convertire le lettere con accenti, dieresi, ecc. Nelle loro controparti ASCII in Perl?

Una delle soluzioni che ho pensato è di avere un hash con le chiavi che sono i caratteri di umlaut e accento, ei valori sono controparti ASCII, ma ciò richiede che io abbia una lista di tutti i caratteri di umlaut e accento, che io indosso Ho, e se ho costruito una lista, sicuramente mi mancherebbero molti perché non conosco tutti i possibili personaggi che potrebbero avere umlaut, accenti e altri segni diacritici.

+2

Provare a rimuovere gli accenti è quasi sempre la cosa sbagliata da fare. Immagino che tu voglia: [Come abbinare la stringa con diacritic in perl?] (Http://stackoverflow.com/q/7429964) – daxim

+1

In caso contrario: [Come posso sostituire i caratteri Unicode con ASCII in Perl?] (Http: //stackoverflow.com/q/2309215) [Come posso modificare i caratteri latini estesi ai loro equivalenti ASCII non accentati?] (http://stackoverflow.com/q/450026) – daxim

+0

Penso che il primo paragrafo di Testo :: Unidecode la descrizione del modulo definisce abbastanza bene i potenziali casi d'uso.) Non si tratta solo di regole di confronto. – raina77ow

risposta

23

Come al solito, se si pensa a un problema che sicuramente non è solo il vostro, esiste già una soluzione su CPAN.) In questo caso si chiama Text::Unidecode

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

Text::Unidecode

Vedi le tante declinazioni di responsabilità, ma è probabilmente quello che vi serve se avete appena testo latino con segni diacritici.

0

ho fatto questa subroutine e nutro ogni parola attraverso di essa. Questo potrebbe essere 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