Anmelden

View Full Version : UTF 8 ohne BOM



camouflage
30-08-16, 14:41
Hallo Forum

Ich hab mal wieder eine tricky Aufgabe. Ich soll ein UTF 8 File erstellen welches als Datenaustausch für Labeldrucke steht. Definiert hab ich's als CCSID 1208 mit einem 1024 Char Feld (1208).

Mit dem CPYTOIMPF erhalte ich im IFS eine UTF8 ohne BOM Datei (zusätzlich noch einen FTP auf einen MS Server). Leider rennt das Druckprogramm auf irgendwelche Index Fehler, welche ich nicht verfizieren kann, da das Pgm nicht von mir stammt.

Irgendwie schnallt er die nachfolgenden Zeilen nicht, obwohl sie mit CRLF getrennt sind.

Frage: Hat da jemand Erfahrung mit dieser Problematik, bzw. weiss wie ein UTF8 mit BOM erstellt wird.

Danke für die Hilfe.

Fuerchau
30-08-16, 16:53
Ich denke, der Grund wird hier ein anderer sein.
Was ist BOM?
https://de.wikipedia.org/wiki/Byte_Order_Mark
Wie du siehst, ist BOM bei UTF-8 überhaupt nicht sinnvoll, da es keine Byteorder gibt.
Nötig ist das bei UTF-16/Unicode, da hier durch unterschiedliche Rechnerarchitekturen die Bytefolge (LO/HI bzw. HI/LO) festgelegt werden muss.

Wenn du eine BOM benötigst, dann musst du eine Datei im IFS mit den 2 Bytes per "Echo >MyBOM" erstellen. Im Echo kann man auch irgendwie Hex/Ocatal-Werte ausgeben.
Dann gibst du deine Daten in eine 2. Datei "MyData" aus.
Per "cp MyBOM MyData DestData" verkettest du die Dateien dann für das Versenden.
Der "cp" kopiert alle aufgeführten Dateien in die letzte angegeben Datei.
Alternativ geht auch "cat MyBOM MyData >DestData".

tierock
31-08-16, 07:55
Hallo camouflage,

ich hatte ein ähnliches Problem und habe das so gelöst:
- temp. PF mit fester Satzlänge erstellen
- per Pgm füllen
die Felder mit einem Trennzeichen trennen und am Ende der Zeile einen CRLF ausgeben
D $CRLF C CONST(X'0D25')
D $TRENNER S 1A INZ(';')
- temp. PF ins IFS kopieren
CPYTOSTMF FROMMBR('/qsys.lib/qtemp.lib/datei.file/datei.mbr')
TOSTMF('/zielordner/zieldatei.csv') DBFCCSID(1141) STMFCCSID(1208)

Vielleicht nicht schön, funktioniert aber.

Gruß Carsten

Fuerchau
31-08-16, 09:30
Das ist jetzt eigentlich nicht viel anderes als das, was der CPYTOIMPF ebenso macht.
Worin soll da der Vorteil liegen?
Und wenn dein CRLF nicht am Ende des Satzes steht hast du jede Menge Leerzeichen in der neuen Zeile.
Machst du dein CRLF aber immer am Ende, sind nach deinem letzten ";" bzw. dem letzten Feld (das nicht mit ";" abgeschlossen werden muss), noch jede Menge Leerzeichen, was beim CPYTOIMPF nicht der Fall ist.

camouflage
31-08-16, 09:45
Danke für die Hilfe, Ansätze und Zeit.

Ich mach's ja so ähnlich wie tierock empfohlen, da mir der FTP von der fixen Recordlänge die Leerzeichen mitnimmt. Also mach ich zuerst einen "Trailing" CPYTOIMPF (weil nur ein Feld) in's IFS und nachher den FTP auf den MS-Server. Funktioniert.

Der Fehler lag jedoch nicht im Format, sondern an einem nicht erkannten Feld - so dass das externe Progamm auf den Fehler lief. Alles nicht so wild, Bug erschossen, alle glücklich.