Discussion:
Textdatei umkodieren
(zu alt für eine Antwort)
Alexander Goetzenstein
2024-07-27 09:37:46 UTC
Permalink
Hallo,
mein von Android stammendes Adressbuch soll lesbare Umlaute erhalten,
also etwa ß statt ß oder ü statt ÃŒ usw.

Nun gibt es ja Tools wie iconv oder recode, die jede menge Optionen und
Zeichensätze bieten. Doch wie finde ich heraus, welche die richtigen
sind? Einfaches durchprobieren scheint mir angesichts der Masse an
möglichen Kombinationen nicht sinnvoll.

Ziel dürfte wohl UTF-8 sein, vermute ich, doch wie ermittle ich die Quelle?
--
Gruß
Alex
Peter J. Holzer
2024-07-27 09:59:35 UTC
Permalink
Post by Alexander Goetzenstein
mein von Android stammendes Adressbuch soll lesbare Umlaute erhalten,
also etwa ß statt ß oder ü statt ÃŒ usw.
Nun gibt es ja Tools wie iconv oder recode, die jede menge Optionen und
Zeichensätze bieten. Doch wie finde ich heraus, welche die richtigen
sind? Einfaches durchprobieren scheint mir angesichts der Masse an
möglichen Kombinationen nicht sinnvoll.
Ziel dürfte wohl UTF-8 sein, vermute ich, doch wie ermittle ich die Quelle?
Nein, die Quelle ist offensichtlich UTF-8, und Dein Ziel ist offen-
sichtlich ein 8-Bit-Zeichensatz, wenn Dir Umlaute als zwei Zeichen
angezeigt werden ("ß" in UTF-8 ist C3 9F, ü ist C3 BC; In ISO-8859-15
ist C3 ein "Ã", 9F ist nicht definiert, und BC ist "Œ" - also wird es
wohl das sein).

Aber warum verwendest Du über 30 Jahre nach der Erfindung von Unicode
noch ISO-8859-x?

