Zeichencodierung
JürgenB
- codierung
- javascript
1 Rolf B0 Rolf B
1 Christian Kruse0 JürgenB0 Rolf B0 Der Martin0 JürgenB
Hallo,
ich lese aus den EXIF-Daten eines Fotos eine Bytefolge:
77 101 105 110 32 83 116 101 108 108 112 108 97 116 122 32 105 110 32 66 114 117 99 104 119 101 105 108 101 114 45 66 195 164 114 101 110 98 97 99 104
Diese Bytes wandle ich mit String.fromCharCode(byte)
in einen String um, und erhalte das Ergebnis:
Mein Stellplatz in Bruchweiler-Bärenbach
Das ist natürlich nicht das gewünschte, ich erwarte eigentlich
Mein Stellplatz in Bruchweiler-Bärenbach
was daran liegt, dass im EXIF das ä
als 195 164
codiert ist.
Gibt es eine Stringfunktion, die die Codierung erkennt und in UTF-8 umwandelt?
Bzw. wie kann ich erkennen, welche Codierung vorliegt und wie kann ich sie lesen?
Gruß
Jürgen
Hallo JürgenB,
das ist offensichtlich UTF-8. Und beim Rest hat mir Onkel Bing Googlesby geholfen:
Pack die Bytes in ein UInt8Array, das ist eine Implementierung von ArrayBufferView, und das versteht der Kollege hier:
let exifData = new TextDecoder("utf-8").decode(exifBytes);
Quelle: SO, Antwort von James
Es brummt jedoch der A-Bär: UTF-8 ist nicht obligatorisch. Es geht auch ASCII oder Latin-1. Das kann der TextDecoder auch, du musst nur wissen, was vorliegt.
Guck mal hier, gefunden via Link hier.
Rolf
Hallo Rolf,
hast wohl nicht recht zu Ende gelesen.
Wenn Du im String Zeichensequenzen findest, von denen die erste mit einem Code von 192-255 beginnt und die zweite mit einem Code von 128-191, dann ist das ein Indiz für UTF-8, aber sicher ist das nicht.
Und wenn ich Exif beim zweiten Lesen richtig deute, dann ist diese IPTC-Codierungsmarkierung nicht Teil von Exif.
Rolf
Hallo Rolf,
Wenn Du im String Zeichensequenzen findest, von denen die erste mit einem Code von 192-255 beginnt und die zweite mit einem Code von 128-191, dann ist das ein Indiz für UTF-8, aber sicher ist das nicht.
Und wenn ich Exif beim zweiten Lesen richtig deute, dann ist diese IPTC-Codierungsmarkierung nicht Teil von Exif.
Freundliche Grüße,
Christian Kruse
Hallo Christian,
aba nich so deutlsch
Rolf
Hallo JürgenB,
ich lese aus den EXIF-Daten eines Fotos eine Bytefolge:
77 101 105 110 32 83 116 101 108 108 112 108 97 116 122 32 105 110 32 66 114 117 99 104 119 101 105 108 101 114 45 66 195 164 114 101 110 98 97 99 104
Wie genau?
Diese Bytes wandle ich mit
String.fromCharCode(byte)
in einen String um, und erhalte das Ergebnis:Mein Stellplatz in Bruchweiler-Bärenbach
Das ist natürlich nicht das gewünschte, ich erwarte eigentlich
Mein Stellplatz in Bruchweiler-Bärenbach
was daran liegt, dass im EXIF das
ä
als195 164
codiert ist.
Genau genommen ist das gar nicht so klar. Die meisten Kameraus benutzen inzwischen UTF-8, aber ich habe auch schon Latin1 gesehen.
Gibt es eine Stringfunktion, die die Codierung erkennt und in UTF-8 umwandelt?
Nein. Geht auch nicht. Du kannst höchstens mit Heuristiken versuchen zu raten, welche Kodierung vorliegt (hier wohl UTF-8). Und die kannst du dann auch in einen JS-String umwandeln, mit dem TextDecoder
-Objekt. In diesem Fall:
const ary = new Uint8Array([77, 101, 105, 110, 32, 83, 116, 101, 108, 108, 112, 108, 97, 116, 122, 32, 105, 110, 32, 66, 114, 117, 99, 104, 119, 101, 105, 108, 101, 114, 45, 66, 195, 164, 114, 101, 110, 98, 97, 99, 104]);
const decoder = new TextDecoder();
console.log(decoder.decode(ary));
Das ergibt korrekt deinen erwarteten String; allerdings kannst du dir nicht sicher sein, dass immer UTF-8 im EXIF vorliegt… daher würde ich es vom User angeben lassen. Das hat sich als die so ziemlich einzige funktionierende Variante gezeigt.
Freundliche Grüße,
Christian Kruse
Hallo,
daher würde ich es vom User angeben lassen. Das hat sich als die so ziemlich einzige funktionierende Variante gezeigt.
es fällt mir schwer, mir das vorzustellen. Denn das Thema Zeichencodierung ist für einen Großteil der Nutzer immer noch ein Buch mit sieben Siegeln.
Das fängt schon damit an, dass "Unicode" für manche bedeutet, Zeichen in HTML als NCR zu notieren.
Live long and pros healthy,
Kartin
Hallo Martin,
daher würde ich es vom User angeben lassen. Das hat sich als die so ziemlich einzige funktionierende Variante gezeigt.
es fällt mir schwer, mir das vorzustellen. Denn das Thema Zeichencodierung ist für einen Großteil der Nutzer immer noch ein Buch mit sieben Siegeln.
Richtig. Und dann fragen sie nach. Und ich kann es ihnen erklären. Working as intended 😉
Was sich als extrem unzuverlässig herausgestellt hat: raten aufgrund von irgendwelchen Bytes.
Freundliche Grüße,
Christian Kruse
Hallo,
ich antworte mal hier.
Vielen Dank!
Ich habe für TextDecoder
den Defaultwert utf-8
genommen. Ich glaube, den User aus den ca. 50 möglichen Codierungen wählen bzw. raten zu lassen, führt zu nichts.
Gruß
Jürgen
Hallo JürgenB,
meinst Du, die Varianten bei EXIF gehen über das hinaus, was bei IPTC steht? Also Ascii, Latin-1 und UTF-8?
Ok, man weiß nicht was russische Fotografen mit ihren Exif-Daten machen...
Rolf
Hallo,
meinst Du, die Varianten bei EXIF gehen über das hinaus, was bei IPTC steht? Also Ascii, Latin-1 und UTF-8?
Ok, man weiß nicht was russische Fotografen mit ihren Exif-Daten machen...
oder chinesische, oder arabische ...
Live long and pros healthy,
Martin
Hallo Rolf,
das Description-Feld kann auch in Bildverarbeitungssoftware beschrieben werden, nicht nur in Kameras. Da ist wahrscheinlich alles möglich. Aber selbst wenn ich dem User nur wenige Möglichkeiten anbiete, wird es bei den Meisten auf Raten hinauslaufen.
Da ist es für den User einfacher, für die Weiterverarbeitung den Text von Hand zu korrigieren.
Gruß
Jürgen
Hallo JürgenB,
Aber selbst wenn ich dem User nur wenige Möglichkeiten anbiete, wird es bei den Meisten auf Raten hinauslaufen.
Raten ist doch OK. Ich verwende dafür oft eine UI, bei der die Änderung der Auswahl eine Vorschau aktualisiert, sodass sich der User daran orientieren kann. Z.B. oben das Auswahlfeld für die Kodierung, darunter der mit der aktuellen Auswahl dekodierte Text. Der User kann dann anhand der Vorschau die richtige Kodierung auswählen.
Freundliche Grüße,
Christian Kruse
Hallo Christian,
Raten ist doch OK. Ich verwende dafür oft eine UI, bei der die Änderung der Auswahl eine Vorschau aktualisiert, sodass sich der User daran orientieren kann. Z.B. oben das Auswahlfeld für die Kodierung, darunter der mit der aktuellen Auswahl dekodierte Text. Der User kann dann anhand der Vorschau die richtige Kodierung auswählen.
verdammt, ich war wohl zu langsam. 😉
Live long and pros healthy,
Martin
Hallo,
das Description-Feld kann auch in Bildverarbeitungssoftware beschrieben werden, nicht nur in Kameras. Da ist wahrscheinlich alles möglich. Aber selbst wenn ich dem User nur wenige Möglichkeiten anbiete, wird es bei den Meisten auf Raten hinauslaufen.
und ich könnte mir vorstellen, eine komfortable Lösung wäre: Raten, dabei zwei oder drei wahrscheinliche Möglichkeiten herausfinden, eine Vorschau anzeigen, wie die Decodierung dieser Möglichkeiten aussähe - und dann den Nutzer entscheiden lassen.
Da ist es für den User einfacher, für die Weiterverarbeitung den Text von Hand zu korrigieren.
Das wäre natürlich auch eine Alternative.
Live long and pros healthy,
Martin