Anmelden

View Full Version : REGEX - CCSID???



Seiten : 1 [2] 3

chrisssiie
25-01-10, 11:01
welche Auswirkungen hat es denn, wenn man das Systemweit macht?

Also kann man dann mit irgendetwas Probleme kriegen?

BenderD
25-01-10, 11:08
... 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


welche Auswirkungen hat es denn, wenn man das Systemweit macht?

Also kann man dann mit irgendetwas Probleme kriegen?

chrisssiie
25-01-10, 11:27
lol, na dann frag ich mal bob dylan :D



Im Programm kann ichs doch dann aber nur so regeln, dass ich vor jeder REGEX Prüfung einen ADDENVVAR auf Jobebene mach und danach einen RMVENVVAR...
oder gibts da bessere Methoden?

Fuerchau
25-01-10, 11:45
Stimmt, allerdings würde ich die CCSID des Jobs abfragen und die dazu passende Lokale wählen (falls es tatsächlich mal nicht 273 DE ist).

chrisssiie
25-01-10, 11:54
ok, das hat mir mal wieder sehr geholfen ;)



Dankeschön ihr beiden ;)

Fuerchau
25-01-10, 12:31
Alternativ gibts noch die C-Funktion setlocale().
Vielleicht kommst du ja damit weiter und benötigst dann keine ENVVAR mehr.
Wenn setlocale() nicht funktioniert, kannst du auch mit putenv() die Variable setzen.
Vorteil bei putenv():
- gilt nur für das aktive Prgrammobjekt
- keine ENVVAR's im Job

chrisssiie
26-01-10, 11:31
hmm.....

ich hab das jetzt mal mit putenv probiert....



D putenv PR 10i 0 ExtProc('putenv')
D envvar * VALUE OPTIONS(*STRING:*TRIM)
D cp s 1024a


// set LANG
cp = %trim(var) + '=' + %trim(value);

if (putenv(cp) < 0);
err = errno;
endif; Er scheint auch was zu machen, weil wenn ich mit STRQSH echo $LANG die Variable anschaue, zeigt er mit das richtig an.... aber die Regex-Funktionen gehen irgendwie nicht richtig....



mach ich vorher einen ADDENVVAR ENVVAR(LANG) VALUE('/QSYS.LIB/DE_DE.LOCALE') REPLACE(*YES)

klappt alles.....

chrisssiie
20-05-10, 11:22
Hallo,

ich hole das Thema noch einmal hoch, da ich es damals nicht hingebracht habe vernünftig zum laufen zu kriegen....

Ich habe jetzt noch einmal etwas rumprobiert und habe folgendes herausgefunden:


Die Regex-Befehle arbeiten mit der CCSID von der Umgebungsvariable LANG....

LANG ist meistens mit dem Wert aus dem Systemwert QLOCALE festgelegt...
Kann man im USerprofile angeben(Wert LOCALE)...

Steht in der Umgebungsvariable nichts drin(wegen QLOCALE = *NONE), dann arbeiten die Regex Routinen mit CCSID 37...


d.h. für mich, wenn ich meinen Regex in einer Source, welche in CCSID 273 gespeichert ist habe, muss ich diesen in die CCSID, welche der aktuellen Umgebungsvariable LANG entspricht umwandeln...

In der Umgebungsvariable LANG steht aber z.B. /QSYS.LIB/DE_DE.LOCALE....



Wie bekommt man jetzt raus, welche CCSID dem Objekt /QSYS.LIB/DE_DE.LOCALE entspricht, ohne die hart im Programm umzuschlüsseln??


Oder gibt es eine Umgebungsvariable, welche mir die CCSID zurückgibt, welche der Umgebungsvariable LANG entspricht??


Gruß

chrisssiie

Fuerchau
20-05-10, 11:53
Auch hierfür gibt es wieder C-Funktionen, dies abzufragen:
http://publib.boulder.ibm.com/infocenter/iseries/v5r4/topic/books/sc415607.pdf#LOCCONV
http://publib.boulder.ibm.com/infocenter/iseries/v5r4/topic/books/sc415607.pdf#LINFOP

localeconv - C++ Reference (http://www.cplusplus.com/reference/clibrary/clocale/localeconv/)
ILE C/C++ Run-Time Library Functions - nl_langinfo() --Retrieve Locale Information (http://publib.boulder.ibm.com/infocenter/iadthelp/v7r5/topic/com.ibm.etools.iseries.langref.doc/rzan5mst177.htm)

Wobei es hier durchaus Diskrepanzen geben kann wenn die C-Funktionen die tatsächliche Einstellung liefern (bis hin zu QCCSID) aber regex() diese Funktionen nicht verwendet sondern fix auf die ENV-Variable zugreift.

chrisssiie
20-05-10, 14:24
hmmm... wenn es hier natürlich Diskrepanzen geben kann codiere ich es denke ich doch hart um...

also DE_DE.LOCALE = 1141, HU_HU.LOCALE = 870 usw....


Die meisten haben eh entweder DE_DE.LOCALE oder gar nichts drin stehen... wenn noch weitere hinzukommen muss ich das halt reinschreiben...


Jetzt habe ich aber wenigstens auf den meisten Systemen lauffähge regex Version ;)


Ist das eigentlich bei allen C-Routinen so, dass die mit der Umgebungsvariable LANG und nicht mit der JOB-CCSID arbeiten?

Dann müssten doch schon einige vor mir vor dem Problem gestanden haben :confused: