PDA

View Full Version : Dataqueue und Unicode



Seiten : [1] 2

KM
05-12-05, 16:37
Hallo,

ich stehe momentan irgendwie auf dem Schlauch. Ich muß von einem RPG-Programm aus eine DTAQ mit Unicode-Feldern beschicken (Datentyp C -> UCS2). Das klappt auch soweit. Diese DTAQ will ich dann in einem Java-Programm wieder auslesen. Nur erhalte ich dann nicht die gewünschten Unicode-Texte, sondern die EBCDIC-Darstellung des Unicodes, wie z.B.:

, ? > Ê / À _ / Ñ À È Ë Ç ? ø

Egal, ob ich in Java das Feld in dem Record mit CharacterFieldDescription oder mit DBCSGraphicFieldDescription definiere, ich erhalte immer diese Zeichen.
Wie muß ich denn vorgehen, um diese Unicodefelder korrekt einzulesen ? Hat sowas schon mal jemand von Euch gemacht ?

Gruß,
KM

Fuerchau
05-12-05, 17:06
DAS nenne ich mal ein Problem.
In VB gibt es entsprechende Funktionen (StrConv), die aus 2 Bytes wieder den UCS-2 zaubern.
Hier hast du das Problem, dass die Daten in die DATQ binär geschrieben werden, also im 2-Byte-Format.
Wenn du nun aus der DTAQ liest musst du das im Binär-Format hinkriegen (k.A. welcher Java-Typ) und dann jeweils 2-Bytes als Short interpretieren und in Zeichen umwandeln. In VB währe das CHR(Wert).

Ich nehme mal an, dass IBM's JavaToolbox Unicode bei DTAQ's vergessen hat.

Deficiency
06-12-05, 10:59
HI KM!

So ich hatte ungefähr das gleiche Problem. Probier es mal damit:


byte[] b = returnstr.getBytes("CP870"); // Umwandlung des Übergabeparameters in Byte
returnstr = new String ( b,CP273);//Umwandlung von Byte to String mit 870 Codepage

So hab ich ne umformung gemacht, funktioniert auch mit UCS-2 musst halt i18n´.jar einbinden. Dann funktioniert das!!!


Gruß

KM
06-12-05, 12:06
Jetzt bin ich ein Stückchen weiter gekommen. Aber so ganz funktioniert's noch nicht.

Ich schicke z.B. im RPG-Programm einen Namen als Unicode-Feld (UCS-2) an eine DTAQ (z.B. Vorname.Nachname).

Im Java-Programm habe ich folgendes gemacht:

HexFieldDescription hfd_empfaenger = new HexFieldDescription(new AS400ByteArray(50), "Empfänger");
RecordFormat dataFormat = new RecordFormat();
dataFormat.addFieldDescription(hfd_empfaenger);
.
.
.
DataQueueEntry DQData = dq.read(-1);
Record data = dataFormat.getNewRecord(DQData.getData());
byte[] empfaenger_ba = (byte[]) data.getField("Empfänger");
empfaenger = new String(empfaenger_ba);

In dem String empfaenger steht jetzt vor jedem Buchstaben des Namens eine Leerstelle (z.B. V o r n a m e . N a c h n a m e). Die Zeichen selbst sind jedoch richtig. Wie kann ich nun diese vielen Leerstellen vermeiden ?

Gruß,
KM

Fuerchau
06-12-05, 14:25
Das scheint nur so !
Sende mal Umlaute oder andere Sonderzeichen, diese sind dann mit Hexwerten >256 definiert, so dass du die Zeichen nicht korrekt sehen kannst.
Du musst nun aus dem Byte-Array irgendwie einen String machen, der aus jeweils 2 Byte-Paaren ein Unicode-Zeichen macht.

Vielleicht gibts da ja noch Konvertierungen á la String2Byte / Byte2String ?!

Deficiency
06-12-05, 15:15
Vielleicht wenn du UTF-16 nimmst!
UCS2 und UTF16 sind (fast) id...
Ich überlege aber noch vielleicht fällt mir noch was ein!!!

KM
07-12-05, 09:18
Jetzt habe ich die Lösung zu meinem Problem gefunden. Ich weiß zwar nicht, ob es die beste ist. Aber sie funktioniert zumindest. Hier ein Ausschnitt aus dem Code:

HexFieldDescription hfd_empfaenger = new HexFieldDescription(new AS400ByteArray(100), "Empfänger");
RecordFormat dataFormat = new RecordFormat();
dataFormat.addFieldDescription(hfd_empfaenger);
DataQueue dq = new DataQueue(as400, "/QSYS.LIB/DTOBJ.LIB/EMAILANGEB.DTAQ");
DataQueueEntry DQData = dq.read(-1);
while (true){
Record data = dataFormat.getNewRecord(DQData.getData());
AS400Text textConverter1 = new AS400Text(empfaenger_len, 13488, as400);
dq_ba = (byte[]) data.getField("Empfänger");
empfaenger = (String) textConverter1.toObject(dq_ba);

Entscheidend hierbei ist, dass die Daten als Byte-Array eingelesen werden. Deshalb die HexFieldDescriotion. Außerdem ist noch ein Converter nötig (hier die Klasse AS400Text), mit dem man die Daten aus dem Byte-Array gemäß angegebener CCSID (hier 13488 für Unicode) wieder in einen String konvertiert. Beachtet werden muß, dass die Länge immer doppelt so groß angegeben werden muß als Zeichen vorhanden sind, da ja pro Zeichen 2 Byte belegt werden.

Gruß,
KM

Fuerchau
07-12-05, 09:36
UCS2 und UTF-16 sind grundsätzlich verscheiden !
UCS2 ist ein fixer 2-Byte-Code.
UTF-16 ist ein variabler 1-2-Byte-Code.

@KM
Ich denke auch Java wird irgendwo einen String-Converter haben um aus Byte-Arrays einen String bzw. umgekehrt zu machen (Dieter Bender kennt das vielleicht).

KM
07-12-05, 10:24
Hallo Deficiency,

Du hast Recht. Wenn ich folgendes angebe

empfaenger = new String(empfaenger_ba, "UTF-16");

dann erhalte ich das korrekte Ergebnis. Daran hatte ich noch gar nicht gedacht. Somit brauche ich dann den Konverter AS400Text aus der Toolbox nicht mehr.

Danke,
KM

Fuerchau
07-12-05, 10:37
@KM
Versuche das bitte auch mal mit Umlauten und anderen Sonderzeichen !!!