Vielleicht kommt der open() ein wenig durcheinander da die Flags nicht eindeutig sind:
flags = o_rdonly + o_creat + o_ccsid + o_textdata + o_text_creat;
Die roten Flags sind zu viel, da du die Datei ja nur lesen und nicht erstellen willst.

Laut Doku wird intern iconv() verwendet, es sollte also klappen.
open()--Open File

Verwirrend ist das Flag O_TEXT_CREATE:

When the O_TEXT_CREAT flag and its prerequisite flags are not set, the specified or derived CCSID is the CCSID in which data is to be returned (when reading from a file), or the CCSID in which data is being supplied (when writing to a file).

Versuche mal mit den diversen Flags zu spielen, aus der Doku werde auch ich nicht schlau wann und ob und von welcher in welche CCSID konvertiert wird.

Ich halte mich da eh an die CPYxxx-Befehle.

Nachtrag:
Per CHGATR (bzw. QSHELL "touch") kann man die CCSID der Datei anpassen.
Ggf. liegt es auch noch daran, da die ja wohl auf 819 (also ANSI) steht.