Domanda

Ho uno script Perl che viene chiamato da terze parti per inviarmi nomi di persone che hanno registrato il mio software. Una di queste parti codifica i nomi in UTF-8, quindi ho adattato il mio script di conseguenza per decodificare UTF-8 in ASCII con Encode :: decode_utf8 (...).

Di solito funziona bene, ma ogni 6 mesi circa uno dei nomi contiene caratteri cirillici, greci o rumeni, quindi decodificare il nome si traduce in caratteri spazzatura come " & # 208; & # 376; & # 208; & # 190; & # 208; & # 180; & # 209; & # 8364; & # 208; & # 176; & # 208; & # 182; & # 208; & # 176; & # 208; & # 189; & # 209; & # 208; & # 186; & # 208; & # 176; & # 209; " ;. Devo dare un seguito al cliente e chiedergli una versione di "latino" " del suo nome per emettere un codice di registrazione.

Quindi, c'è qualche modulo Perl in grado di rilevare se ci sono tali caratteri e, se necessario, li traduce automaticamente nella loro rappresentazione ASCII più vicina?

Sembra che io possa usare Lingua :: Cyrillic :: Translit :: ICAO plus Lingua :: DetectCharset per gestire il cirillico, ma preferirei qualcosa che funzioni anche con altri set di caratteri.

È stato utile?

Soluzione

Credo che potresti usare Text :: Unidecode per questo, è proprio cosa cerca di fare.

Altri suggerimenti

Se hai a che fare con dati UTF-8 che non rientrano nell'intervallo ascii, la cosa migliore da fare è cambiare il tuo backend in modo da non soffocare su utf-8. Come faresti a traslitterare i segni kanji?

Se ricevi un testo in cirillico non c'è "rappresentazione ASCII più vicina" per molti personaggi.

Nella documentazione per Text :: Unicode, sotto " Avvertenze " ;, sembra che questa frase non sia corretta:

Assicurati che i dati di input siano davvero una stringa utf8.

UTF-8 è una codifica a lunghezza variabile, mentre Text :: Unidecode accetta solo una codifica a lunghezza fissa (due byte) per ogni carattere. Quindi quella frase dovrebbe essere:

Assicurati che i dati di input siano in realtà una stringa di caratteri Unicode a due byte.

Questo è anche indicato come UCS-2.

Se vuoi convertire stringhe che sono veramente utf8, lo faresti così:

my $decode_status = utf8::decode($input_to_be_converted);
my $converted_string = unidecode ($input_to_be_converted);
Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top