Conversione di un file UTF-8 in ASCII (best-effort)


23

Ho un file in UTF-8 che contiene testi in più lingue. Molti di questi sono nomi di persone. Devo convertirlo in ASCII e ho bisogno che il risultato appaia il più decente possibile.

Esistono molti modi per approcciare la conversione da una codifica più ampia a una codifica più stretta. La trasformazione più semplice sarebbe quella di sostituire tutti i caratteri non ASCII con alcuni segnaposto, come '_'. Se conosco la lingua in cui è scritto il file, ci sono ulteriori possibilità, come la romanizzazione.

Quale strumento Unix o libreria di linguaggi di programmazione disponibile su Unix può darmi una conversione decente (best-effort) da UTF-8 a ASCII?

La maggior parte del testo è in lingue europee di tipo latino.


1
sai da quale lingua inizia? C'è ad esempio una differenza su come gestire la non disponibilità di un umlaut (come su ö). In tedesco puoi sempre scrivere "oe", ma ad esempio in olandese l'indisponibilità di una umlaut può essere meglio "descritta" da un trattino seguito dal carattere umlauted (e lì "oe" sarebbe un dittongo completamente diverso)
Anthon

Come si definisce "il più decente possibile"? La vera difficoltà è nel definire i mapping. Rispetto a ciò, l'attività di programmazione è banale. Le mappature effettivamente utilizzate variano molto e possono essere specifiche della lingua in due modi: dipendono dalla lingua del testo e dalla lingua presunta del lettore (specialmente per quanto riguarda la romanizzazione).
Jukka K. Korpela,

@ JukkaK.Korpela "il più discreto possibile" è ovviamente definito da coloro che hanno creato lo "strumento Unix o la libreria del linguaggio di programmazione disponibile su Unix" che sto chiedendo. Se il meglio che sto per ottenere è sostituire tutto ciò che non è ASCII con un carattere di sottolineatura, allora non c'è molto altro che posso fare. Tranne scrivere il mio strumento, che non lo farò. Immagino che Unix @ SO potrebbe non essere il posto migliore per questa domanda ...
user7610

1
@ user7610 Oltre a iconve tr, c'è Unidecode . Non ne ho familiarità, ma potrebbe fare quello che vuoi, se puoi usare Python.
Yellowantphil,

1
@yellowantphil o node-unidecode in JavaScript / node, UnidecodeSharp in C♯ o Text :: Unidecode in Perl, che sembra essere il primo di questo nome. Immagino ci siano altre versioni.
user7610

Risposte:


11
konwert utf8-ascii

Farà la conversione con il massimo sforzo, a seconda delle tabelle di conversione. Se conosci approssimativamente la lingua di input, esistono filtri specifici per la lingua che danno risultati migliori, ad es

konwert utf8-xmetodo

è la conversione dell'esperanto nella rappresentazione x-metodo,

konwert UTF8-tex

proverà a fare la rappresentazione TeX dei segni diacritici, ci sono parametri specifici della lingua:

konwert UTF8-ascii/de

tradurrà "ä" in "ae" (consuetudine per il tedesco) anziché "a" semplice

konwert UTF8-ascii/rosyjski

utilizzerà le regole polacche per traslitterare il russo, anziché quelle "inglesi", ecc ...


Questa è l'ultima posizione del konwertsito Web? È confezionato ovunque? github.com/taw/konwert/tree/master/konwert-1.8
Nemo

25

Questo funzionerà per alcune cose:

iconv -f utf-8 -t ascii//TRANSLIT

echo ĥéĺłœ π | iconv -f utf-8 -t ascii//TRANSLITritorna helloe ?. Tutti i personaggi che iconvnon sanno come convertire verranno sostituiti con punti interrogativi.

iconvè POSIX, ma non so se tutti i sistemi hanno l' TRANSLITopzione. Funziona per me su Linux. Inoltre, l' IGNOREopzione eliminerà silenziosamente i caratteri che non possono essere rappresentati nel set di caratteri di destinazione (vedere man iconv_open).

È necessario utilizzare un'opzione inferiore ma conforme a POSIX tr. Questo comando sostituisce tutti i punti di codice non ASCII con un punto interrogativo. Legge il testo UTF-8 un byte alla volta. "É" potrebbe essere sostituito con E?o ?, a seconda che sia stato codificato usando un accento combinato o un carattere precomposto.

echo café äëïöü | tr -d '\200-\277' | tr '\300-\377' '[?*]'

Quell'esempio ritorna caf? ?????, usando caratteri precomposti.


trnon è pensato per funzionare un byte alla volta. GNU tr fa, ma è un bug.
Stéphane Chazelas,

3
iconv -f utf-8 -t ascii//TRANSLITha funzionato bene per me. Ha cambiato le virgolette in virgolette. Grazie.
Colonnello Panic,

Nota che iconv si strozzerà con personaggi fortemente accentati come Pinyin.
sventechie,

Nota che //TRANSLITfunziona anche con altri set di caratteri, ad es iso-8859-1//TRANSLIT.
Skippy le Grand Gourou,

iconviconv: illegal input sequence at position 1234e tronca il file per me. Sarebbe bello se avesse appena eliminato il personaggio e provato a riprendere la sequenza.
jozxyqk,


2

Ho un file in UTF-8 che contiene [nomi di persone] in più lingue [che voglio convertire in qualcosa di significativo in ASCII].

Vuoi dire che vuoi essere in grado di convertire i seguenti nomi in una stringa ASCII a cui la persona interessata non si opporrebbe?

  • ஸ்றீனிவாஸ ராமானுஜன் ஐயங்கார்
  • عبد الله الثاني بن الحسين

Ho il sospetto che non esiste uno strumento automatico in grado di farlo. Possono esserci o nessuna o molte latinizzazioni di nomi personali. Il software non può scegliere la versione culturalmente accettabile. Almeno non senza che il software sappia molto sulla cultura della persona coinvolta.

Vedi anche /programming//a/1398403/477035


2
perl -e 'use utf8; use Text::Unidecode; print unidecode("عبد الله الثاني بسين")'produce `` bd llh lthny bn lHsyn` che è abbastanza buona traslitterazione per i miei scopi.
user7610

4
@utente7610: Bene, ma il re Abdulla II di Giordania potrebbe non essere d'accordo. Preparerei una spiegazione nel caso in cui qualcuno importante si lamenta con il CEO :-)
RedGrittyBrick

2

Ho finito per usare Perl con Text :: Unidecode per questo. Esempio:

perl -e 'use utf8; use Text::Unidecode; print unidecode("عبد الله الثاني بسين")

produce bd llh lthny bn lHsyn, che è un risultato accettabile per i miei scopi.

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.