JürgenB: Zeichencodierung

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

akzeptierte Antworten

  1. 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

    --
    sumpsi - posui - obstruxi
    1. 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

      --
      sumpsi - posui - obstruxi
      1. 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.

        sag ich ja 😉

        Und wenn ich Exif beim zweiten Lesen richtig deute, dann ist diese IPTC-Codierungsmarkierung nicht Teil von Exif.

        sag ich ja 😉

        Freundliche Grüße,
        Christian Kruse

        1. Hallo Christian,

          aba nich so deutlsch

          Rolf

          --
          sumpsi - posui - obstruxi
          1. Hallo Rolf,

            😂

            Freundliche Grüße,
            Christian Kruse

  2. 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 ä als 195 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

    1. 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

      --
      Versuchungen sollte man nachgeben. Wer weiß, ob sie wiederkommen.
      1. 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

  3. 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

    1. 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

      --
      sumpsi - posui - obstruxi
      1. 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

        --
        Versuchungen sollte man nachgeben. Wer weiß, ob sie wiederkommen.
      2. 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

        1. 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

          1. 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

            --
            Versuchungen sollte man nachgeben. Wer weiß, ob sie wiederkommen.
        2. 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

          --
          Versuchungen sollte man nachgeben. Wer weiß, ob sie wiederkommen.