hp
Ulli Horlacher
2024-07-27 10:19:38 UTC
Permalink
Post by Peter J. Holzer
Aber warum verwendest Du über 30 Jahre nach der Erfindung von Unicode
noch ISO-8859-x?
Mach ich auch.
Grund ist, dass ich diverse Hardware habe, die nur ISO-Latin1 kann und ich
nicht jedes mal Dateinamen konvertieren will beim kopieren.
Ausserdem kann ich keine Sprachen, die nicht von ISO-8859 abgedeckt sind.
Also muss ich die auch nicht lesen oder schreiben koennen.
--
Ullrich Horlacher Server und Virtualisierung
Rechenzentrum TIK
Universitaet Stuttgart E-Mail: ***@tik.uni-stuttgart.de
Allmandring 30a Tel: ++49-711-68565868
70569 Stuttgart (Germany) WWW: https://www.tik.uni-stuttgart.de/
Arno Welzel
2024-07-27 16:16:52 UTC
Permalink
Post by Ulli Horlacher
Post by Peter J. Holzer
Aber warum verwendest Du über 30 Jahre nach der Erfindung von Unicode
noch ISO-8859-x?
Mach ich auch.
Grund ist, dass ich diverse Hardware habe, die nur ISO-Latin1 kann und ich
nicht jedes mal Dateinamen konvertieren will beim kopieren.
Ausserdem kann ich keine Sprachen, die nicht von ISO-8859 abgedeckt sind.
Also muss ich die auch nicht lesen oder schreiben koennen.
Thema verfehlt, setzen, 6.
--
Arno Welzel
https://arnowelzel.de
Ulli Horlacher
2024-07-27 10:17:10 UTC
Permalink
Post by Alexander Goetzenstein
mein von Android stammendes Adressbuch soll lesbare Umlaute erhalten,
also etwa ß statt Ã? oder ü statt ÃŒ usw.
"statt" sieht nach UTF8 ausm als ISO-Latin1 interpretiert,
Post by Alexander Goetzenstein
Nun gibt es ja Tools wie iconv oder recode, die jede menge Optionen und
Zeichensätze bieten. Doch wie finde ich heraus, welche die richtigen
sind? Einfaches durchprobieren scheint mir angesichts der Masse an
möglichen Kombinationen nicht sinnvoll.
Man probiert nur die wahrscheinlichsten Kombinationen.
Post by Alexander Goetzenstein
Ziel dürfte wohl UTF-8 sein, vermute ich, doch wie ermittle ich die Quelle?
Andersrum.
--
Ullrich Horlacher Server und Virtualisierung
Rechenzentrum TIK
Universitaet Stuttgart E-Mail: ***@tik.uni-stuttgart.de
Allmandring 30a Tel: ++49-711-68565868
70569 Stuttgart (Germany) WWW: https://www.tik.uni-stuttgart.de/
Urs Janßen
2024-07-27 10:23:50 UTC
Permalink
Post by Alexander Goetzenstein
Ziel dürfte wohl UTF-8 sein, vermute ich, doch wie ermittle ich die Quelle?
wenn file(1) (evtl. mit -i) nicht ausreicht hilft wohl nur durchprobieren
(uconv(1) o.ae.; hier kommt es auch die "richtige" reihenfolge an, ich wuerd
mit 7bit shift krams anfagen wenn sowas vorkommen kann und mit ISO-8859-x
aufhoeren), uchardet(1)
<https://www.freedesktop.org/wiki/Software/uchardet/>,
enca(1) <https://cihar.com/software/enca/> oder
perl "Encode::Detect" (z.b. via encguess(1) in debian) o.ae.
Martin Schnitkemper
2024-07-27 10:14:36 UTC
Permalink
Post by Alexander Goetzenstein
Ziel dürfte wohl UTF-8 sein, vermute ich, doch wie ermittle ich die Quelle?
Mit "file"
--
‣ Powered by Arch Linux x86_64 🐧 Kernel: 6.9.10-arch1-1 | KDE-Plasma 6.1.3
‣ Installed 3877 days ago, up 6 days, 3 hours, 1 minute
‣ +++ Hätte draufgehen können: Mann hangelt sich unter Brücke durch +++
Alexander Goetzenstein
2024-07-27 11:02:29 UTC
Permalink
Hallo,
Post by Martin Schnitkemper
Post by Alexander Goetzenstein
Ziel dürfte wohl UTF-8 sein, vermute ich, doch wie ermittle ich die Quelle?
Mit "file"
Non-ISO extended-ASCII text, with very long lines (9242), with CRLF, LF line terminators
→ ??
--
Gruß
Alex
Peter J. Holzer
2024-07-27 11:51:45 UTC
Permalink
Post by Martin Schnitkemper
Post by Alexander Goetzenstein
Ziel dürfte wohl UTF-8 sein, vermute ich, doch wie ermittle ich die Quelle?
Mit "file"
Non-ISO extended-ASCII text, with very long lines (9242), with CRLF, LF line terminators
→ ??
Vielleicht enthält das File Daten, die nicht korrekt UTF-8-kodiert sind
(im Gegensatz zu den zwei Zeichen, die Du hier preisgegeben hast).
Oder es ist gar kein Text-File, sondern ein Binärformat, das nur zum
Großteil UTF-8-kodierte Texte enthält.

