PDA

View Full Version : Umlaute Spoolfile



vjordan
06-03-09, 13:39
Hi Forum,

ich will Spoolfiles von der AS400 verarbeiten.

Ich lese sie mit :


PrintParameterList pparam=new PrintParameterList();
pparam.setParameter(PrintObject.ATTR_WORKSTATION_C UST_OBJECT,"/QSYS.LIB/QWPDEFAULT.WSCST");
pparam.setParameter(PrintObject.ATTR_MFGTYPE,"*WSCST");
CharConverter conv=new CharConverter(as400.getCcsid());
PrintObjectTransformedInputStream inStream=spool.getTransformedInputStream(pparam);
int buf=inStream.read();
Das funktioniert auch sehr gut, doch bei Umlauten gibt es Probleme. Für ein ä bekomme ich -124 . An was kann das liegen ?

RobertPic
17-03-09, 01:39
Bei deinem Code fehlt der "spannende" Teil - wie die Zeichen umgewandelt werden.

Wozu ist der CharConverter gut?

Dein Problem wir zu 99% sein, dass die EBCDIC/ASCII-Wandlung bereits erfolgt ist!

Das Umsetzungungsobjekt liefert aber kein Unicode oder ANSI sondern ASCII.

Du kannst die Bytes sammeln um mit new String(bytes, "Cp850") konvertieren.

Spooldateien mit Mehrfach bzw. Fettdruck kommen bei dieser Lösung aber nicht gut weg...

/Robert

Fuerchau
17-03-09, 08:36
Wobei CP850 eher die schlechte Wahl ist.
Ggf. ist CP1252 (Windows ANSI) besser geeignet.

Problematisch wird es ggf. mit anderen CHRID's der Spoolfile, insbesonders für osteuropäisch o.a..

RobertPic
17-03-09, 13:09
Wobei CP850 eher die schlechte Wahl ist.
Ggf. ist CP1252 (Windows ANSI) besser geeignet.


Sein Code funktioniert aber nur mit Cp850. Die QWPDEFAULT.WSCST liefert
eben diese ASCII-Codepage zurück. Mein Posting versteht sich als Hinwis, was er angeben muss, damit Java weiß, wie die Bytes codiert sind.

Möglicherweise liefert QWPDEFAULT auch andere ASCII-Seiten zürck, wenn man z.B. osteuropäische Spools druckt.

Alternativ kann man die Druckstream "Raw" auslesen und selber vom EBCDIC-Stream konvertieren - da sollte nichts daneben gehen.


/Robert

Fuerchau
17-03-09, 13:13
Wie du schon sagst, die Daten liegen in EBCDIC vor, also so, wie sie die Anwendung ausgegeben hat.
Erst beim Senden an den Drucker wird über die im WSCST enthaltene EBCASC-Tabelle in die CP850 ausgegeben.
Wenn du die Daten nativ liest und in z.B. Windows benötigst, musst du sie von EBCDIC nach Windows codewandeln und nicht nach 850 (DOS!).

RobertPic
17-03-09, 14:03
Nocheinmal:

Die von vjordan gepostete Lösung liefert nur Cp850. Java arbeitet intern mit Unicode. Ist der String einmal richtig drinnen, habe ich im Normalfall keine Sorgen mehr - egal ob Windows, Linux oder System i, Bildschirm, File oder Datenbank.

Der kritische Punkt die Wandlung von Bytedaten in String. Da Java hier nicht default "Cp850" annimmt, muss ich das beim Konvertieren angeben. Ab dann läuft alles Java-intern mit Unicode weiter. Die JRE weiss um die Defautlformate für Bildschirm und Dateien.

Wenn ich den Spool (unter Windows) in ein Outfile ausgebe, erhalte ich eine Datei nach ANSI (1252) ohne je dahin zu konvertieren.

Als Quelle wäre zwar sicher EBCDIC zu bevorzugen, aber zu 1252 muss ich in Java selten konvertieren (nur z.B. wenn ich auf der System i, ANSI-Files erzeugen will).

/Robert