前項の紹介で示したように RPG の BIFF
関数である %UCS2
で漢字を Unicode に変換することは
できない。さらに %UCS2 では UTF-8 へ変換することはできない。
つまり %UCS2 では、ほとんど Unicode への変換の機能を期待することはできない。
そこで、ここでは EnterpriseServer で提供されているサービス・プログラム UNI_CODE
を使って
UTF-8 へ変換する方法を紹介しよう。
------------------------------------------------------------------------------------------- 0001.00 H DFTNAME(TESTUNI) DATEDIT(*YMD/) BNDDIR('QC2LE') 0002.00 F******** IFS への UNICODE 出力 *************************************** 0003.00 F* 0004.00 F* CRTRPGMOD QTEMP/TESTUNI2 SRCFILE(PGMRLIB/QRPGLESRC) AUT(*ALL) 0005.00 F* CRTPGM OBJLIB/TESTUNI2 MODULE(QTEMP/TESTUNI2) 0006.00 F* SRVPGM(QSYS/QP0LLIB1 ASNET.COM/UNI_CODE) AUT(*ALL) 0007.00 F* 0008.00 F********************************************************************** 0009.00 D FD S 10I 0 0010.00 D DATA S 128A 0011.00 D UTF S 128A 0012.00 0013.00 D OPEN_ PR 10I 0 EXTPROC('open') 0014.00 D PATH * VALUE 0015.00 D FLAG 10I 0 VALUE 0016.00 D MODE 10I 0 VALUE OPTIONS(*NOPASS) 0017.00 D CODEPAGE 10I 0 VALUE OPTIONS(*NOPASS) 0018.00 D TOPAGE 10I 0 VALUE OPTIONS(*NOPASS) 0019.00 0020.00 D WRITE_ PR 10I 0 EXTPROC('write') 0021.00 D DESC 10I 0 VALUE 0022.00 D DATA * VALUE 0023.00 D DTALEN 10I 0 VALUE 0024.00 0025.00 D CLOSE_ PR EXTPROC('close') 0026.00 D DESC 10I 0 VALUE 0027.00 0028.00 D PERROR_ PR EXTPROC('perror') 0029.00 D STR * VALUE 0030.00 0031.00 D TO_UTF8 PR 10I 0 EXTPROC('toUTF8') 0032.00 D SRCSTR * VALUE 0033.00 D TGTSTR * VALUE 0034.00 D CONTRY 10I 0 VALUE 0035.00 0036.00 D O_CREAT S 10I 0 INZ(8) 0037.00 D O_TRUNC S 10I 0 INZ(64) 0038.00 D O_CCSID S 10I 0 INZ(32) 0039.00 D O_WRONLY S 10I 0 INZ(2) 0040.00 D S_IWUSR S 10I 0 INZ(128) 0041.00 D S_IRUSR S 10I 0 INZ(256) 0042.00 D PATH S 14A INZ('/A001/TEST.TXT') 0043.00 D MSG S 80A INZ(' オープン・エラーです ') 0044.00 0045.00 D USA S 10I 0 INZ(0) 0046.00 D JPN S 10I 0 INZ(1) 0047.00 D CHN S 10I 0 INZ(2) 0048.00 D HKG S 10I 0 INZ(3) 0049.00 D KOR S 10I 0 INZ(4) 0050.00 D TAI S 10I 0 INZ(5) 0051.00 D GER S 10I 0 INZ(6) 0052.00 D Shift_JIS S 10I 0 INZ(7) 0053.00 0054.00 D LEN S 10I 0 0055.00 /FREE 0056.00 FD = OPEN_(%ADDR(PATH): 0057.00 O_CREAT + O_TRUNC + O_CCSID + O_WRONLY : 0058.00 S_IWUSR + S_IRUSR : 0059.00 1208); 0060.00 IF (FD < 0); 0061.00 PERROR_(%ADDR(MSG)); 0062.00 RETURN; 0063.00 ENDIF; 0064.00 DATA = ' こんにちは UTF-8' + X'00'; 0065.00 LEN = TO_UTF8(%ADDR(DATA): %ADDR(UTF): JPN); 0066.00 IF (LEN > 0); 0067.00 WRITE_(FD : %ADDR(UTF) : LEN); 0068.00 ENDIF; 0069.00 CLOSE_(FD); 0070.00 *INLR = *ON; 0071.00 /END-FREE -------------------------------------------------------------------------------------------
CRTRPGMOD MODULE(QTEMP/TESTUNI2) SRCFILE(MYSRCLIB/QRPGLESRC) AUT(*ALL) CRTPGM PGM(OBJLIB/TESTUNI2) MODULE(QTEMP/TESTUNI2) BNDSRVPGM(ASNET.COM/UNI_CODE) ACTGRP(*NEW) AUT(*ALL)
UNI_CODE *SRVPGM
の toUTF8
関数のプロトタイプを定義しているのが
0031.00 D TO_UTF8 PR 10I 0 EXTPROC('toUTF8') 0032.00 D SRCSTR * VALUE 0033.00 D TGTSTR * VALUE 0034.00 D CONTRY 10I 0 VALUE
であり、実際に UTF-8 に変換しているのが
0065.00 TO_UTF8(%ADDR(DATA): %ADDR(UTF): JPN);
である。パラメータ JPN
は日本語からの変換を指示しており
0045.00 D USA S 10I 0 INZ(0) 0046.00 D JPN S 10I 0 INZ(1) 0047.00 D CHN S 10I 0 INZ(2) 0048.00 D HKG S 10I 0 INZ(3) 0049.00 D KOR S 10I 0 INZ(4) 0050.00 D TAI S 10I 0 INZ(5) 0051.00 D GER S 10I 0 INZ(6) 0052.00 D Shift_JIS S 10I 0 INZ(7)
で示されているように英語、日本語、中国語(簡体字), 中国語(繁体字), 韓国語、タイ語、ドイツ語、そして
Shift_JIS もサポートしている。
Shift_JIS とは ASCII Shift_JIS と UTF-8 との変換もサポートしている。
UNI_CODE *SRVPGM
を使わずに独力の力技でやってみようという豪傑ツワモノの人がいれば
API : iconv
を使用することをお奨めする。
ただし iconv
のパラメータは繊細であり、かなり面倒で正常に思うがままに動作するようになるまでは
時間を必要とすることを覚悟する必要がある。