hp
Martin Schnitkemper
2024-07-27 15:27:48 UTC
Permalink
Post by Martin Schnitkemper
Mit "file"
Non-ISO extended-ASCII text, with very long lines (9242), with CRLF, LF
line terminators
→ ??
Es gibt hier
https://superuser.com/questions/669700/non-iso-extended-ascii-text noch
Lösungsansätze, die anhand eines Skripts die Dekodierung mit allen
möglichen Zeichensätzen versuchen. Das Ergebnis liefert den verwendeten
Zeichensatz und den Text, den kann man dann auf ein bekanntes Wort in der
richtigen Umsetzung suchen.
--
‣ Powered by Arch Linux x86_64 🐧 Kernel: 6.9.10-arch1-1 | KDE-Plasma 6.1.3
‣ Installed 3877 days ago, up 6 days, 8 hours, 8 minutes
‣ +++ Nichtsahnend: Arbeiter verheimlichen Molkereiboss defekte
Rahmzentrifuge +++
Urs Janßen
2024-07-27 15:57:15 UTC
Permalink
Post by Martin Schnitkemper
Lösungsansätze, die anhand eines Skripts die Dekodierung mit allen
möglichen Zeichensätzen versuchen. Das Ergebnis liefert den verwendeten
die zeichensaetze alphabetisch abzugrasen ist eher unklug

