[NEWSboard IBMi Forum]
Seite 1 von 3 1 2 ... Letzte
  1. #1
    Registriert seit
    Jan 2007
    Beiträge
    75

    REGEX - CCSID???

    Hallo,

    ich versuche gerade mit den C Routinen für Regular Expressions(regcomp, regexec...) auf der iSeries zu arbeiten.

    Dies klappt auch auf unserem System.
    Wenn ich die selbe Funktion aber auf einer anderen iSeries laufen lasse, funktioniert es nicht.....

    Hier muss der Regex und der zu prüfende Strinde erst mit iconv in CCSID 37 umgewandelt werden, bevor es funktioniert.

    Lasse ich es auf unserer Maschine in CCSID 37 umwandeln funktioniert es wieder nicht.


    Ich habe vermutet es liegt irgendwie an den Jobeinstellungen, aber die sind auf beiden Maschinen gleich....

    LANGID DEU
    CNTRYID DE
    CCSID 65535


    Woran könnte es liegen, dass auf der einen Maschine die Strings erst in CCSID 37 gewandelt werden muss und auf der anderen nicht?

  2. #2
    Registriert seit
    Feb 2001
    Beiträge
    20.241
    Das liegt wie immer an Sonderzeichen im String.
    Woher kommt dein Prüfausdruck ?
    Ist der als Konstante im Programm definiert und enthält variante Zeichen (CCSID-Spezifisch) ?
    Konstanten werden zur Compilezeit in die CCSID des Job's gewandelt. Hat der Job 65535 ist der Code entsprechend der Eingabe bzw. der CCSID der Quelle.

    Du musst also immer dafür sorgen, dass der Ausdruck und Prüfstring CCSID-mäßig zu einander passen.

    Das kannst du ggf. damit erreichen, dass du den Ausdruck aus einer PF oder MSGF (mit CCSID!) zur Laufzeit ermittelst.
    Der Job darf dabei natürlich nicht auf CCSID 65535 stehen!
    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
    Jan 2007
    Beiträge
    75
    zum testen sind die String erst einmal fest im Programm definiert...

    später soll der Suchstring aus einer Eingabe im DSPF kommen und der regex entweder fest im programm oder halt irgendwo herlesen, das ist noch offen...


    das was mich verwundert ist nur, warum klappt es auf unserer Maschine selbe JOBCCSID ohne konvertierung mit iconv und auf einer anderen selbe JOBCCSID nur mit Konvertierung mit iconv?

    selbst wenn ich CCSID(*CHAR:*JOBRUN) angebe macht es keinen unterschied....


    der Regex dient zum Email prüfen:

    Code:
    ^[A-Z0-9._%-]+@[A-Z0-9.-]+\.[A-Z]{2,4}$

  4. #4
    Registriert seit
    Feb 2001
    Beiträge
    20.241
    Welche CCSID hat das Terminal ?
    Zwischen Terminal und Job passiert nämlich automatisch KEINE Codewandlung!
    Job-CCSID und Terminal-Hostcodepage müssen nämlich identisch sein.
    Zwischen Job und Datenbank wird dann wieder konvertiert.
    Deshalb darf der Ausdruck auch keine varianten Zeichen als Konstante enthalten oder muss aus der DB/MSGF in die Job/Terminal-CCSID gewandelt werden.
    Insbesonders das @-Zeichen ist nämlich CCSID-Spezifisch.
    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
    Jan 2007
    Beiträge
    75
    Läuft alles unter dem selben Terminal, ich geh ja per telnet auf die andere Maschine....

    holen sich die C routinen(regcomp, regexec) die CCSID vll. irgendwo anders her?

  6. #6
    Registriert seit
    Feb 2001
    Beiträge
    20.241
    Transportierst du die Quelle oder das Programm auf die andere Maschine ?
    Welche CCSID haben dann ggf. die SRC-PF's ?
    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

  7. #7
    Registriert seit
    Jan 2007
    Beiträge
    75
    ich habe schon beides probiert....

    einmal das Objekt rübergeschickt und einmal die Quelle und dann probiert...

    aber es verhält sich nicht genauso wie auf unserer Maschine....

    auf der einen Maschine funktioniert es nur, wenn ich iconv in CCSID 37 wandel und auf unserer nur wenn ich das ohne iconv mache....

    hat es evtl doch etwas mit den C Routine(regexec, regcomp..) zu tun??


    Die SRC-PF´s haben beide die selben CCSID´s: 273
    LANGID: DEU


    Hier mal ein Teil des Codes mit dem ich es probiere:

    Code:
         C                   EVAL      scPattern = '^[A-Z0-9._%-]+@[A-Z0-9.-]+\.+
         C                                       [A-Z]{2,4}$'
         C*
         C*
         C                   EVAL      PatternBuf = scPattern
         c                   eval      PatternLen = %len(%trimr(scPattern))
         c                   eval      p_PatternBuf = %addr(PatternBuf)
    
    
         C* Hier evtl Konvertierung in CCSID 37
         c**                 if        iconv(ic: p_PatternBuf: PatternLen:
         c**                                     p_PatternBuf: PatternLen) = -1
         c**                 callp     fatal_error
         c**                 endif
    
         c                   eval      PatternLen = %len(%trimr(scPattern))
         c                   eval      rc = regcomp(reg:
         c                                    %subst(PatternBuf:1:PatternLen):
         c                                    REG_EXTENDED+REG_ICASE+REG_NOSUB)
    
         C     RC            DSPLY
         c                   if        rc <> 0
         c                   callp     regerror(rc: reg:
         c                                     %addr(buf): %size(buf))
         c                   eval      scMsg = %str(%addr(buf))
         c                   endif
    
         C
         c                   eval      scSflLine = 'test@test.de'
         C                   EVAL      PatternBuf = scSflLine
         c                   eval      p_PatternBuf = %addr(PatternBuf)
    
         C* Hier evtl Konvertierung in CCSID 37
         c***                if        iconv(ic: p_PatternBuf: PatternLen:
         c***                                    p_PatternBuf: PatternLen) = -1
         c***                callp     fatal_error
         c***                endif
         c                   eval      PatternLen = %len(%trimr(scSflLine))
         c                   eval      rc = regexec(reg:
         c                                    %subst(PatternBuf:1:PatternLen):
         c                                    0: match: 0 )
         C     RC            DSPLY
         c                   endif
         c*
    
         Csr   *INZSR        begsr
          *-----------------------
         c                   eval      ic = QtqIconvOpen(to: from)
         c                   if        ic.return_value = -1
         c                   callp     fatal_error
         c                   endif
          *-----------------------
         Csr                 endsr

  8. #8
    Registriert seit
    Mar 2002
    Beiträge
    5.287
    ... hast du mal die Umgebungsvariablen verglichen?

    D*B

    Zitat Zitat von chrisssiie Beitrag anzeigen
    ich habe schon beides probiert....

    einmal das Objekt rübergeschickt und einmal die Quelle und dann probiert...

    aber es verhält sich nicht genauso wie auf unserer Maschine....

    auf der einen Maschine funktioniert es nur, wenn ich iconv in CCSID 37 wandel und auf unserer nur wenn ich das ohne iconv mache....

    hat es evtl doch etwas mit den C Routine(regexec, regcomp..) zu tun??


    Die SRC-PF´s haben beide die selben CCSID´s: 273
    LANGID: DEU


    Hier mal ein Teil des Codes mit dem ich es probiere:

    Code:
         C                   EVAL      scPattern = '^[A-Z0-9._%-]+@[A-Z0-9.-]+\.+
         C                                       [A-Z]{2,4}$'
         C*
         C*
         C                   EVAL      PatternBuf = scPattern
         c                   eval      PatternLen = %len(%trimr(scPattern))
         c                   eval      p_PatternBuf = %addr(PatternBuf)
    
    
         C* Hier evtl Konvertierung in CCSID 37
         c**                 if        iconv(ic: p_PatternBuf: PatternLen:
         c**                                     p_PatternBuf: PatternLen) = -1
         c**                 callp     fatal_error
         c**                 endif
    
         c                   eval      PatternLen = %len(%trimr(scPattern))
         c                   eval      rc = regcomp(reg:
         c                                    %subst(PatternBuf:1:PatternLen):
         c                                    REG_EXTENDED+REG_ICASE+REG_NOSUB)
    
         C     RC            DSPLY
         c                   if        rc <> 0
         c                   callp     regerror(rc: reg:
         c                                     %addr(buf): %size(buf))
         c                   eval      scMsg = %str(%addr(buf))
         c                   endif
    
         C
         c                   eval      scSflLine = 'test@test.de'
         C                   EVAL      PatternBuf = scSflLine
         c                   eval      p_PatternBuf = %addr(PatternBuf)
    
         C* Hier evtl Konvertierung in CCSID 37
         c***                if        iconv(ic: p_PatternBuf: PatternLen:
         c***                                    p_PatternBuf: PatternLen) = -1
         c***                callp     fatal_error
         c***                endif
         c                   eval      PatternLen = %len(%trimr(scSflLine))
         c                   eval      rc = regexec(reg:
         c                                    %subst(PatternBuf:1:PatternLen):
         c                                    0: match: 0 )
         C     RC            DSPLY
         c                   endif
         c*
    
         Csr   *INZSR        begsr
          *-----------------------
         c                   eval      ic = QtqIconvOpen(to: from)
         c                   if        ic.return_value = -1
         c                   callp     fatal_error
         c                   endif
          *-----------------------
         Csr                 endsr
    AS400 Freeware
    http://www.bender-dv.de
    Mit embedded SQL in RPG auf Datenbanken von ADABAS bis XBASE zugreifen
    http://sourceforge.net/projects/appserver4rpg/

  9. #9
    Registriert seit
    Jan 2007
    Beiträge
    75
    jap es war die Umgebungsvariable....

    Bei uns war die auf
    LANG='QSYS.LIB/DE_DE.LOCALE

    gesetzt....

    auf der anderen Maschine war diese leer....


    Mit

    ADDENVVAR ENVVAR(LANG) VALUE('QSYS.LIB/DE_DE.LOCALE')

    ham sich dann beide gleich verhalten....

    Aber so ist es mir dann schon klar... die Zeichen waren alle in deutscher CCSID codiert und dann hat er sich in den C Routinen irgend eine andere gezogen.... aber welche nimmt er dann, wenn die Umgebungsvariable LANG nicht gesetzt ist?


    wie steuert man das dann am besten, wenn man das Programm auf verschiedenen Maschinen laufen lassen will??
    überall die Umgebungsvariable setzen??

  10. #10
    Registriert seit
    Mar 2002
    Beiträge
    5.287
    ... da gibt es mehrere Ebenen
    - Maschinenweit
    - User bezogen (geht normal über ein property File im User Home)
    - Job bezogen (muss dann im SBMJOB, oder beim init, oder vor dem Programm eingestellt werden

    D*B

    Zitat Zitat von chrisssiie Beitrag anzeigen
    jap es war die Umgebungsvariable....

    Bei uns war die auf
    LANG='QSYS.LIB/DE_DE.LOCALE

    gesetzt....

    auf der anderen Maschine war diese leer....


    Mit

    ADDENVVAR ENVVAR(LANG) VALUE('QSYS.LIB/DE_DE.LOCALE')

    ham sich dann beide gleich verhalten....

    Aber so ist es mir dann schon klar... die Zeichen waren alle in deutscher CCSID codiert und dann hat er sich in den C Routinen irgend eine andere gezogen.... aber welche nimmt er dann, wenn die Umgebungsvariable LANG nicht gesetzt ist?


    wie steuert man das dann am besten, wenn man das Programm auf verschiedenen Maschinen laufen lassen will??
    überall die Umgebungsvariable setzen??
    AS400 Freeware
    http://www.bender-dv.de
    Mit embedded SQL in RPG auf Datenbanken von ADABAS bis XBASE zugreifen
    http://sourceforge.net/projects/appserver4rpg/

  11. #11
    Registriert seit
    Jan 2007
    Beiträge
    75
    welche Auswirkungen hat es denn, wenn man das Systemweit macht?

    Also kann man dann mit irgendetwas Probleme kriegen?

  12. #12
    Registriert seit
    Mar 2002
    Beiträge
    5.287
    ... das kann Bob Dylan beantworten: the answer my friend, is blowing in the wind...
    Sicherlich keine gute Idee, am defensivsten ist es, das innerhalb des Programmes zu regeln

    D*B

    Zitat Zitat von chrisssiie Beitrag anzeigen
    welche Auswirkungen hat es denn, wenn man das Systemweit macht?

    Also kann man dann mit irgendetwas Probleme kriegen?
    AS400 Freeware
    http://www.bender-dv.de
    Mit embedded SQL in RPG auf Datenbanken von ADABAS bis XBASE zugreifen
    http://sourceforge.net/projects/appserver4rpg/

Similar Threads

  1. Konvertierung nach Graphic --> CCSID Problem
    By codierknecht in forum NEWSboard SAP
    Antworten: 32
    Letzter Beitrag: 09-02-18, 13:00
  2. Windowstabelle wird im IFS in CCSID 1252 erstellt
    By umeis in forum NEWSboard Windows
    Antworten: 3
    Letzter Beitrag: 11-08-06, 12:45
  3. CCSID ändern
    By schaaf in forum IBM i Hauptforum
    Antworten: 3
    Letzter Beitrag: 04-05-06, 11:18
  4. CPYTOIMPF und CCSID
    By Muchi in forum IBM i Hauptforum
    Antworten: 7
    Letzter Beitrag: 21-04-06, 13:54
  5. CCSID eines Files
    By Binford in forum IBM i Hauptforum
    Antworten: 6
    Letzter Beitrag: 07-03-06, 08:58

Berechtigungen

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