UTF-8 dosyasını ASCII'ye dönüştürme (en iyi çaba)


23

UTF-8'de birden fazla dilde metinler içeren bir dosyam var. Bunların çoğu insanların isimleri. ASCII'ye dönüştürmem gerekiyor ve mümkün olduğu kadar iyi görünmek için sonuca ihtiyacım var.

Daha geniş bir kodlamadan daha dar bir kodlamaya dönüştürme yaklaşımının birçok yolu vardır. En basit dönüşüm, ASCII dışındaki tüm karakterleri '_' gibi bazı yer tutucularla değiştirmek olacaktır. Dosyanın yazıldığı dili biliyorsanız, romanlaştırma gibi ek olasılıklar vardır.

Unix'te bulunan hangi Unix aracı veya programlama dili kütüphanesi UTF-8'den ASCII'ye bana iyi (en iyi çaba) dönüşümünü sağlayabilir?

Metnin çoğu Avrupa dillerinde latin dillerinde yazılmıştır.


1
hangi dilin nerede başladığını biliyor musunuz? Örneğin, bir öküzün mevcudiyetsizliği ile nasıl başa çıkılacağı konusunda bir fark vardır (ö gibi). Almanca'da her zaman "oe" yazabilirsiniz, ancak örneğin Hollandaca'da bir umlautun kullanılamaması, ümitlenen karakterin izlediği bir çizgi tarafından "daha iyi" tanımlanabilir (ve "oe" tamamen farklı bir diphthong olurdu)
Anthon

“Mümkün olduğunca iyi” nasıl tanımlanır? Asıl zorluk eşlemeleri tanımlamaktır. Buna kıyasla, programlama görevi önemsizdir. Aslında kullanılan eşlemeler çok fazla değişkenlik gösterir ve iki şekilde dile özgü olabilir: bunlar metnin diline ve okuyucunun varsayılan diline (özellikle romanlaştırma konusunda) bağlıdır.
Jukka K. Korpela

@ JukkaK.Korpela "olabildiğince iyi" elbette istediğim "Unix aracını ya da Unix'te bulunan programlama dili kitaplığını" oluşturanlar tarafından tanımlanıyor. Elimden gelenin en iyisi ASCII dışındaki her şeyi bir alt çizgi ile değiştirmekse, yapabileceğim fazla bir şey yok. Yapmayacağım kendi aracımı yazmam dışında. Sanırım Unix @ SO bu soru için en iyi yer olmayabilir ...
user7610

1
dan daha user7610 Diğer iconvve trvardır Unidecode . Buna aşina değilim, ancak Python kullanıyorsanız, istediğinizi yapabilir.
yellowantphil

1
@anellowphph veya JavaScript / node'da node-unidecode , C♯'da UnidecodeSharp veya Perl'de Text :: Unidecode , bu adın başında gelir. Sanırım başka versiyonlar da var.
user7610

Yanıtlar:


11
konwert utf8-ascii

Dönüşüm tablolarına bağlı olarak, en iyi çaba dönüşümünü gerçekleştirecektir. Yaklaşık olarak giriş dilini biliyorsanız, daha iyi sonuçlar veren dile özgü filtreler vardır, örneğin

konwert utf8-xmetodo

Esperanto'nun x-metodo temsiline dönüştürülmesi,

konwert UTF8-tex

aksanların TeX gösterimini yapmaya çalışacağım, dile özgü parametreler var:

konwert UTF8-ascii/de

"a" yerine "ä" kelimesini "a" yerine "ae" ye (Almanca için alışılmış) çevirir

konwert UTF8-ascii/rosyjski

Lehçe'yi "ingilizceye benzer" ler yerine, örneğin Rusça'yı çevirmek için kullanacak ...


Burası konwertweb sitesinin en son yeri mi? Herhangi bir yere paketlenmiş mi? github.com/taw/konwert/tree/master/konwert-1.8
Nemo

25

Bu bazı şeyler için çalışacak:

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

echo ĥéĺłœ π | iconv -f utf-8 -t ascii//TRANSLITdöner helloe ?. iconvNasıl dönüştürüleceğini bilmeyen karakterler, soru işaretleri ile değiştirilecektir.

iconvPOSIX’dir, ancak tüm sistemlerin TRANSLITseçeneği olup olmadığını bilmiyorum . Benim için Linux'ta çalışıyor. Ayrıca, IGNOREseçenek, hedef karakter kümesinde gösterilemeyen karakterleri sessizce atar (bkz man iconv_open).

Düşük ama POSIX uyumlu bir seçenek kullanmaktır tr. Bu komut ASCII dışındaki tüm kod noktalarını bir soru işareti ile değiştirir. Her seferinde bir bayt UTF-8 metni okur. “E” , bir birleştirme aksanı veya önceden oluşturulmuş bir karakter kullanılarak kodlanıp kodlanmadığına bağlı olarak E?veya ile değiştirilebilir ?.

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

Bu örnek caf? ?????, önceden oluşturulmuş karakterleri kullanarak döner .


trher seferinde bir bayt çalışmak anlamına gelmez. GNU tr yapar, ancak bu bir hatadır.
Stéphane Chazelas

3
iconv -f utf-8 -t ascii//TRANSLITbenim için iyi çalıştı. Kıvırcık tırnakları düz tırnaklara çevirdi. Teşekkürler.
Albay Panik

İconv'nin Pinyin gibi çok aksanlı karakterleri boğacağına dikkat edin.
sventechie

Not //TRANSLITayrıca örneğin karakterlerin diğer setleri, için çalışır iso-8859-1//TRANSLIT.
Skippy le Grand Gourou

iconvverir iconv: illegal input sequence at position 1234ve dosyayı benim için keser. Sadece karakteri silip diziyi tekrar almaya çalıştığında iyi olurdu.
jozxyqk


2

UTF-8'de [insanların isimlerini] birden fazla dilde [ASCII'de anlamlı bir şeye dönüştürmek istediğim] içeren bir dosyam var.

Aşağıdaki isimleri, ilgili kişinin itiraz edemeyeceği bir ASCII dizgisine dönüştürebilmek mi istiyorsunuz?

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

Bunu yapabilecek otomatik bir araç olmadığını düşünüyorum. Kişisel adların Latinasyonları yok ya da çok olabilir. Yazılım kültürel olarak kabul edilebilir sürümünü seçemez. En azından yazılım, söz konusu kişinin kültürü hakkında çok şey bilmeden.

Ayrıca bkz. Https://stackoverflow.com/a/1398403/477035


2
perl -e 'use utf8; use Text::Unidecode; print unidecode("عبد الله الثاني بسين")'Amaçlarım için yeterince iyi bir çevirisi olan `` bd llh lthny bn lHsyn '' üretir.
user7610

4
@ user7610: İyi ama Jordan Kralı Abdulla II aynı fikirde olmayabilir. Önemli birinin CEO’ya şikayet etmesi durumunda bir açıklama hazırlarım :-)
RedGrittyBrick

2

Bunun için Text :: Unidecode ile Perl'i kullandım. Örnek:

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

üretir bd llh lthny bn lHsynbenim amaçlar için kabul edilebilir bir sonuç olan,.

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.