-
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?
-
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!
-
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}$
-
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.
-
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?
-
Transportierst du die Quelle oder das Programm auf die andere Maschine ?
Welche CCSID haben dann ggf. die SRC-PF's ?
-
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
-
... hast du mal die Umgebungsvariablen verglichen?
D*B
Zitat von chrisssiie
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
-
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??
-
... 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 von chrisssiie
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??
-
welche Auswirkungen hat es denn, wenn man das Systemweit macht?
Also kann man dann mit irgendetwas Probleme kriegen?
-
... 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 von chrisssiie
welche Auswirkungen hat es denn, wenn man das Systemweit macht?
Also kann man dann mit irgendetwas Probleme kriegen?
Similar Threads
-
By codierknecht in forum NEWSboard SAP
Antworten: 32
Letzter Beitrag: 09-02-18, 13:00
-
By umeis in forum NEWSboard Windows
Antworten: 3
Letzter Beitrag: 11-08-06, 12:45
-
By schaaf in forum IBM i Hauptforum
Antworten: 3
Letzter Beitrag: 04-05-06, 11:18
-
By Muchi in forum IBM i Hauptforum
Antworten: 7
Letzter Beitrag: 21-04-06, 13:54
-
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
-
Foren-Regeln
|
Erweiterte Foren Suche
Google Foren Suche
Forum & Artikel Update eMail
AS/400 / IBM i
Server Expert Gruppen
Unternehmens IT
|
Kategorien online Artikel
- Big Data, Analytics, BI, MIS
- Cloud, Social Media, Devices
- DMS, Archivierung, Druck
- ERP + Add-ons, Business Software
- Hochverfügbarkeit
- Human Resources, Personal
- IBM Announcements
- IT-Karikaturen
- Leitartikel
- Load`n`go
- Messen, Veranstaltungen
- NEWSolutions Dossiers
- Programmierung
- Security
- Software Development + Change Mgmt.
- Solutions & Provider
- Speicher – Storage
- Strategische Berichte
- Systemmanagement
- Tools, Hot-Tips
Auf dem Laufenden bleiben
|
Bookmarks