2012-06-15 18 views
9

Piszę program, który działa z dokumentami w Perlu i wiele dokumentów ma takie znaki, jak ä, ö, ü, é, etc (wielkie i małe litery). Chciałbym zastąpić je odpowiednikami ASCII a, o, u, e, etc. Jak mam to zrobić w Perlu?Jak konwertować litery z akcentami, umlautami itp. Do ich odpowiedników ASCII w Perlu?

Jednym z rozwiązań, o których myślałem jest posiadanie skrótu z kluczami będącymi umlautowymi i akcentującymi znakami, a wartości są odpowiednikami ASCII, ale to wymaga ode mnie listy wszystkich umlautów i znaków akcentowanych, które nie mam, a jeśli zbudowałem listę, z pewnością tęsknię za wieloma, ponieważ nie znam wszystkich możliwych postaci, które mogłyby mieć umlauty, akcenty i inne znaki diakrytyczne.

+2

Próba usunięcia akcentów jest prawie zawsze niewłaściwa. Chyba chcesz: [Jak dopasować ciąg znaków do znaków diakrytycznych w perlu?] (Http://stackoverflow.com/q/7429964) – daxim

+1

Jeśli nie: [Jak mogę zamienić znaki Unicode na ASCII w Perlu?] (Http: //stackoverflow.com/q/2309215) [Jak mogę zmienić rozszerzone znaki łacińskie na ich nieakcentowane odpowiedniki ASCII?] (http://stackoverflow.com/q/450026) – daxim

+0

Myślę, że pierwszy akapit tekstu :: Unidecode opis modułu wystarczająco dobrze określa potencjalne zastosowania.) Nie chodzi tylko o zestawianie. – raina77ow

Odpowiedz

23

Jak zwykle, jeśli myślisz o problemie, który z pewnością nie należy wyłącznie do ciebie, istnieje już rozwiązanie na CPAN.) W tym przypadku to się nazywa Text::Unidecode

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

Text::Unidecode

zobaczyć wiele stopek, ale to chyba tylko to, czego potrzebujesz, jeśli tylko mają łaciński tekst ze znakami diakrytycznymi.

0

Zrobiłem to podprogram i karmię każde słowo przez niego. To może być powolne.

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 
Powiązane problemy