Rolf B: Speichern einer CSV-Datei (utf-8) nach "text/csv;charset=iso-8859-15"

Beitrag lesen

Hallo UDK,

nein, so funktioniert das nicht richtig. Es funktioniert näherungsweise, weil die Unicodezeichen 0x00 bis 0xff mit der ISO-8859-1 Codepage (Latin-1) übereinstimmen. Es gibt aber 8 Zeichen, die in ISO-8859-15 abweichen und im Unicode jenseits der 0xff liegen. Diese 8 Zeichen ersetzen 8 „unnötige“ Zeichen der ISO-8859-1 Codepage. Du musst also 16 Zeichen besonders behandeln:

  • Die Unicodezeichen 0xA4, 0xA6, 0xA8, 0xB4, 0xB8, 0xBC, 0xBD und 0xBE können nicht dargestellt werden (¤, ¦, ¨, ´, ¸, ¼, ½ und ¾), diese musst Du als "nicht darstellbares Zeichen" übersetzen. Ob es in ISO-8859 ein Normzeichen für "Nicht darstellbar" gibt, weiß ich nicht.
  • Die Unicodezeichen, die auf die ersetzten Zeichen abgebildet werden, musst Du übersetzen.
Unicode Zeichen ISO-8859-15
0x20ac 0xa4 (164)
0x0160 Š 0xa6 (166)
0x0161 š 0xa8 (168)
0x017d Ž 0xb4 (180)
0x017e ž 0xb8 (184)
0x0152 Π0xbc (188)
0x0153 œ 0xbd (189)
0x0178 Ÿ 0xbe (190)

Ich würde mir ein Array erzeugen, und erstmal die Indizes 0-255 mit den Werten 0-255 füllen.

Danach wird feingetuned. An den in der Tabelle genannten ISO-8859-15 Indexen trägst Du undefined ein. Und an den in der Unicode-Spalte gannten Indexen den ISO-8859-15 Wert.

Nun kannst Du deinen String Codepoint für Codepoint durchgehen. Erstmal legst Du Dir ein UInt8Array in der Länge wie dein String an, und gehst dann Zeichen für Zeichen durch. Den Codepoint an Stelle i schlägst Du im Übersetzungsarray nach. Findest Du einen Wert (also nicht undefined), trägst Du ihn an Stelle i im UInt8Array ein. Andernfalls ist das Zeichen nicht übersetzbar und Du musst zumindest ein Sonderzeichen für „Nicht darstellbares Zeichen“ eintragen.

Das UInt8Array steckst Du in einen Blob und kannst eine ObjectURL draus machen.

Rolf

--
sumpsi - posui - obstruxi