(gelöst) Aus Internet kopiertes Zeichen bestimmen

Vom einfachen Programm zum fertigen Debian-Paket, Fragen rund um Programmiersprachen, Scripting und Lizenzierung.
Antworten
fischig
Beiträge: 4124
Registriert: 24.12.2019 12:25:08
Lizenz eigener Beiträge: MIT Lizenz

(gelöst) Aus Internet kopiertes Zeichen bestimmen

Beitrag von fischig » 26.07.2020 12:52:14

Ich habe hier in einem Textschnipsel aus einer Internetseite ein Zeichen in einer Textdatei, das sich anschaut wie ein deutsches Auslassungszeichen, das ich auch als Apostroph bezeichne, das aber offenbar keines ist. Ich will den Schnipsel in ASCII-Text umwandeln.
Wenn ich das Zeichen auf dieser Seite (1) suchen lasse, kriege ich zwei Ergebnisse. 8O
Wenn ich hier (2) suche, kriege ich zwar nur eines, aber das ist es offenbar nicht, denn wenn ich das Zeichen aus meinem Textschnipsel kopiere und in dieses Kommando als umzuwandelndes einfüge,

Code: Alles auswählen

sed s/’/$'\u0027'/g -i datei.txt
dann wird daraus offenbar u0027 und der so umgewandelte Text lässt sich dann weiter in ASCII umwandeln.

Kennt jemand eine Internet-Seite, in die man ein solches - ich nehme mal an UTF-8-Zeichen - kippen kann, und die einem dann nicht nur eindeutig sagt, welcher UTF-8-Code das ist, sondern auch, ob's dafür ein ASCII-Zeichen gibt, und wenn ja, welches.

(Dass jetzt niemand auf die Idee kommt, ich könnte mit hexadezimalen Zahlen oder mit sed ausreichend umgehen, aber so manche Analogie-Schlüsse gelingen mir mitunter, mehr kann ich nicht.)


(1) http://www.gemeinde-michendorf.de/homep ... entity.php
(2) https://www.utf8-zeichentabelle.de/
Zuletzt geändert von fischig am 28.07.2020 09:25:26, insgesamt 1-mal geändert.

fischig
Beiträge: 4124
Registriert: 24.12.2019 12:25:08
Lizenz eigener Beiträge: MIT Lizenz

Re: Aus Internet kopiertes Zeichen bestimmen

Beitrag von fischig » 27.07.2020 18:54:01

Also gut, versuch' ich's mal so 'rum:

Ich kippe das Auslassungszeichen, das mein Browser (palemoon 28.9.3) in der Inhaltsangabe auf dieser Seite https://www.cinema.de/film/vera-cruz,1339892.html (es gibt nur eines) auf den Bildschirm meines Rechners (Buster) malt, in das Suchfeld auf dieser Seite https://prlbr.de/2010/11/unicode-helferlein/. Dies „erzähl[t man] mir mehr“:

Code: Alles auswählen

Unicode-Codepunkt (hex): 2019
Unicode-Codepunkt (dez): 8217

UTF-8-Bytes (hex): E2, 80, 99
UTF-8-Bytes (dez): 226, 128, 153

UTF-8, ASCII-String: \xE2\x80\x99
UTF-8, URL-kodiert: %E2%80%99
Unter Benutzung welcher Syntax kriege ich das jetzt als umzuwandelndes Zeichen in ein bash-script mit sed

Code: Alles auswählen

sed s //...
?

Benutzeravatar
MSfree
Beiträge: 11610
Registriert: 25.09.2007 19:59:30

Re: Aus Internet kopiertes Zeichen bestimmen

Beitrag von MSfree » 27.07.2020 19:16:25

Der Text auf der Webseite ist UTF8. Nach ASCII läßt sich das nicht verlustfrei konvertieren.

Siehe hier:
https://unix.stackexchange.com/question ... est-effort

Wenn ich den Satz mit dem Apostroph
Aber auch Trane und Erin könnten’s gut gebrauchen
durch die bei stackexchange vorgeschlagene Lösung mit iconv schicke, erhalte ich:
Aber auch Trane und Erin konnten's gut gebrauchen
Der Umlaut geht also flöten.

DeletedUserReAsG

Re: Aus Internet kopiertes Zeichen bestimmen

Beitrag von DeletedUserReAsG » 27.07.2020 21:06:01

Man könnte auch in den Chat kommen, da ist ’ne Maschine, die kann das:
‎27.07.2020 | 21:05:16 ‎Нихтс‎: urlbug, decode ’
‎27.07.2020 | 21:05:17 ‎urlbug‎: Нихтс: ’ (\u2019) is called "RIGHT SINGLE QUOTATION MARK"
Die paar ASCII-Zeichen dürfte man eigentlich im Kopf haben, so dass es dazu keine Maschinen braucht. Ansonsten gibt’s Tabellen.

