RPG

412. RPGでUnicodeのファイルをIFSに出力するには

RPGでもUnicoeのファイルをIFSに出力することができる。
C言語のopen関数でUnicodeのCCSIDを指定して出力すればよい。

Unicodeと言っても

・UTF-16 (CCSID 1200)

・UTF-8 (CCSID 1208)

の2種類のUnicodeがある。
UTF-16は英数字も2バイト以上であるが
UTF-8 は英数字は半角で1バイトである。
現在、インターネットの表示用のHTMLとして
利用されているのは大半がUTF-8 である。

[ RPG : TEST1200 ]

CCSID 1200を出力するRPGサンプル

ソースはこちらから

0001.00 H DFTNAME(TEST1200) DATEDIT(*YMD/) BNDDIR('QC2LE')                             
0002.00 H DFTACTGRP(*NO)                                                               
0003.00 F********** CCSID 1200 で IFS へ出力 **********************************        
0004.00 F*                                                                             
0005.00 F**********************************************************************        
0006.00                                                                                
0007.00  * CRTBNDRPG PGM(TEST.COM/TEST1200) SRCFILE(R610SRC/QRPGLESRC) DFTACTGRP(*NO)  
0008.00  *   ACTGRP(*NEW) DBGVIEW(*SOURCE) AUT(*ALL)                                   
0009.00                                                                                
0010.00  /COPY QSYSINC/QRPGLESRC,IFS                                                   
0011.00 D FD              S             10I 0                                          
0012.00 D DATA            S           1000C   CCSID(1200)                              
0013.00 D ANS             S              1A                                            
0014.00                                                                                
0015.00  /FREE                                                                         
0016.00     UNLINK('/TEST/TEST1200.TXT');                                              
0017.00     FD = open('/TEST/TEST1200.TXT'                                             
0018.00              : O_CREAT + O_TRUNC + O_CCSID + O_WRONLY                          
0019.00              : S_IWUSR + S_IRUSR                                               
0020.00              : 1200);                                                          
0021.00     If (FD < 0);                                                               
0022.00       DSPLY ' 作成に失敗しました。 ' '' ANS;                                   
0023.00       *INLR = *ON;                                                             
0024.00       RETURN;                                            
0025.00     ENDIF;                                               
0026.00     DATA = %UCS2('HELLO WORLD' + X'0D25');               
0027.00     CALLP WRITE(FD: %ADDR(DATA): %LEN(%TRIMR(DATA)) + 2);
0028.00     CALLP CLOSE(FD);                                     
0029.00     DSPLY ' 作成に成功しました。 ' '' ANS;               
0030.00     *INLR = *ON;                                         
0031.00  /END-FREE   


                                             

[コンパイル]

CRTBNDRPG PGM(MYLIB/TEST1200) SRCFILE(MYSRCLIB/QRPGLESRC) DFTACTGRP(*NO)
ACTGRP(*NEW) DBGVIEW(*SOURCE) AUT(*ALL)

[解説]
open関数の
O_CREAT : 作成
O_TRUNC : 上書き
O_CCSID : CCSIDの指定
O_WRONLY : WRITE READ ONLY
を意味する。
X’OD25′ は改行コードの出力

[ RPG : TEST1208 ]

CCSID 1208を出力するRPGサンプル

ソースはこちらから

0001.00 H DFTNAME(TEST1208) DATEDIT(*YMD/) BNDDIR('QC2LE')                            
0002.00 H DFTACTGRP(*NO)                                                              
0003.00 F********** CCSID 1208 で IFS へ出力 **********************************       
0004.00 F*                                                                            
0005.00 F**********************************************************************       
0006.00                                                                               
0007.00  * CRTBNDRPG PGM(TEST.COM/TEST1208) SRCFILE(R610SRC/QRPGLESRC) DFTACTGRP(*NO) 
0008.00  *   ACTGRP(*NEW) DBGVIEW(*SOURCE) AUT(*ALL)                                  
0009.00                                                                               
0010.00  /COPY QSYSINC/QRPGLESRC,IFS                                                  
0011.00 D FD              S             10I 0                                         
0012.00 D DATA            S           1000C   CCSID(1200)                             
0013.00 D ANS             S              1A                                           
0014.00                                                                               
0015.00  /FREE                                                                        
0016.00     UNLINK('/TEST/TEST1208.TXT');                                             
0017.00     FD = open('/TEST/TEST1208.TXT'                                            
0018.00              : O_CREAT + O_TRUNC + O_CCSID + O_WRONLY                         
0019.00              : S_IWUSR + S_IRUSR                                              
0020.00              : 1208                                                           
0021.00              : 1200);                                                         
0022.00     If (FD < 0);                                                              
0023.00       DSPLY ' 作成に失敗しました。 ' '' ANS;                                  
0024.00       *INLR = *ON;                                       
0025.00       RETURN;                                            
0026.00     ENDIF;                                               
0027.00     DATA = %UCS2('HELLO WORLD' + X'0D25');               
0028.00     CALLP WRITE(FD: %ADDR(DATA): %LEN(%TRIMR(DATA)) + 2);
0029.00     CALLP CLOSE(FD);                                     
0030.00     DSPLY ' 作成に成功しました。 ' '' ANS;               
0031.00     *INLR = *ON;                                         
0032.00  /END-FREE       


                                         

[コンパイル]

CRTBNDRPG PGM(MYLIB/TEST1208) SRCFILE(MYSRCLIB/QRPGLESRC) DFTACTGRP(*NO)
ACTGRP(*NEW) DBGVIEW(*SOURCE) AUT(*ALL)

[解説]
CCSID 1208 で UTF-8 を出力している。