Konvertieren einer UTF-8-Datei nach ASCII (Best-Effort)

22

Ich habe eine Datei in UTF-8, die mehrsprachige Texte enthält. Vieles davon sind die Namen von Menschen. Ich muss es in ASCII konvertieren und das Ergebnis muss so anständig wie möglich aussehen.

Es gibt viele Möglichkeiten, um die Konvertierung von einer breiteren in eine engere Codierung zu erreichen. Die einfachste Transformation wäre, alle Nicht-ASCII-Zeichen durch einen Platzhalter wie '_' zu ersetzen. Wenn ich die Sprache kenne, in der die Datei geschrieben ist, gibt es zusätzliche Möglichkeiten, z. B. die Romanisierung.

Welches Unix-Tool oder welche Programmiersprachenbibliothek, die unter Unix verfügbar sind, kann mir eine anständige (bestmögliche) Konvertierung von UTF-8 nach ASCII ermöglichen?

Der größte Teil des Textes ist in europäischen lateinischen Sprachen verfasst.

user7610
quelle
1
Weißt du wo welche Sprache anfängt? Es gibt zB einen Unterschied, wie mit der Nichtverfügbarkeit eines Umlauts umzugehen ist (wie auf dem ö). Auf Deutsch kann man immer "oe" schreiben, aber zB auf Niederländisch kann die Nichtverfügbarkeit eines Umlauts besser durch einen Bindestrich gefolgt von einem umlautierten Zeichen "beschrieben" werden (und dort wäre das "oe" ein völlig anderer Diphthong)
Anthon
Wie definieren Sie "so anständig wie möglich"? Die eigentliche Schwierigkeit besteht darin, die Zuordnungen zu definieren. Im Vergleich dazu ist die Programmieraufgabe trivial. Die tatsächlich verwendeten Abbildungen variieren stark und können in zweierlei Hinsicht sprachspezifisch sein: Sie hängen von der Sprache des Textes und der angenommenen Sprache des Lesers ab (insbesondere im Hinblick auf die Romanisierung).
Jukka K. Korpela
@ JukkaK.Korpela "so anständig wie möglich" wird natürlich von denen definiert, die das von mir gewünschte "Unix-Tool oder die unter Unix verfügbare Programmiersprachenbibliothek" erstellt haben. Wenn das Beste, was ich bekommen werde, darin besteht, alles, was nicht in ASCII geschrieben ist, durch einen Unterstrich zu ersetzen, kann ich nicht viel anderes tun. Außer mein eigenes Werkzeug zu schreiben, was ich nicht tun werde. Ich denke, Unix @ SO ist möglicherweise nicht der beste Ort für diese Frage ...
user7610
1
@ user7610 Außer iconvund trgibt es Unidecode . Ich bin damit nicht vertraut, aber es kann tun, was Sie wollen, wenn Sie Python verwenden können.
Yellowantphil
1
@yellowantphil oder node-unidecode in JavaScript / node, UnidecodeSharp in C♯ oder Text :: Unidecode in Perl, der zufällig der erste dieses Namens ist. Ich denke, es gibt andere Versionen.
User7610

Antworten:

11
konwert utf8-ascii

Abhängig von den Konvertierungstabellen wird die bestmögliche Konvertierung durchgeführt. Wenn Sie ungefähr die Eingabesprache kennen, gibt es sprachspezifische Filter, die bessere Ergebnisse liefern, z

konwert utf8-xmetodo

ist die Umwandlung von Esperanto in die X-Metodo-Darstellung,

konwert UTF8-tex

wird versuchen, TeX-Darstellung von Diakritika zu tun, gibt es sprachspezifische Parameter:

konwert UTF8-ascii/de

wird "ä" in "ae" umschreiben anstatt "a"

konwert UTF8-ascii/rosyjski

Verwendet die polnischen Regeln für das Transliterieren von Russisch anstelle der "englischen" usw.

Radovan Garabík
quelle
Ist dies der neueste Standort der konwertWebsite? Ist es irgendwo verpackt? github.com/taw/konwert/tree/master/konwert-1.8
Nemo
25

Dies wird für einige Dinge funktionieren:

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

echo ĥéĺłœ π | iconv -f utf-8 -t ascii//TRANSLITkehrt zurück helloe ?. Alle Zeichen, iconvdie nicht konvertieren können, werden durch Fragezeichen ersetzt.

iconvist POSIX, aber ich weiß nicht, ob alle Systeme die TRANSLITOption haben. Es funktioniert für mich unter Linux. Darüber hinaus werden mit dieser IGNOREOption im Hintergrund Zeichen verworfen, die im Zielzeichensatz nicht dargestellt werden können (siehe man iconv_open).

Eine minderwertige, aber POSIX-konforme Option ist die Verwendung tr. Dieser Befehl ersetzt alle Nicht-ASCII-Codepunkte durch ein Fragezeichen. Es liest jeweils ein Byte UTF-8-Text. "É" kann durch " E?oder " ersetzt werden ?, je nachdem, ob es mit einem kombinierten Akzent oder einem vorkomponierten Zeichen codiert wurde.

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

In diesem Beispiel caf? ?????werden vorkompositionierte Zeichen verwendet.

Yellowantphil
quelle
trsoll nicht ein Byte auf einmal arbeiten. GNU tr tut es, aber es ist ein Fehler.
Stéphane Chazelas
2
iconv -f utf-8 -t ascii//TRANSLITfunktionierte gut für mich. Es wurden geschweifte Anführungszeichen in gerade Anführungszeichen geändert. Vielen Dank.
Oberst Panic
Beachten Sie, dass iconv Zeichen mit starkem Akzent wie Pinyin verschluckt.
Sventechie
Beachten Sie, dass dies //TRANSLITauch für andere Zeichensätze funktioniert, z iso-8859-1//TRANSLIT.
Skippy le Grand Gourou
iconvgibt iconv: illegal input sequence at position 1234und schneidet die Datei für mich ab. Wäre schön, wenn es nur den Charakter löschen und versuchen würde, die Sequenz wieder aufzunehmen.
Jozxyqk
3

Versuchen uni2ascii -B input.txt >output.txt

uni2ascii

Philcolbourn
quelle
2

Ich habe eine Datei in UTF-8, die [Personennamen] in mehreren Sprachen enthält [die ich in etwas Sinnvolles in ASCII konvertieren möchte].

Sie möchten die folgenden Namen in eine ASCII-Zeichenfolge konvertieren können, gegen die die betreffende Person keine Einwände erheben würde?

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

Ich vermute, es gibt kein automatisiertes Tool, das das kann. Es kann keine oder sehr viele Lateinisierungen von Personennamen geben. Die Software kann die kulturell akzeptable Version nicht auswählen. Zumindest nicht, ohne dass die Software viel über die Kultur des Betroffenen weiß.

Siehe auch /programming//a/1398403/477035

RedGrittyBrick
quelle
2
perl -e 'use utf8; use Text::Unidecode; print unidecode("عبد الله الثاني بسين")'produziert `` bd llh lthny bn lHsyn``, was für meine Zwecke gut genug ist.
user7610
4
@ user7610: Gut, aber König Abdulla II. von Jordan könnte anderer Meinung sein. Ich würde eine Erklärung vorbereiten, falls sich jemand beim CEO beschwert :-)
RedGrittyBrick
2

Am Ende habe ich Perl mit Text :: Unidecode verwendet . Beispiel:

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

produziert bd llh lthny bn lHsyn, was für meine Zwecke akzeptables Ergebnis ist.

user7610
quelle