fischig
Beiträge: 4124
Registriert: 24.12.2019 12:25:08
Lizenz eigener Beiträge: MIT Lizenz

Re: Aus Internet kopiertes Zeichen bestimmen

Beitrag von fischig » 27.07.2020 22:43:51

MSFree hat geschrieben:Nach ASCII läßt sich das nicht verlustfrei konvertieren.
Doch, geht, nur nicht direkt.
ASCII ist nicht das Problem. Ich muss das Zeichen erst mal in dieses andere UTF-8-Zeichen umwandeln, bevor iconv dran kommt.
Z.B. so

Code: Alles auswählen

sed s/???/$'\u0027'/...
Wenn ich recht sehe, gibt's verschiedene Schreibweisen für UTF-8-Bezeichner, die man im sed-Kommando einsetzen kann, und je nachdem, welche man wählt, ist die vom-Rücken-durch-die-Brust-ins-Knie-shell-Syntax: das Maskieren/Expandieren von Variablen(-Inhalten) eine andere/s. Und wenn ich als shell bash benutze, gilt nochmal was Spezielles. Darin bin ich nicht fit und da knie ich mich auch nicht rein. Ich hätte gerne, dass mir jemand konkret sagt, welche Ausdruckskombination da jetzt je nach Wahl zwischen die beiden ersten slashes muss - wenn's beliebt.

Wenn ich das Zeichen direkt einfüge, so wie im 1. Beitrag angegeben, wird korrekt umgewandelt und dann funktioniert anschließend auch die Umwandlung in ASCII mit iconv.

Ich könnt's ja dabei belassen, aber ich weiß gern, was ich tue, und am Bildschirm die verschiedenen Apostroph-Möglichkeiten zu diskriminieren, vermag ich nicht zweifelsfrei. Mir wär's lieber, ich wüsste eine korrekte UTF-8-Bezeichnung für das jeweilige Zeichen.
niemand hat geschrieben:Man könnte auch in den Chat kommen
Kenne ich nicht. Möchte ich auch wahrscheinlich nicht. Mir ist das Forumsposten schon mitunter nicht recht geheuer.

PS „…“ die drei Auslassungspunkte sind ebenfalls EIN UTF-8 Zeichen, für dass es keine Entsprechung in ASCII gibt, müssen also zunächst in DREI UTF-8-Punkte umgewandelt werden.

wanne
Moderator
Beiträge: 7558
Registriert: 24.05.2010 12:39:42

Re: Aus Internet kopiertes Zeichen bestimmen

Beitrag von wanne » 28.07.2020 05:26:07

ASCII ist ein Subset von UTF-8. Da kann man nichts konvertieren. Entweder es ist schon ASCII. Oder es lässt sich nicht in ASCII darstellen.
Ich weiß nicht was du für ein Problem hast. ich würde es halt kopieren und in die Konsole Pasten.
Beispiel:

Code: Alles auswählen

echo -n ’ | hexdump -C
e2 80 99
echo -n ’ | iconv -t ucs4 | hexdump -C
00 00 20 19
=> UTF-8 Zeichen e2 80 99 (in Hex). Bzw. Unicode 2019 in hex bzw. 8217 in Dezimal. Da die Zahl größer als 128 bzw. 0x80 ist, ist das kein ASCII Zeichen und kann auch nicht in ASCII umgewandelt werden.
Das andere:

Code: Alles auswählen

echo -n \' | hexdump -C
27
echo -n \' | iconv -t ucs4 | hexdump -C
00 00 00 27
das aber offenbar keines ist. Ich will den Schnipsel in ASCII-Text umwandeln.
Nur weil Zeichen sehr in einigen Schriftarten sehr ähnlich aussehen sind sie halt nicht gleich. – Wie du die bezeichnest kann keine Webseite der Welt wissen. Dazu fehlt die Glaskugel.
Das für deutsche Auslassungen korrekte (2729) (Üblicherweise einen Punkt mit einem nach unten weisenden Abstrich, der im Uhrzeigersinn gekrümmt ist) ist halt nicht der gerade Strich (2728) auf der Schreibmaschine (stell eine vernünftige Schriftart ein, dann siehst du den Unterschied deutlich.) der für alle möglichen Zeichen insbesondere auch Minuten Missbraucht wird erst mal wenig zu tun.
Es gibt einige Übersetzer von Unicode in ASCII da ist aber wie beim Sprachen übersetzen einiges an Phantasie gefragt und das nie 100% äquivalent mit dem Original sein können. Das ganze von Rechnern machen zu lassen macht die Sache nicht besser. unidecode versucht möglichst ähnlich aussehende Zeichen zu finden, was sehr primitiv ist aber oft zu ziemlicher Unlesbarkeit führt. Insbesondere bei Japanisch oder kyrillische nutzende Sprachen abseits von russisch versteht man da gar nichts mehr. unihandecode verhält sich intelligenter und sucht Umschreibungen.
Beispieil: ö
unihandecode macht im deutschen aus „Höle“ "Hoele". unidecode würde daraus "Hole" machen.
rot: Moderator wanne spricht, default: User wanne spricht.

