[NEWSboard IBMi Forum]

Thema: UCS-2

  1. #1
    Registriert seit
    May 2002
    Beiträge
    1.121

    UCS-2

    Liebes Forum,
    auch wenn ich jetzt Gefahr laufe mir einen 11 Meter ein zu handeln, mache ich hier noch mal wieder einen Post zum Zeichensatz auf.
    Meine Kundschaft bekommt von einem Externen Partner per Mail eine Datei mit Daten. Diese waren bis jetzt immer UFT-8.
    Jetzt kommt die Datei aber mit UCS-2 LE BOM (Sagt zu mindestens der Notpad++).
    Wenn ich die Dateien im IFS speichere, und mit WRKLNK mir den Inhalt anschaue, dann passt das bei den UFT-8, aber bei der anderen Datei nicht. Bei „Anzeige Attribute“ steht bei beiden die 1252.
    Beim kopieren mit CPYFRMIMPF in eine PF wird auch nicht konvertiert.
    Im Moment öffne ich die Datei mit dem Notepad++ und speichere die Datei dann neu mit UFT-8 ab.
    Wie bekomme ich die Daten jetzt lesbar in eine PF geschrieben?
    Danke schon einmal
    Ronald
    Miniaturansichten angehängter Grafiken Miniaturansichten angehängter Grafiken Click image for larger version. 

Name:	ucs2.JPG 
Views:	31 
Size:	39,6 KB 
ID:	376  

    Angehängte Grafiken Angehängte Grafiken  

  2. #2
    Registriert seit
    Feb 2001
    Beiträge
    20.207
    Die CCSID einer Datei bei der Kopie ins IFS wird durch den Netserver festgelegt.
    Daher kann die CCSID in diesem Fall keine Aussage über den Inhalt machen.
    Du musst also hier tasächlich beim CPYFRMIMPF die CCSID 13488 für UCS-2 angeben.
    Ggf. gibt es ein Problem mit den 2-Byte BOM am Anfang.
    UTF-8 ist CCSID 1208, das geht beim CPYFRMIMPF ebenso.
    Wenn das mit 13488 (wieder mal) nicht funktionieren sollte, kann man auch mit QSH "iconv" ggf. eine Codewandlung in 1208 durchführen.
    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
    May 2002
    Beiträge
    1.121
    HI,

    habe jetzt CPYTOIMPF mit mehreren CCSID getestet. Das inconv hat mich auch nicht zum Ziel gebracht.

    Habe ich mit SQL eine Möglichkeit aus einem Feld alle Zeichen zu killen, die nicht x'40' und x'F0' - x'F9' sind?

    Gruß
    Ronald

  4. #4
    Registriert seit
    Feb 2001
    Beiträge
    20.207
    Du hast da leider tatsächlich ein Problem, da die Quelldaten in LE (Little Endian) gespeichert wird und die AS/400 in Big Endian arbeitet (LE "0" = X'3000', BE "0" = X'0030').

    Für SQL gibts nur den Translate.

    Mangels Daten habe ich es noch nicht ausprobiert, aber versuche doch fogendes:

    iconv -f UTF-16LE -t UTF-8 filename > Zieldatei

    für nicht übersetzbare Zeichen gibts noch "-c".
    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

  5. #5
    Registriert seit
    May 2002
    Beiträge
    1.121
    hat leider auch noch nicht zum Erfolg geführt.

    Werde jetzt mit einem kleinen RPG die Datei lesen und alles löschen was nicht x'40' oder
    x'F0' - x'F9' ist

    Gruß
    Ronald
    Angehängte Dateien Angehängte Dateien

  6. #6
    Registriert seit
    May 2002
    Beiträge
    1.121
    So,
    mache die Daten jetzt mit einen RPG "Hübsch"

    Die daten wurden aus dem IFS in eine Datei MyFile kopiert. Diese Datei hat ein Feld Satz mit der Länge 80 und den Format MyFileF.

    PHP-Code:
      ctl-opt dftactgrp(*nobnddir('QC2LE'Option( *NoDebugIO )                             
         
    datfmt(*DMY.) timfmt(*HMS:) datedit(*DMY.) Decedit('0,'Debug(*YES);                
                                                                                              
      
    dcl-f MyFile    Usage(*Input: *Update) ; // Daten vom externen Partner                  
                                                                                              
      // Konstanten                                                                           
      
    dcl-c True *On;                                                                         
      
    dcl-c False *Off;                                                                       
                                                                                              
                                                                                              
      
    // Main-Programm                                                                        
      
    Setll *Start MyFile;                        // Alles auf Anfang               
      
    Read MyFile;                                // 1.Satz lesen                   
      
    DoW not %EoFMyFile );                     // Lesen bis zum bitteren Ende    
        
    Satz Gueltige_ZeichenSatz );          // Nur Blanks und Ziffern bleiben 
        
    Update MyFileF;                            // Update auf den Record          
      
    Read MyFile;                                 // Und ab zum nächsten Record     
      
    EndDo;                                       // Ende der Schleife              
                                                                                               
      
    *Inlr True;                               // Endezeiger einschalten          
                                                                                               
      // Prozeduren                                                                            
      
    dcl-proc Gueltige_Zeichen;              // Alles töten was nicht x'40' oder
        
    dcl-pi *n char80 );                       // x'F0' bis x'F9' ist             
          
    Zeile char80 );                        // Übergabe des String             
        
    end-pi;                                                                                
        
    dcl-s Rueckgabe  char80 );               // Rückgabe_String                 
        
    dcl-s Text       char80 );               // Hier gibt es den Übergabe Text  
        
    dcl-s Zeichen    char(  );                // Zu überprüfendes Zeichen        
        
    dcl-s Index packed40  );                // Index für Zerlegen des Strings  
        
    Text Zeile;                                       // Erstmal den ganzen Text         
        
    For Index 1 to %Len( %TrimText ));              // Alles durch ackern              
          
    Zeichen = %SubStText Index1);               // zu prüfendes Zeichen            
          
    If Zeichen x'40';                               // Leerzeichen                     
            
    Rueckgabe = %TrimRueckgabe ) + 'Q';              // Platzhalter für das Blank    
          
    EndIf;                                                                               
          If (
    Zeichen >= x'F0' and Zeichen <= x'F9');       // Ziffer                          
            
    Rueckgabe = %TrimRueckgabe ) + Zeichen;          // Zeichen geht mit zurück   
          
    EndIf;                                                                            
        EndFor;                                                                             
        
    // Platzhalter wieder mit Blanks ersetzen                                           
        
    Rueckgabe = %ScanRpl'Q'' 'Rueckgabe);                                         
        
    // Und das Ergebniss zurück geben                                                   
        
    Return Rueckgabe;                                                                   
      
    end-proc
    Gruß Ronald

  7. #7
    Registriert seit
    Jun 2001
    Beiträge
    1.973
    Ich, als alter Nostalgiker ... dies ist eine RPG variante, das F in der 'H-Karte' ist das Geheimnis

    Code:
         H             .D                     F                               HEXJO
         FINPUT   IP  F     250            DISK                                    
         FOUTPUT  O   F     250            DISK                      A             
         I* ---------------------------------------------------------------------- 
         IINPUT   KF  01                                                           
         I                                        1 250 S1                         
         OOUTPUT  DADD     01                                                      
         O                         S1       250                                    
    **                                                                             
    INPUT   00400140024003400440054006400740084009400A400B400C400D400E400F40       
    INPUT   immer althex neuhex, sooft wie nötig
    Das Notwendige steht über dem technisch machbaren.
    (klingt komisch, funktioniert aber!)

Berechtigungen

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