DB2 EBCDIC in ASCII konvertieren

stareck

Aktives Mitglied
Hallo zusammen,

ich habe ein Problem mit dem EBCDIC-Zeichensatz.

Ich lese Dateien über eine JDBC-Verbindung auf unserer i5 aus. Bei den meisten Dateien funktioniert dies auch ohne Probleme.
Jetzt habe ich heute festgestellt, das es Dateien gibt, wo mir die Werte aus der Datei im EBCDIC-Zeichensatz zurückgegeben werden.

Also wenn ich auf der i5 in die Datei schaue, steht dort z.B. der Wert "00000", wenn ich mir diesen Wert nun über die JDBC-Verbindung hole, dann bekomme ich einen String mit dem Wert "F0F0F0F0F0".

Kann mir von euch jemand sagen, warum dies bei einigen Dateien der Fall ist?
Ich vermute es liegt daran, wie die Datei erstellt worden ist, wenn es eine SQL-Table ist scheint es zu klappen und wenn die Datei über "DDS" angelegt wurde scheint es nicht zu klappen.


Dann brauche ich noch eure Hilfe, wie ich diesen Wert nun nach "00000" konvertieren kann.
Ich habe es schon über eine Codepage versucht, aber es klappt irgendwie nicht...

Vielen Dank schonmal:)

Gruß
Stareck
 

robertpic71

Bekanntes Mitglied
Die Dateien, welche nicht automatisch richtig angezeigt werden, haben wahrscheinlich CCSID 65535 (= Binary). Das ist oft ein "Versehen", kann aber auch gewünscht sein um z.B. mehrere Sprachen ein einer Tabelle abzulegen.

Den CCSID kann man mit auf der Maschine mit DSPFD LIB/FILE abfragen (nach CCSID suchen).
237=Deutsch, 1141=Deutsch inkl. Eurozeichen

In Java gibt es mehrere Möglichkeiten, die einfachste ist einfach den Connectionstring anzupassen:

Den Connectionsstring um folgendes erweitern:
;translate binary=true


Alternativ kann man das Feld als bytearray holen und selber wandeln:
Code:
rohDaten = retRs.getBytes(1);
String dta;
  			
// variable Stringlänge erkennen und "wegschneiden"
if (rohDaten[0] >= 0x00 & rohDaten[0] < 0x09 & rohDaten.length > 2) {
   dta = new String ( rohDaten, "CP273").substring(2);
} else {
  dta = new String ( rohDaten, "CP273");
}
Die Abfrage dahinter dient der Erkennung der variablen Strings. Die haben in den ersten beiden Bytes die Länge eingetragen - die nicht mitkonvertiert werden darf.

Die Codepage CP273 ist Teil der Toolboxtreiber (JT400 oder JTOPEN).

Die 3. Variante ist noch direkt im SQL zu casten:
SELECT Cast(fieldname as char(120) CCSID 273) FROM tablename

Wenn die Programme native auf der i5 laufen dann reicht es wenn der Jobid <> 65535 ist, also z.B. 273 oder 1141 ist.
 

stareck

Aktives Mitglied
Hallo robertpic71,

mit der CCSID hatte ich auch gesehen, wusste jetzt aber nicht ob es daran liegt:)

Ich werde das am Montag morgen testen...

Dann schonmal vielen Dank!!!!!!


Gruß
Stareck
 

Ähnliche Java Themen

Neue Themen


Oben