Anmelden

View Full Version : Nicht druckbare Zeichen



Seiten : [1] 2

Frankk
24-02-25, 08:10
Hallo,
gibt es die Möglichkeit in einem ILE-Programm innerhalb eines Feldes nicht druckbare Zeichen zu ermitteln? Ich denke da an eine Tabelle, welche die Werte beinhaltet, die nicht gedruckt werden können (z.B. Steuerzeichen). Ist auf der AS/400 eine solche Tabelle in irgendeiner Form vorhanden? Mein Problem ist, dass ich Daten für die externe Weiterverarbeitung bereitstelle und diese auf dem Fremdsystem aufgrund von nicht druckbaren Zeichen nicht verarbeitet werden. Daher wollte ich diese zuvor ausfiltern und durch ein Blank ersetzen.

Fuerchau
24-02-25, 08:15
Nicht druckbare Zeichen liegen alle unterhalb des Blanks.
Siehe z.B. hier:
https://en.wikibooks.org/wiki/Character_Encodings/Code_Tables/EBCDIC/EBCDIC_273
Diese Zeichen können aber auf dem regulären Weg eher nicht ins System kommen.
Um welche Zeichen handelt es sich im speziellen?

Frankk
24-02-25, 08:30
Das Problem entsteht, wenn der Anwender beispielsweise aus Emails Daten in die AS/400 übernimmt. Dann ist ein offensichtliches Blank eben nicht Blank, sondern ein nicht druckbares Zeichen.

Hier ein Beispiel:

635 ? 637 Ajax Av
FFF434FFF4C98A4CA
63506063701117015

Der Hex-Wert "36" ist in der Erfassungsmaske für den Anwender ein Blank (Hex40)- hier jedoch nicht. Insofern würde es mit Hex 40 und kleiner ja stimmen!

Fuerchau
24-02-25, 08:47
Das ist ein Problem bei der Überführung von Unicode in ANSI bzw. anschließend in EBCDIC.
In Unicode bzw. UTF8 können Zeichen vorkommen, die in ANSI 1252 bzw. EBCDIC 273/1141 unbekannt sind.
Bei einer Standardkonvertierung von UTF8 in 1252 werden unbekannte Zeichen in normales "?" übersetzt.
Kommen Zeichen z.B. aus HTML (Mails) gibts dort das Zeichen " " (Numeric backspace, x'A0'), und das entspricht nun EBCDIC x'36'.

Da es nun keinen Translate in dieser Form gibt, kannst du per Schleife alle Zeichen kleiner x'40' (Blank) ersetzen oder per SQL TRANSLATE mit einer manuellen Ersetzungstabelle x'000102....3E3F' gegen Blank austauschen.
Im RPGLE gibts %XLATE/XLATE, dem du auch entsprechenden Ersetzungsztabellen mitgeben kannst.

Frankk
24-02-25, 14:22
Hallo,
wollte mich nochmals kurz zu dem Problem melden. der entscheidende Punkt war: Alles was kleiner ist als x'40' ist! Das hat wunderbar geklappt.

Variable einlesen, jede Stelle auf < x'40' prüfen und ggf. gegen ein Blank austauschen. Habe jetzt schon verschiedene Test's gefahren. Bis jetzt funktioniert es einwandfrei!

Herzlichen Dank für Deine Hilfe! :):)

Robi
25-02-25, 07:39
Filetranslation kann das ohne Schleife
Früher war das ein F in Stelle 53 in der Headerkarte.
Und eine '**' Tabelle mit alter Wert / neuer Wert oder umgekehrt, je nachdem ob die Tabelle sich auf eine Input oder Output Datei bezieht.
Kennt heute kaum noch einer

camouflage
25-02-25, 07:58
Filetranslation kann das ohne Schleife
Früher war das ein F in Stelle 53 in der Headerkarte.
Kennt heute kaum noch einer

Verständlich, wenn du noch einen Steinzeitcode mit RPG erstellen möchtest. RPGLE kennt das nicht mehr. Ein Vorteil hat es natürlich, PDM funktioniert dann noch voll umfänglich. Die Schleifenlösung finde ich die Beste.

B.Hauser
25-02-25, 08:10
Bekommt man natürlich auch mit einem SQL Update hin:

Update Table
set Text = Translate(Text,
x'404040404040404040404040404040404040404040404040 404040404040404040',
x'202122232425262728292A2B2C2D2E2F3031323334353637 38393A3B3C3D3E3F41')

Die Hex-Zeichen von x'00' bis x'1F' gehören natürlich auch noch konvertiert! Kann man ja noch in die Strings einfügen.

Robi
25-02-25, 10:05
.... RPGLE kennt das nicht mehr....

Das ist falsch.
Ftrans gibt es noch

Ob in free weis ich nicht, die Pgmme die das benutzen sind alle noch nicht free.

Wer regelmässig (Schrott)-Daten von anderen Systemen bekommt oder Steuerdateien für andere Systeme mit exotischn werten erstellen muß, sollte sich damit beschäftigen.

Wer nur in der DB rum eiert braucht das vermutlich nicht

Fuerchau
25-02-25, 14:31
Und zur Not gibts den [%]XLATE ja auch noch.