View Full Version : UTF-8 und iSeries?
Hallo zusammen!
Ich mach mich gerade ein bisschen schlau zu Unicode und iSeries (momentan auf einer Maschine mit V5R3).
Für mich wär UTF-8 interessant da hier weniger Speicherplatz belegt werden würde als mit UTF-16 oder UCS-2.
Eine Datei mit einem Alpha-Feld mit CCSID 1208 konnte ich erstellen aber bei der Maske sagt er das er nur UTF-16 oder UCS-2 in Verbindung mit einem Grafikfeld mag.
Eine indirekte Umwandlung wie EVAL UTF16FELD = UTF8FELD meckert der RPG Compiler ebenfalls an. Muss ich die Werte jetzt jedesmal über API's konvertieren wenn ich UTF-8 in meinen phys. Dateien verwenden will oder gibt es da vom System her noch ne schönere Lösung?
Hat schon jemand seine Datenbank oder Teile davon auf UTF-8 umgestellt?
cu
Martin
Sven Schneider
11-04-05, 23:28
Für die Konvertierung in RPG folgende BIF's :
von xxx nach char --> %CHAR oder Literal '...'
von xxx nach UCS-2 --> %UCS2 oder Literal U'...'
von xxx nach graph --> %GRAPH oder Literal G'...'
http://publib.boulder.ibm.com/infocenter/iseries/v5r3/ic2929/books/c092508402.htm
Für die Darstellung im DSPF musst du die Felder als A=Alpha definieren.
Ich glaube nicht dass du DBCS oder Grafik-DBCS-Einheiten im Einsatz hast, geschweige denn die kostenpflichtige DBCS-Option von OS/400.
Die benötigst du aber wenn du UCS-2 Felder als DBCS anzeigen willst.
Weil diese werden dann nach DBCS (EBCDIC) konvertiert, da es die direkte Unterstützung für 5250-Enheiten nicht gibt und wahrscheinlich auch nicht geben wird.
Für UTF-8 genügen aber Alpha-Felder in der DDS.
http://publib.boulder.ibm.com/infocenter/iseries/v5r3/ic2929/index.htm?info/rzakb/rzakbmsttdccsid.htm
UTF-8 wird auf der AS NICHT unterstützt, da das eine HTML-Formatierung ist.
Sonderzeichen wie Ä/Ö/Ü usw. werden in expandierter Form wie z.b. ä="ä." dargestellt.
UTF-8 ist kein eigentlicher Code sondern eine Darstellung des Codes.
Durch UTF-8 können eben Internetseiten entsprechend aufbereitet werden, die interne Speicherung in einer Datenbank ist dann aber meistens UNICODE.
Man bedenke auch die teilweise drastische Erweiterung der Speicherung, wenn diese im UTF-8 erfolgt. Um z.B. 30 Ü's in einem Namensfeld zu speichern würde ich 30 * "ü." also 6*30 = 180 Stellen benötigen, müsste das dann allerdings für die Darstellung in einer DSPF z.B. in CCSID 273 übersetzen.
DBCS ist bei uns im Einsatz. Ist auch der Hauptgrund warum mich UTF-8 / Unicode interessiert...
Hab jetzt mal folgendes ausprobiert:
1. Masken- und Datenbankfelder auf UCS-2 geändert -> klappt problemlos, auch mit DBCS-Zeichen
2. Maskenfelder auf UCS-2 und Datenbankfelder auf UTF-8. Die Zuweisung im RPG Programm läuft über EVAL MASKENFELD = %UCS2(DATEIFELD) und EVAL DATEIFELD = %CHAR(MASKENFELD).
Hier habe ich einen re-produzierbaren Fehler:
- Satz im Programm anlegen wo in einem Feld mehrere DBCS Zeichen sind
- Satz wegschreiben und wieder reinlesen (bis hierher klappt es noch)
- Ein DBCS-Zeichen aus dem Satz löschen und wieder wegschreiben
- Wenn ich jetzt den Satz wieder reinlesen will wird er beim Read nicht mehr gefunden (Equal-Schalter auf 1)
- Über SQL kann ich mir den Satz ohne Probleme ansehen
- Lösche ich die DBCS-Zeichen aus dem Satz kann ihn auch das Programm wieder reinlesen
Ne Idee was das sein könnte? Die Hex-Codes hab ich mir angeschaut, ist soweit nicht auffälliges ... ausser vielleicht das ich bei UCS-2 Dateifeldern für meine DBCS-Felder den passenden Hex-Code laut den Tabellen von Unicode.org habe und bei UTF-8 nen Wert der nicht mal im momentan zugelassenen Bereich liegt.
UCS2-HEX......UTF8 -HEX
30B9.............E382B9
30B7.............E382B7
cu
Martin
UTF-8 wird auf der AS NICHT unterstützt, da das eine HTML-Formatierung ist.
Sonderzeichen wie Ä/Ö/Ü usw. werden in expandierter Form wie z.b. ä="ä." dargestellt.
UTF-8 ist kein eigentlicher Code sondern eine Darstellung des Codes.
Durch UTF-8 können eben Internetseiten entsprechend aufbereitet werden, die interne Speicherung in einer Datenbank ist dann aber meistens UNICODE.
Man bedenke auch die teilweise drastische Erweiterung der Speicherung, wenn diese im UTF-8 erfolgt. Um z.B. 30 Ü's in einem Namensfeld zu speichern würde ich 30 * "ü." also 6*30 = 180 Stellen benötigen, müsste das dann allerdings für die Darstellung in einer DSPF z.B. in CCSID 273 übersetzen.
Hmmm, versteh ich jetzt nicht ganz.
Nach der Erklärung auf http://de.wikipedia.org/wiki/UTF-8 wird der komplette Zeichensatz von Unicode unterstützt. Funkioniert auch, wenn ich dem Feld den Wert 'ä' über SQL zuweise hab ich nachher 'C3A4' als Hex-Code in dem Feld stehen.
cu
Martin
Sven Schneider
12-04-05, 12:29
Also, folgende Kombinationen machen nur Sinn :
- wenn DB-Feld ALPHA mit UTF-8 dann solltest du im DSPF auch Alpha verwenden. Im Program ist dann auch keine Konvertierung mit BIF's notwendig, das macht das System selbst. Verwendest du im DSPF ein Grafik mit UTF-16/UCS-2, dann solltst du beim UTF-8 DB-Feld CCSID(1208 *NORMALIZE) verwenden.
- wenn DB-Feld Grafik mit UTF-16/UCS-2 dann kannst du in DSPF die CCSID für UTF-16/UCS-2 bei einem Grafik Feld verwenden.
Soweit gemacht. Hab aber immer noch Probleme beim wegschreiben. Wenn ich z.B. ein 'Ä' über mein Programm in die Datei schreiben will bekomme ich folgenden Fehler:
Data mapping error on member XXX
34 -- The data could not be converted from or to a UTF-8 or UTF-16 CCSID.
The expansion of single-byte data to a double-byte value caused the
converted length to be larger than the maximum length the result could hold
Das Feld in der Datei ist mit 30 Alpha und CCSID(1208) für UTF-8 definiert.
cu
Martin
Bei der Konvertierung von SBCS nach DBCS muss das Zielfeld eben mindestens doppelt so lang sein wie das Quellfeld.
Ich denk mal das ist nicht das Problem da ich
- DBCS-Zeichen ohne Probleme wegschreiben kann
- der Fehler erst beim WRITE auf das Satzformat auftritt. Die Zuweisung des Wertes an das Dateifeld über EVAL DATEIFELD = %CHAR(%TRIM(MASKENFELD)) war schon ein paar Statements vorher und brachte keinen Fehler
cu
Martin
Wie ist das DATEIFELD im RPG denn definiert (Typ) ?
Ich nehme mal an, dass dieses Feld nicht als GRAPHIC definiert ist und somit das System gezwungen ist die Konvertierung SBCS/DBCS durchzuführen und da passt dann irgendwas nicht.
Beim EVAL wird eh abgschnitten bzw. aufgefüllt, was bei Datei-IO's nicht der Fall ist.
Achja:
Wis steht denn die Job-CCSID ?
Bei Datenbankzugriffen in normale CHAR-Felder wird in/von Job-CCSID konvertiert.
Der JOB selber kann aber (glaube ich) keine DBCS-CCSID sein.
Die Programm-Felder müssen also vom Typ Grafik sein, damit eben keine Konvertierung stattfindet.