PDA

View Full Version : Sprachencodierung – Was soll ich um meine Äs zu bekommen?



jaime
17-02-04, 09:28
Hallo!
Ich brauche eure Hilfe da ich ziemlich neu am AS400 bin und wirklich fast keine Erfahrung habe.
Wir haben bei uns ein AS400 mit CSSID 65535 und LANGID DEU (von System).
Ich will ein kleines ILE RPG Programm schreiben dass ein File ließ, die ÄÖÜ tauscht durch AOU um und speichert die Felder zurück. Diese Datei selbst hat CCSID 273.
Ich probiere mit der XLATE Funktion, aber es schient mein Programm kann die ÄÖÜ und ß nicht richtig zu erkennen. Ich probiere es auch mit %SCAN aber funktioniert auch nicht



C IF %SCAN('Ä':Z00011) > 0
C EVAL Z00011 = 'GEFUNDEN'
C ENDIF



Obwohl in diesem Feld gibt es sicher eine Ä, wird nie gefunden (Z00011 wird nie ‚GEFUNDEN’).
Ich habe mein Modul mit LANGID(DEU) kompiliert aber bringt nichts.
Was soll ich machen um diese Zeichen finden zu können?
Danke für ihre Hilfe.
Jaime

Fuerchau
17-02-04, 09:35
1. Prüfe die CCSID deiner Quelle
2. Prüfe die CCSID deiner Session
3. Prüfe die CCSID deines Jobs

Nur wenn alle 3 identisch sind, ist dein Ä auch ein Ä !!

Am einfachsten erfaßt du die Zeichen in eine Datei mit CCSID 273 und liest diese zur Laufzeit ein.

Noch einfacher, du schreibts kein Programm sondern nimmst einfach SQL:

update myfile set myfield = translate(myfield, 'ÄÖÜ', 'AOU')

jaime
17-02-04, 10:19
Fuerchau,
Danke für deine rasche Antwort.
Mit SQL habe ich es schont gemact aber jetzt bin ich interessiert, wie könnte es auch mit ILE RPG lösen.
Wenn du sagts CCSID meiner Quelle, ist das die Quelle von RPG Programm und Datenbanken File oder nur die Quelle von Datenbanken File?
Danke nochmals

Fuerchau
17-02-04, 10:41
Ich meine die Quelle, in die du das Programm erfasst !

Das Zeichen, dass du am Bildschirm eingibst unterliegt an verschiedenen Stellen einer Codewandlung und entspricht ggf. nicht dem gewünschten Hex-Wert.

Auch wenn du ein "Ä" siehst, heißt das nicht, dass das auch der korrekte Code für das Ä in der DB ist.

Stelle also deine Sitzung auf 273 und ändere deinen Job auf CCSID(273).

Ändere ggf. deine Source-PF auf CCSID(273).

Das "Ä" und auch viele andere Zeichen gelten als "variante Zeichen". Eine Codewandlung erfolgt jedoch nur bei Daten.
Verwendest du also solche Zeichen im Programm, so gilt der Hexwert zur Compile-Zeit deines Programmes und kann daher (wie hier erfolgt) u.U. nicht mit deiner DB übereinstimmen.

Anmerkung:

In Programmen sollten grundsätzlich keine varianten Zeichen verwendet werden, da diese immer Probleme bedeuten.
Werden diese benötigt, so schreibe diese in eine PF mit CCSID passend zu deiner DB.
Du kannst diese Daten auch als Ladezeit-Tabelle definieren, so dass du die Werte nicht noch selbst lesen musst.

jaime
17-02-04, 13:54
Danke Nochmals, Fuerchau.
Jetzt ist mir klar.
Aber was passiert dann wenn ich ein Programm (DEU) habe , der eine Procedure (ENU) mit Strigs als Parameter ruft? Dann sollten sie nicht richtig miteinander verstehen? So muss ich alle Source Files mit demselben CCSID haben?

Jaime

Fuerchau
17-02-04, 14:14
Nein, das ist nicht nötig, da ja Hexcodes übergeben werden.

Die Verwendung von varianten Zeichen ist ausschließlich zur Compile-Zeit problematisch.
Ist der Job in einer CCSID (die auch anders als die DB sein kann) wandelt die AS/400 automatisch beim Lesen in die Job-CCSID und beim Schreiben in die DB-CCSID.

Nur: Die CCSID 65535 ist die schlimmste überhaupt, da passiert nämlich nix !!!