C/400

111. IFSストリーム・ファイルに CCSID を指定するには

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 の指定があるので、あえてここでテクニックとして紹介した。