[NEWSboard IBMi Forum]
  1. #1
    KM is offline [professional_User]
    Registriert seit
    Apr 2003
    Beiträge
    1.005

    Dataqueue und Unicode

    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

  2. #2
    Registriert seit
    Feb 2001
    Beiträge
    20.241
    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.
    Dienstleistungen? Die gibt es hier: http://www.fuerchau.de
    Das Excel-AddIn: https://www.ftsolutions.de/index.php/downloads
    BI? Da war doch noch was: http://www.ftsolutions.de

  3. #3
    Registriert seit
    Sep 2005
    Beiträge
    40
    HI KM!

    So ich hatte ungefähr das gleiche Problem. Probier es mal damit:
    Code:
     
     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ß

  4. #4
    KM is offline [professional_User]
    Registriert seit
    Apr 2003
    Beiträge
    1.005
    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

  5. #5
    Registriert seit
    Feb 2001
    Beiträge
    20.241
    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 ?!
    Dienstleistungen? Die gibt es hier: http://www.fuerchau.de
    Das Excel-AddIn: https://www.ftsolutions.de/index.php/downloads
    BI? Da war doch noch was: http://www.ftsolutions.de

  6. #6
    Registriert seit
    Sep 2005
    Beiträge
    40
    Vielleicht wenn du UTF-16 nimmst!
    UCS2 und UTF16 sind (fast) id...
    Ich überlege aber noch vielleicht fällt mir noch was ein!!!

  7. #7
    KM is offline [professional_User]
    Registriert seit
    Apr 2003
    Beiträge
    1.005
    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

  8. #8
    Registriert seit
    Feb 2001
    Beiträge
    20.241
    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).
    Dienstleistungen? Die gibt es hier: http://www.fuerchau.de
    Das Excel-AddIn: https://www.ftsolutions.de/index.php/downloads
    BI? Da war doch noch was: http://www.ftsolutions.de

  9. #9
    KM is offline [professional_User]
    Registriert seit
    Apr 2003
    Beiträge
    1.005
    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

  10. #10
    Registriert seit
    Feb 2001
    Beiträge
    20.241
    @KM
    Versuche das bitte auch mal mit Umlauten und anderen Sonderzeichen !!!
    Dienstleistungen? Die gibt es hier: http://www.fuerchau.de
    Das Excel-AddIn: https://www.ftsolutions.de/index.php/downloads
    BI? Da war doch noch was: http://www.ftsolutions.de

  11. #11
    KM is offline [professional_User]
    Registriert seit
    Apr 2003
    Beiträge
    1.005
    Hallo Fuerchau,

    das klappt sogar mit Latin-2-Zeichen (polnisch, tschechisch, etc.). Ich schreibe diese Texte dann in eine HTML-Datei. Wichtig dabei ist nur, dass beim OutputStreamWriter als Charset "UTF-8" angegeben wird und in der HTML-Datei beim charset auch. Damit klappt dann auch die Anzeige der Zeichen im Browser sofort, ohne eine andere Zeichencodierung wählen zu müssen.

    Ist echt super. Man muß nur wissen wie's funktioniert. Und das herauszufinden kostet halt immer extrem viel Zeit :-(

    Gruß,
    KM

  12. #12
    Registriert seit
    Sep 2005
    Beiträge
    40
    HI KM!


    Freut mich das ich dir helfen konnte!!!! Hatte so ein ähnliches Problem auch!!
    Super das das funktioniert!!!

    Gruß
    Deficiency

Similar Threads

  1. Dataqueue auslesen über OLE-DB
    By schwenth in forum IBM i Hauptforum
    Antworten: 4
    Letzter Beitrag: 27-06-05, 13:18
  2. Druckausgabe mit Unicode
    By KM in forum IBM i Hauptforum
    Antworten: 10
    Letzter Beitrag: 12-04-05, 09:57
  3. Unicode?
    By miro in forum IBM i Hauptforum
    Antworten: 2
    Letzter Beitrag: 13-10-04, 12:47
  4. iSeries und UNICODE
    By KM in forum IBM i Hauptforum
    Antworten: 9
    Letzter Beitrag: 03-09-04, 11:46
  5. Verarbeiten geschlüsselte DataQueue nach FIFO
    By B.Hauser in forum NEWSboard Programmierung
    Antworten: 1
    Letzter Beitrag: 02-04-04, 09:27

Berechtigungen

  • Neue Themen erstellen: Nein
  • Themen beantworten: Nein
  • You may not post attachments
  • You may not edit your posts
  •