Konwertowanie pliku UTF-8 na ASCII (najlepiej)

23

Mam plik w UTF-8, który zawiera teksty w wielu językach. Wiele z nich to nazwiska ludzi. Muszę przekonwertować go na ASCII i potrzebuję, aby wynik wyglądał tak przyzwoicie, jak to możliwe.

Istnieje wiele sposobów na przejście z kodowania szerszego na węższe. Najprostszą transformacją byłoby zastąpienie wszystkich znaków spoza ASCII pewnym symbolem zastępczym, takim jak „_”. Jeśli znam język, w którym plik jest zapisany, istnieją dodatkowe możliwości, takie jak romanizacja.

Jakie narzędzie uniksowe lub biblioteka języków programowania dostępna w systemie Unix może zapewnić mi przyzwoitą (najlepiej działającą) konwersję z UTF-8 na ASCII?

Większość tekstu jest w europejskich językach łacińskich.

użytkownik7610
źródło
1
wiesz, od którego języka się zaczyna? Istnieje np. Różnica w sposobie radzenia sobie z niedostępnością umlaut (jak w przypadku ö). W języku niemieckim zawsze możesz napisać „oe”, ale np. W języku niderlandzkim niedostępność umlauta można lepiej „opisać” myślnikiem, a następnie umlautowaną postacią (i tam „oe” byłoby zupełnie innym dyftongiem)
Anthon
Jak definiujesz „tak przyzwoicie, jak to możliwe”? Prawdziwa trudność polega na zdefiniowaniu mapowań. W porównaniu z tym zadanie programowania jest banalne. Zastosowane odwzorowania są bardzo różne i mogą być specyficzne dla języka na dwa sposoby: zależą od języka tekstu i przyjętego języka czytelnika (szczególnie w odniesieniu do romanizacji).
Jukka K. Korpela,
@ JukkaK.Korpela „tak przyzwoity, jak to możliwe” jest oczywiście definiowany przez tych, którzy stworzyli „narzędzie uniksowe lub bibliotekę języków programowania dostępnych w Uniksie”, o które proszę. Jeśli najlepsze, co otrzymam, to zastąpienie wszystkiego spoza ASCII znakiem podkreślenia, to niewiele mogę zrobić. Z wyjątkiem pisania własnego narzędzia, czego nie zrobię. Myślę, że Unix @ SO może nie być najlepszym miejscem na to pytanie…
user7610
1
@ user7610 Poza iconvi tristnieje Unidecode . Nie jestem z tym zaznajomiony, ale może zrobić to, co chcesz, jeśli możesz używać Pythona.
yellowantphil
1
@yellowantphil lub node-unidecode w JavaScript / node, UnidecodeSharp w C♯, lub Text :: Unidecode w Perlu, który przypadkowo jest pierwszy z tej nazwy. Sądzę, że istnieją inne wersje.
user7610,

Odpowiedzi:

11
konwert utf8-ascii

Wykona konwersję typu best-effort, w zależności od tabel konwersji. Jeśli znasz w przybliżeniu język wprowadzania, istnieją filtry specyficzne dla języka, które dają lepsze wyniki, np

konwert utf8-xmetodo

jest konwersją esperanto na reprezentację x-metodo,

konwert UTF8-tex

spróbuje wykonać reprezentację znaków diakrytycznych w TeXie, istnieją parametry specyficzne dla języka:

konwert UTF8-ascii/de

przetłumaczy „ä” na „ae” (zwyczajowo w języku niemieckim) zamiast zwykłego „a”

konwert UTF8-ascii/rosyjski

użyje polskich reguł do transliteracji rosyjskiego, zamiast „angielskich” itp.

Radovan Garabík
źródło
Czy to najnowsza lokalizacja strony konwertinternetowej? Czy jest gdziekolwiek zapakowany? github.com/taw/konwert/tree/master/konwert-1.8
Nemo
25

Będzie to działać w przypadku niektórych rzeczy:

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

echo ĥéĺłœ π | iconv -f utf-8 -t ascii//TRANSLITzwraca helloe ?. Wszelkie znaki, które iconvnie wiedzą, jak przekonwertować, zostaną zastąpione znakami zapytania.

iconvjest POSIX, ale nie wiem, czy wszystkie systemy mają taką TRANSLITopcję. Działa dla mnie w systemie Linux. Ponadto IGNOREopcja po cichu odrzuci znaki, które nie mogą być reprezentowane w docelowym zestawie znaków (patrz man iconv_open).

Niższą, ale zgodną z POSIX opcją jest użycie tr. To polecenie zastępuje wszystkie punkty kodu inne niż ASCII znakiem zapytania. Czyta tekst UTF-8 po jednym bajcie na raz. „É” może być zamienione na E?lub ?, w zależności od tego, czy zostało zakodowane przy użyciu łączącego akcentu czy wstępnie złożonego znaku.

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

Ten przykład powraca caf? ?????przy użyciu wstępnie ułożonych znaków.

żółcień
źródło
trnie jest przeznaczony do pracy jeden bajt na raz. GNU tr ma, ale to błąd.
Stéphane Chazelas,
3
iconv -f utf-8 -t ascii//TRANSLITdziałało dobrze dla mnie. Zmieniło nawiasy kręcone na proste. Dzięki.
Pułkownik Panic
Zauważ, że iconv dusi mocno akcentowane postacie, takie jak Pinyin.
sventechie
Pamiętaj, że //TRANSLITdziała również dla innych zestawów znaków, np iso-8859-1//TRANSLIT.
Skippy le Grand Gourou,
iconvdaje iconv: illegal input sequence at position 1234i obcina plik dla mnie. Byłoby miło, gdyby po prostu usunął postać i spróbował ponownie wybrać sekwencję.
jozxyqk
2

Mam plik w UTF-8, który zawiera [nazwiska osób] w wielu językach [które chcę przekonwertować na coś znaczącego w ASCII].

Masz na myśli, że chcesz móc przekonwertować następujące nazwy na ciąg ASCII, któremu dana osoba nie sprzeciwiłaby się?

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

Podejrzewam, że nie ma takiego zautomatyzowanego narzędzia. Może być albo brak, albo bardzo wiele latynizacji nazw osobistych. Oprogramowanie nie może wybrać wersji dopuszczalnej kulturowo. Przynajmniej nie bez wiedzy oprogramowania na temat kultury zaangażowanej osoby.

Zobacz także /programming//a/1398403/477035

RedGrittyBrick
źródło
2
perl -e 'use utf8; use Text::Unidecode; print unidecode("عبد الله الثاني بسين")'produkuje `` bd llh lthny bn lHsyn`, co jest wystarczającą transliteracją dla moich celów.
user7610
4
@ user7610: Dobrze, ale król Jordanii Abdulla II może się nie zgodzić. Przygotowałbym wyjaśnienie na wypadek, gdyby ktoś ważny narzekał na prezesa :-)
RedGrittyBrick
2

Skończyło się na tym, że użyłem Perla z Text :: Unidecode . Przykład:

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

produkuje bd llh lthny bn lHsyn, co jest akceptowalnym wynikiem dla moich celów.

użytkownik7610
źródło