Mengonversi file UTF-8 ke ASCII (upaya terbaik)

23

Saya memiliki file di UTF-8 yang berisi teks dalam berbagai bahasa. Banyak dari itu adalah nama orang. Saya perlu mengubahnya menjadi ASCII dan saya perlu hasilnya agar terlihat layak.

Ada banyak cara bagaimana pendekatan mengkonversi dari pengkodean yang lebih luas ke yang lebih sempit. Transformasi paling sederhana adalah mengganti semua karakter non-ASCII dengan placeholder, seperti '_'. Jika saya tahu bahasa file yang ditulis, ada kemungkinan tambahan, seperti romanisasi.

Apa alat Unix atau pustaka bahasa pemrograman yang tersedia di Unix dapat memberi saya konversi (upaya terbaik) yang layak dari UTF-8 ke ASCII?

Sebagian besar teks dalam bahasa Eropa, jenis bahasa latin.

pengguna7610
sumber
1
Anda tahu di mana bahasa mana dimulai? Misalnya ada perbedaan tentang cara menangani tidak tersedianya umlaut (seperti pada ö). Dalam bahasa Jerman Anda selalu dapat menulis "oe", tetapi dalam bahasa Belanda misalnya, tidak tersedianya umlaut dapat lebih baik "dijelaskan" dengan tanda hubung diikuti oleh karakter berandal (dan di sana "oe" akan menjadi diftong yang sama sekali berbeda)
Anthon
Bagaimana Anda mendefinisikan "layak mungkin"? Kesulitan sebenarnya adalah dalam mendefinisikan pemetaan. Dibandingkan dengan itu, tugas pemrograman itu sepele. Pemetaan yang sebenarnya digunakan sangat bervariasi dan mungkin spesifik bahasa dalam dua cara: mereka tergantung pada bahasa teks dan pada bahasa yang diasumsikan pembaca (terutama yang berkaitan dengan romanisasi).
Jukka K. Korpela
@ JukkaK.Korpela "sepantas mungkin" tentu saja ditentukan oleh mereka yang menciptakan "alat Unix atau perpustakaan bahasa pemrograman yang tersedia di Unix" yang saya minta. Jika yang terbaik yang saya dapatkan adalah mengganti semua yang bukan ASCII dengan garis bawah, maka tidak banyak yang bisa saya lakukan. Kecuali menulis alat sendiri, yang saya tidak akan. Saya kira Unix @ SO mungkin bukan tempat terbaik untuk pertanyaan ini ...
user7610
1
@ user7610 Selain iconvdan tr, ada Unidecode . Saya tidak terbiasa dengan itu, tetapi mungkin melakukan apa yang Anda inginkan, jika Anda dapat menggunakan Python.
yellowantphil
1
@yellowantphil atau node-unidecode di JavaScript / node, UnidecodeSharp di C♯, atau Text :: Unidecode di Perl, yang merupakan yang pertama dari nama ini. Saya kira ada versi lain.
user7610

Jawaban:

11
konwert utf8-ascii

Ini akan melakukan konversi upaya terbaik, tergantung pada tabel konversi. Jika Anda tahu tentang bahasa input, ada filter khusus bahasa yang memberikan hasil yang lebih baik, misalnya

konwert utf8-xmetodo

adalah konversi Esperanto ke representasi x-metodo,

konwert UTF8-tex

akan mencoba melakukan representasi TeX dari diakritik, ada parameter khusus bahasa:

konwert UTF8-ascii/de

akan mentransliterasikan "ä" ke "ae" (biasa untuk bahasa Jerman) alih-alih polos "a"

konwert UTF8-ascii/rosyjski

akan menggunakan aturan Polandia untuk transliterasi Rusia, bukan yang "seperti Inggris", dll ...

Radovan Garabík
sumber
Apakah ini lokasi terbaru konwertsitus web? Apakah dikemas di mana saja? github.com/taw/konwert/tree/master/konwert-1.8
Nemo
25

Ini akan bekerja untuk beberapa hal:

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

echo ĥéĺłœ π | iconv -f utf-8 -t ascii//TRANSLITkembali helloe ?. Karakter apa iconvpun yang tidak tahu cara mengonversi akan diganti dengan tanda tanya.

iconvPOSIX, tapi saya tidak tahu apakah semua sistem memiliki TRANSLITopsi. Ini bekerja untuk saya di Linux. Selain itu, IGNOREopsi akan secara diam-diam membuang karakter yang tidak dapat direpresentasikan dalam set karakter target (lihat man iconv_open).

Opsi yang lebih rendah tetapi kompatibel dengan POSIX adalah untuk digunakan tr. Perintah ini menggantikan semua poin kode non-ASCII dengan tanda tanya. Bunyinya teks UTF-8 satu byte pada suatu waktu. "É" dapat diganti dengan E?atau ?, tergantung pada apakah itu disandikan menggunakan aksen kombinasi atau karakter yang sudah dikomposisi sebelumnya.

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

Contoh itu kembali caf? ?????, menggunakan karakter yang sudah dikomposisi sebelumnya.

yellowantphil
sumber
trtidak dimaksudkan untuk bekerja satu byte pada suatu waktu. GNU tr memang, tapi ini bug.
Stéphane Chazelas
3
iconv -f utf-8 -t ascii//TRANSLITbekerja dengan baik untuk saya. Itu mengubah tanda kutip menjadi tanda kutip lurus. Terima kasih.
Kolonel Panic
Perhatikan bahwa ikonv akan tersedak karakter beraksen berat seperti Pinyin.
sventechie
Catatan yang //TRANSLITjuga berfungsi untuk set karakter lain, misalnya iso-8859-1//TRANSLIT.
Skippy le Grand Gourou
iconvmemberi iconv: illegal input sequence at position 1234dan memotong file untuk saya. Alangkah baiknya jika itu hanya menghapus karakter dan mencoba mengambil urutan lagi.
jozxyqk
3

mencoba uni2ascii -B input.txt >output.txt

uni2ascii

philcolbourn
sumber
2

Saya memiliki file di UTF-8 yang berisi [nama orang] dalam berbagai bahasa [yang ingin saya konversi menjadi sesuatu yang bermakna di ASCII].

Maksud Anda, Anda ingin dapat mengubah nama-nama berikut menjadi beberapa string ASCII yang tidak akan ditolak orang yang bersangkutan?

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

Saya curiga tidak ada alat otomatis yang dapat melakukan ini. Mungkin tidak ada atau sangat banyak Latinizations nama pribadi. Perangkat lunak tidak dapat memilih versi yang dapat diterima secara budaya. Setidaknya bukan tanpa perangkat lunak mengetahui banyak tentang budaya orang yang terlibat.

Lihat juga /programming//a/1398403/477035

RedGrittyBrick
sumber
2
perl -e 'use utf8; use Text::Unidecode; print unidecode("عبد الله الثاني بسين")'menghasilkan `` bd llh lthny bn lHsyn` yang merupakan transliterasi yang cukup baik untuk tujuan saya.
user7610
4
@ user7610: Baik, tetapi Raja Abdulla II dari Yordania mungkin tidak setuju. Saya akan menyiapkan penjelasan seandainya seseorang yang penting mengeluh kepada CEO :-)
RedGrittyBrick
2

Saya akhirnya menggunakan Perl dengan Text :: Unidecode untuk ini. Contoh:

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

menghasilkan bd llh lthny bn lHsyn, yang merupakan hasil yang dapat diterima untuk tujuan saya.

pengguna7610
sumber