Christian Kruse: Zeichencodierung

Beitrag lesen

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