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.
character-encoding
text
natural-language
użytkownik7610
źródło
źródło
iconv
itr
istnieje Unidecode . Nie jestem z tym zaznajomiony, ale może zrobić to, co chcesz, jeśli możesz używać Pythona.Odpowiedzi:
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
jest konwersją esperanto na reprezentację x-metodo,
spróbuje wykonać reprezentację znaków diakrytycznych w TeXie, istnieją parametry specyficzne dla języka:
przetłumaczy „ä” na „ae” (zwyczajowo w języku niemieckim) zamiast zwykłego „a”
użyje polskich reguł do transliteracji rosyjskiego, zamiast „angielskich” itp.
źródło
konwert
internetowej? Czy jest gdziekolwiek zapakowany? github.com/taw/konwert/tree/master/konwert-1.8Będzie to działać w przypadku niektórych rzeczy:
echo ĥéĺłœ π | iconv -f utf-8 -t ascii//TRANSLIT
zwracahelloe ?
. Wszelkie znaki, któreiconv
nie wiedzą, jak przekonwertować, zostaną zastąpione znakami zapytania.iconv
jest POSIX, ale nie wiem, czy wszystkie systemy mają takąTRANSLIT
opcję. Działa dla mnie w systemie Linux. PonadtoIGNORE
opcja po cichu odrzuci znaki, które nie mogą być reprezentowane w docelowym zestawie znaków (patrzman 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 naE?
lub?
, w zależności od tego, czy zostało zakodowane przy użyciu łączącego akcentu czy wstępnie złożonego znaku.Ten przykład powraca
caf? ?????
przy użyciu wstępnie ułożonych znaków.źródło
tr
nie jest przeznaczony do pracy jeden bajt na raz. GNU tr ma, ale to błąd.iconv -f utf-8 -t ascii//TRANSLIT
działało dobrze dla mnie. Zmieniło nawiasy kręcone na proste. Dzięki.//TRANSLIT
działa również dla innych zestawów znaków, npiso-8859-1//TRANSLIT
.iconv
dajeiconv: illegal input sequence at position 1234
i obcina plik dla mnie. Byłoby miło, gdyby po prostu usunął postać i spróbował ponownie wybrać sekwencję.próbować
uni2ascii -B input.txt >output.txt
uni2ascii
źródło
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
źródło
perl -e 'use utf8; use Text::Unidecode; print unidecode("عبد الله الثاني بسين")'
produkuje `` bd llh lthny bn lHsyn`, co jest wystarczającą transliteracją dla moich celów.Skończyło się na tym, że użyłem Perla z Text :: Unidecode . Przykład:
produkuje
bd llh lthny bn lHsyn
, co jest akceptowalnym wynikiem dla moich celów.źródło