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