IFS にストリーム・ファイルを C/400 で単に作成したのでは
そのファイルは実行時のJOBの CCSID となってしまう。
例えば、こんな具合である。
sprintf(path, "%s/%s", dir, file); if((fildes = open(path, O_WRONLY | O_CREAT | O_TRUNC, S_IRWXO | S_IRWXU)) == FALSE){ /* *PUBLIC=RWX */ sprintf(msg, "CVTHTMSRV[%d] ファイル %s をオープンできません。 :%s", __LINE__, path, strerror(errno)); return FALSE; }
このファイルはストリーム・ファイルとして作成するのであるので恐らくは
ASCII コードで出力する場合が多いはずである。
しかし、上記の記述では初めて作成されるファイルの CCSID は
実行中のジョブのCCSID となってしまう。
つまり CCSID は 5035や 5026 のような値となってしまう。
次に出力されたストリーム・ファイルの中身を WRKLNK
などで眺めても
文字化けを起こしていて読取りが不明となってしまう。
このファイルの CCSID を調べてみると CCSID= 5035や5026の値が入ってしまっている。
なるほどこれでは文字化けを起こしてしまうのも当然であるが
それではどのようにすれば正しい CCSID で出力することができるのだろうか ?
次に CCSID を指定するファイル作成の方法を示す。
int ccsid;
/*(1) CCSID を生成 */
if(strncmp(charset, "SHIFT_JIS", 9) == 0) ccsid = 943; /* Shift_JIS */
else ccsid = 1208; /* UTF-8 */
:
:
/*(3) ファイルを作成モードで開く */
sprintf(path, "%s/%s", dir, file);
if((fildes = open(path, O_WRONLY | O_CREAT | O_TRUNC | O_CCSID,
S_IRWXO | S_IRWXU, ccsid)) == FALSE){ /* *PUBLIC==RWX */
sprintf(msg,
"CVTHTMSRV[%d] ファイル %s をオープンできません。 :%s",
__LINE__, path, strerror(errno));
return FALSE;
}
上記のようにファイル作成時には O_CCSID を指定して ccsid の値を渡してやれば
CCSID を指定してファイルを作成することができる。
Windows や UNIX, LINUX ではファイルに CCSID という属性はない。
あるのは System i の IFSだけである。
他のプラットフォームでは CCSID の指定ができないが IBM System i だけに
CCSID の指定があるので、あえてここでテクニックとして紹介した。