fischig
Beiträge: 4124
Registriert: 24.12.2019 12:25:08
Lizenz eigener Beiträge: MIT Lizenz

Re: Aus Internet kopiertes Zeichen bestimmen

Beitrag von fischig » 28.07.2020 09:24:50

Also gut, ich lasse mal dahingestellt sein, ob ich mich wieder zu umständlich ausgedrückt habe oder ob nicht genau genug gelesen wurde.
Da es mir wie üblich keiner „mundgerecht serviert“ sagen wollte oder aufgrund mangelnden Textverständnisses nicht sagen konnte, habe ich's jetzt endlich via trial and error selbst rausgefunden: u2019 (also die hexadezimale Schreibweise des Bezeichners) macht den Job in diesem sed-Kommando

Code: Alles auswählen

sed s/$'\u2019'/$'\u0027'/g -i [datei].txt
Zur Erklärung in meinem (vorläufigen) Verständnis: u2019 ist eine Form des Apostrophs, die nicht unmittelbar in ASCII (hex 27, bzw dez 39) umgewandelt werden kann. u0027 (hex) kann in das ASCII-Zeichen umgewandelt werden.

wanne
Moderator
Beiträge: 7558
Registriert: 24.05.2010 12:39:42

Re: Aus Internet kopiertes Zeichen bestimmen

Beitrag von wanne » 28.07.2020 14:12:20

fischic hat geschrieben: ↑ zum Beitrag ↑
28.07.2020 09:24:50
Zur Erklärung in meinem (vorläufigen) Verständnis: u2019 ist eine Form des Apostrophs, die nicht unmittelbar in ASCII (hex 27, bzw dez 39) umgewandelt werden kann. u0027 (hex) kann in das ASCII-Zeichen umgewandelt werden.
Jaein. u0027 ist Bereits ASCII. ASCII hat einfach die Zeichen 0-127 definiert. Unicode hat einfach jenseits der 128 weiter gemacht.
Also gut, ich lasse mal dahingestellt sein, ob ich mich wieder zu umständlich ausgedrückt habe oder ob nicht genau genug gelesen wurde.
Zumindest ich habe dich falsch verstanden. Ich dachte du willst ein Kommando haben, dass beliebige UTF-8 Zeichen in UTF-8 umwandelt. Deswegen habe ich dir unihandecode und unidecode empfohlen.

Wenn du nur die unterschiedlichen Apostrophe in Unicode in ASCII umwandeln willst, geht das natürlich einfacher.

Eventuell willst du das selbe für 02BC und 02C8 (Die Dinger aus der Lautschrift), 2018 (Einfaches schließendes Anführungszeichen), 2032 (Bogenminute), 02BB (Okina) machen.
rot: Moderator wanne spricht, default: User wanne spricht.

fischig
Beiträge: 4124
Registriert: 24.12.2019 12:25:08
Lizenz eigener Beiträge: MIT Lizenz

Re: (gelöst) Aus Internet kopiertes Zeichen bestimmen

Beitrag von fischig » 28.07.2020 14:56:18

Ich dachte du willst ein Kommando haben, dass beliebige UTF-8 Zeichen in UTF-8 umwandelt.
Nein, nein, es ging mir nur um dieses eine Zeichen. Ich habe schon ein kleines batch-bash-script, in dem ich solche nicht direkt in ASCII wandelbare UTF-Zeichen sammle (wenn sie mir zufällig aufstoßen) und die ich im script via sed durch entsprechende utf-8-Zeichen ersetze, die dann auch in ASCII umgewandelt werden können. Ich verstehe halt nicht soviel von shell-Syntax und da ich schon unsicher war, welcher u1234/u+1234-Bezeichner für das fragliche Zeichen der passende war, war mir weiterhin völlig unklar, mit welchen shell-Syntax-Ausdrücken ich den denn in meinem sed-Shell/Bash-script traktieren sollte. Dass man da insbesondere auf Eigenheiten der bash aufpassen muss, hast nicht zuletzt du mich gelehrt! :wink:

Und danke für deine Beteiligung und auch die von MSFree!

Antworten