urs% od -xa /tmp/jp
0000000 241b 2542 252f 243d 2440 242b 1b69 4228
esc $ B % / % = $ @ $ + $ i esc ( B
0000020 000a
nl

urs% cat /tmp/jp | iconv -f ANSI_X3.4-1968 -t utf-8 ; echo $?
%/%=$@$+$i
0

urs% file -i /tmp/jp
/tmp/jp: text/plain; charset=us-ascii

urs% encguess /tmp/jp
/tmp/jp unknown

urs% uchardet /tmp/jp
ISO-2022-JP

urs% cat /tmp/jp | iconv -f ISO-2022-JP -t utf-8 ; echo $?
クソだから
0
Stefan Ram
2024-07-27 17:21:37 UTC
Permalink
Post by Martin Schnitkemper
Mit "file"
Non-ISO extended-ASCII text, with very long lines (9242), with CRLF, LF line terminators
→ ??
Non-ISO extended-ASCII text

bedeutet, daß der Inhalt der Datei Text ist, der nicht im
ISO-8859-1 (Latin-1) Standard kodiert ist. Statt dessen verwendet
die Datei eine erweiterte ASCII-Kodierung, die Zeichen über
die 256 Zeichen des ISO-8859-1 Standards hinaus unterstützt.
Dies könnte beispielsweise Zeichen aus anderen Zeichencodierungen wie
Windows-1252 oder spezifische nationale Zeichencodierungen umfassen.
Es könnte auch sein, daß verschiedene Teile der Datei unterschiedlich
kodiert sind.

with very long lines (9242)

Diese Angabe weist darauf hin, daß die Datei Zeilen enthält,
die sehr lang sind, in diesem Fall mit einer maximalen Länge
von 9242 Zeichen. Dies kann darauf hindeuten, daß die Datei
möglicherweise Daten in einem Format enthält, das lange Zeilen
erfordert, wie z.B. Konfigurationsdateien oder Datenströme.

with CRLF, LF line terminators

Hier wird erklärt, welche Zeilenendungen in der Datei verwendet
werden.

- CRLF (Carriage Return + Line Feed): Dies ist die
Zeilenendungssequenz, die typischerweise in Windows-Umgebungen
verwendet wird. Sie besteht aus zwei Zeichen: "\r" und "\n".

- LF (Line Feed): Dies ist die Zeilenendungssequenz, die in Unix- und
Linux-Umgebungen verwendet wird. Sie besteht aus einem Zeichen:
"\n".

Das Vorhandensein beider Zeilenendungen deutet darauf hin,
daß Teile der Datei möglicherweise aus verschiedenen Quellen
stammen oder für verschiedene Betriebssysteme erstellt wurden.

Zusammenfassend beschreibt die Ausgabe des file-Kommandos eine Datei,
die:

- Text in einer erweiterten ASCII-Kodierung enthält, die nicht dem
ISO-Standard entspricht.

- Sehr lange Zeilen hat, was auf spezielle Datenstrukturen oder
Formate hinweisen kann.

- Sowohl CRLF als auch LF als Zeilenendungen verwendet, was auf eine
Mischung von Ursprüngen hindeutet.

Diese Informationen könnten nützlich sein, um zu verstehen, wie die
Datei verarbeitet oder konvertiert werden sollte.

Tim Landscheidt
2024-07-27 12:27:00 UTC
Permalink
Post by Alexander Goetzenstein
mein von Android stammendes Adressbuch soll lesbare Umlaute erhalten,
also etwa ß statt ß oder ü statt ÃŒ usw.
Nun gibt es ja Tools wie iconv oder recode, die jede menge Optionen und
Zeichensätze bieten. Doch wie finde ich heraus, welche die richtigen
sind? Einfaches durchprobieren scheint mir angesichts der Masse an
möglichen Kombinationen nicht sinnvoll.
Ziel dürfte wohl UTF-8 sein, vermute ich, doch wie ermittle ich die Quelle?
Wenn Dein „von Android stammendes Adressbuch“ eine vCard-Da-
tei („BEGIN:VCARD“, https://de.wikipedia.org/wiki/VCard)
ist, solltest Du einfach eine entsprechende Bibliothek für
Perl, Python & Co. benutzen, um diese weiterzuverarbeiten.
Sonst ist Deine nächste Frage, wie Du mit dem Zeilenumbruch
umgehst :-).

Tim
Stefan Ram
2024-07-27 12:43:02 UTC
Permalink
Post by Alexander Goetzenstein
mein von Android stammendes Adressbuch soll lesbare Umlaute erhalten,
also etwa ß statt ß oder ü statt ÃŒ usw.
Was "lesbar" ist hängt von der erwarteten Kodierung ab!

Wenn Du bei der Ausgabe einer Datei das hinter "statt" siehst
und das vor "statt" erwartest, dann erwartest Du vermutlich
ISO-8859-1, während die Datei UTF-8-kodiert ist.

Diese Hypothese kannst Du einfach bilden, indem Du bedenkst, daß
UTF-8 solche Sonderzeichen wie Umlaute oder das Eszet mit /zwei/
Oktetten pro Zeichen darstellt und Du ja auch zwei Oktette siehst.

Falls diese Diagnose zutreffen sollte, könntest Du die UTF-8-Datei
dann mit

iconv -f UTF-8 -t ISO-8859-1 input.txt -o output.txt

nach ISO-8859-1 umwandeln. (Vorsicht: Die Datei "output.txt"
wird damit überschrieben, also /gelöscht/!!)

Du könntest alternativ auch Deine Konsole auf UTF-8 umstellen,

export LANG=de.UTF-8

, aber dann würden etwaige ISO-8859-1-Dateien nicht mehr richtig
angezeigt werden.

PS: Wir können unsere Hypothese mit Python überprüfen:

|>>> "ß".encode( 'UTF-8' ).decode( 'ISO-8859-1' )
|'Ã\x9f'

|>>> "ü".encode( 'UTF-8' ).decode( 'ISO-8859-1' )
|'ü'

. Fachbegriff: Mojibake.
Stefan Ram
2024-07-27 13:05:45 UTC
Permalink
Post by Alexander Goetzenstein
mein von Android stammendes Adressbuch
. . .
Post by Alexander Goetzenstein
Ziel dürfte wohl UTF-8 sein, vermute ich, doch wie ermittle ich die Quelle?
Wenn es ein Adreßbuch von Android ist, dann könnte es in "VCF"
("vCard") dargestellt sein. Dann könnte man dem RFC 6350
"vCard Format Specification" entnehmen:

|3.1. Charset
|
|The charset (see [RFC3536] for internationalization terminology) for
|vCard is UTF-8 as defined in [RFC3629]. There is no way to override
|this. It is invalid to specify a value other than "UTF-8" in the
|"charset" MIME parameter (see Section 10.1).

. Die Python-Bibliothek "vobject" kann (nach Installation von
Python selber) leicht mit

pip install vobject

installiert werden. Dann kann man VCF-Dateien mit Python lesen.

Aber da hier die Shell-Gruppe ist, versuch ich es mal mit bash!

Ungetestet, nur als ein Entwurf:

#!/bin/bash

# Überprüfen, ob eine Datei übergeben wurde
if [ "$#" -ne 1 ]; then
echo "Usage: $0 <path_to_vcf_file>"
exit 1
fi

VCF_FILE="$1"

# Überprüfen, ob die Datei existiert
if [ ! -f "$VCF_FILE" ]; then
echo "Die Datei $VCF_FILE existiert nicht."
exit 1
fi

# Ausgabe der Kontakte in Plain Text
echo "Kontakte aus der Datei $VCF_FILE:"
echo "----------------------------------"

# Verwenden von grep und awk, um relevante Informationen zu extrahieren
grep -E 'BEGIN:VCARD|FN:|TEL:' "$VCF_FILE" | \
awk 'BEGIN { RS="BEGIN:VCARD"; FS="\n" }
{
for (i=1; i<=NF; i++) {
if ($i ~ /^FN:/) {
name = substr($i, 4);
printf "Name: %s\n", name;
}
if ($i ~ /^TEL:/) {
phone = substr($i, 5);
printf "Telefon: %s\n", phone;
}
}
print "----------------------------------";
}'

. Ich habe dies aber nicht getestet! - Wahrscheinlich sind noch
Anpassungsarbeiten nötig, um es wirklich zum Laufen zu bringen!
Stefan Ram
2024-07-27 13:24:12 UTC
Permalink
Post by Stefan Ram
printf "Name: %s\n", name;
Das würde aber vielleicht nicht in die Kodierung des
Datensichtgerätes wandeln.

Man könnte statt dessen erst einmal "iconv" verwenden, und dann
"grep" und "sed", um die Datei wie gewünscht zu formatieren.

Um die Kodierung einer Datei zu erkennen, kann man diese auch mit
"xxd" oder "hexdump -C" ausgeben. Da es meist auf die Wahl zwischen
einer ISO-8859-1-Variante und UTF-8 hinausläuft, ist es dann nicht so
schwierig dies zu erkennen, nachdem man einige Beispiele gesehen hat.
Stefan Ram
2024-07-27 14:07:16 UTC
Permalink
Post by Stefan Ram
Man könnte statt dessen erst einmal "iconv" verwenden, und dann
"grep" und "sed", um die Datei wie gewünscht zu formatieren.
Wenn ich einmal annehme, daß es nur diese beiden Kodierungen
ISO-8859-1 und UTF-8 gibt, dann kann ich mit

file -bi input.txt | grep -q 'charset=iso-8859-1' && echo "ISO-8859-1" || echo "UTF-8"

unter bash die wahrscheinliche Kodierung von "input.txt" raten
lassen (nur flüchtig getestet) und mit

filename="input.txt"; file -bi "$filename" | grep -q 'charset=utf-8' && iconv -f UTF-8 -t ISO-8859-1 "$filename" | cat || cat "$filename"

eine Datei, die in ISO-8859-1 oder UTF-8 kodiert ist, entsprechend
der erratenen Kodierung, auf eine ISO-8859-1-Konsole ausgeben
lassen (nur flüchtig getestet).
Stefan Ram
2024-07-27 15:30:20 UTC
Permalink
iconv
Ach ja:

"luit" ist ein Dienstprogramm, das verwendet wird, um den
Zeichensatz eines Computerprogramms zu übersetzen, so daß
dessen Ausgabe korrekt auf einem Terminalemulator angezeigt
werden kann, der einen anderen Zeichensatz verwendet.

Während "iconv" den Zeichensatz von Zeichenfolgen oder Textdateien
im Ruhezustand konvertiert, wandelt "luit" die Eingabe und
Ausgabe von Programmen, die interaktiv ausgeführt werden.
Loading...