PDA

View Full Version : RPG Sourcen im IFS - CRTRPGMOD mit SRCSTMF



bofrost
16-12-11, 08:29
Hallo,

Aufgrund der Benutzung von CVS als Versionskontrollsystem und gmake als Build-tool muste ich meine rpg sourcen ins ifs legen. Da ich die Sourcen nicht erst in eine Sourcemember kopieren möchte würde ich gerne die dateien direkt aus dem IFS mit dem Parameter SRCSTMF wandeln.
Das funktioniert soweit auch schon ganz gut, doch leider werden Umlaute und sonderzeichen nicht richtig übersetzt:
Aus öäüß ÖÄÜ wird ¦{}~ \[] und
aus ()[]{} wird ()ÄÜäü.
Im IFS hab ich schon die versichedensten CCSID's getestet z.B. 1252 oder 1011 die jobs in dem der umwandlungs befehl aufgerufen wrid laufen unter 1141.
Wie muss ich meine Umgebung konfigurieren, dass die Umlaute richtig ankommen?

Grüße

Fuerchau
16-12-11, 08:47
Prüfe mal die Default-CCSID deines Job's. Für manche Erstellbefehle zieht leider diese an Stelle der CCSID.

Dei Default-CCSID wird aus QCCSID entnommen, ist diese 65535 nehmen halt manche Erstellbefehle 037 für USA-Englisch an.

Kannst du dir denn die IFS-Dateien am Bildschirm (WRKLNK, EDTF) korrekt anzeigen ?

bofrost
16-12-11, 09:01
Die JOB-CCSID ist 1141, die vom Systemvalue QCCSID ist auch 1141.

Mit EDTF wird auch alles korrekt angezeigt.

Ist es überhaupt möglich Programme zu erstellen, bei denen der job eine andere CCSID hat wie die Sourcen?

Leider kann ich meine Sourcen nicht auf 1141 stellen, da damit andere Programme nicht zurecht kommen :(

Danke für die schnelle Hilfe!

bofrost
16-12-11, 10:34
Vlt noch einige Infos:
Mein Programm sieht so aus:
Hmain(bla)
Dbla PREXTPGM('enctst')
Pbla B
P
/free
dsply'Encoding Test';
dsply'Umlaute: öäüß ÖÄÜ';
dsply'Klammern: ()[]{}';
return;
/end-free
Pbla E

Umgewandelt wird es so:
CRTRPGMOD bofrost/enctst SRCSTMF('/home/bofrost/enctst.rpgle')
DBGVIEW(*LIST)

CRTPGM PGM(bofrost/enctst) MODULE(bofrost/enctst )

Gibt es Parameter die ich noch angeben müste?
Kann jemand mein Problem nachvollziehen?

Fuerchau
16-12-11, 11:21
Abgesehen von deinem Test:

Man sollte NIE CCSID-abhängige Zeichen (varianter Zeichensatz) als Programmkonstante verwenden, da zur Laufzeit die eingebetteten Zeichen nicht mehr gewandelt werden.
In diesem Fall ist nämlich das Programm zur Laufzeit immer von dieser CCSID abhängig.

Hier findet man einen Hinweis leider nur auf SRCPF's:
Language compilers CCSID (http://publib.boulder.ibm.com/infocenter/iseries/v7r1m0/topic/nls/rbagslangcompccsidguide.htm)

Ich denke aber, dass der Compiler beim Lesen aus dem IFS in CCSID 037 wandelt, was die Ausgaben deines Tests zeigen.
Hier hast du dann wohl keine andere Chance, als deinen Job zur Compilezeit auf 037 zu stellen.
Dies ist zwar dann für den Compiler zum Erkennen von Sonderzeichen richtig, aber zur Laufzeit erfolgt ja keine Codewandlung und dann hast du wieder die Probleme mit varianten Zeichen.

Helfen kann da warscheinlich nur eine Zwangscodierung zur Laufzeit von der Source-CCSID in die Job-CCSID.

Welche CCSID's tatsächlich verwendet wurden, wirft der Compiler eigentlich am Ende des Spools irgendwo aus.

bofrost
16-12-11, 12:43
In unserem Fall ist es kein Probem wenn das Programm zur Laufzeit immer von der selben CCSID abhängt, da die Programme immer auf der selben Maschiene laufen.

Bevor ich die CCSID währen der Laufzeit umwandle wandle ich lieber die sourcen bevor ich sie kompiliere um...

Hm... bevor er die 1252iger sourcen compilieret wandelt er sie in 500 um... entspricht Latin-1 in ebcdic.

Fuerchau
16-12-11, 12:57
Scheint ein Default für den Compiler bei IFS zu sein.
Du hast dann keine Probleme, wenn du absolut keine varianten Zeichen in der Quelle verwendest.
Solltest du diese zur Laufzeit als Konstanten benötigen, so lese diese
a) aus einer Datei mit CCSID
b) aus einer MSGF mit CCSID
Beim Lesen werden diese dann ja in die Job-CCSID gewandelt.

bofrost
27-12-11, 10:05
Hab mir gerade mal die json Utilities von rpgnextgen.com (RPG Next Gen by Mihael Schmidt (http://www.rpgnextgen.com/index.php?content=json)) angeschaut. Hier werden einfach die Zeichen als Unicode codiert:
D UNICODE_LEFT_CURLY_BRACE...
D C u'007B'
D UNICODE_RIGHT_CURLY_BRACE...
D C u'007D'
D UNICODE_LEFT_BRACKET...
D C u'005B'
Werde das jetzt auch mal so machen, sollte dann eigendlich ohne Probleme funktionien.