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 を出力している。