以下の方法によりUNICODEデータをセットできます。
1. RPGの作成
ファイルは、3.17.UNICODEデータのセットアップGフィールド+CCSID(13488)を含むファイルです。
画面は、o(オープンフィールド)にします。
この場合、転送は、特に意識しなくても、EBCDIC<-->UNICODEの変換は、DBMSが勝手にしてくれます
PF
A*------------------------------------*
A R UCS2RR
A*------------------------------------*
A A1FLG0 10G COLHDG('FLAG A')
A CCSID(13488)
A A1FLG1 10G COLHDG('FLAG O')
A CCSID(13488)
A A1FLG2 10G COLHDG('FLAG G')
A CCSID(13488)
DSPF
A*-------------------------------------*
A R FMT01
A*-------------------------------------*
A V1FLG0 30O B 6 20
A V1FLG1 30O B 8 20
A V1FLG2 30O B 10 20
RPG例
1 CHAIN UCS2PF
MOVEL(p) A1FLG0 V1FLG0
MOVEL(p) A1FLG1 V1FLG1
MOVEL(p) A1FLG2 V1FLG2
EXFMT FMT01
MOVEL(p) V1FLG0 A1FLG0
MOVEL(p) V1FLG1 A1FLG1
MOVEL(p) V1FLG2 A1FLG2
IF %FOUND
UPDATE UCS2RR
ELSE
WRITE UCS2RR
ENDIF
ENDDO
2.CPYFによる方法
この方が、DDSを作るだけで、可能になるため、手軽です。
UNICODE-FILE
A*------------------------------------*
A R UCS2RR
A*------------------------------------*
A A1FLG0 10G COLHDG('FLAG A')
A CCSID(13488)
A A1FLG1 10G COLHDG('FLAG O')
A CCSID(13488)
A A1FLG2 10G COLHDG('FLAG G')
A CCSID(13488)
EBCDIC−FILE
A*------------------------------------*
A R UCS2RR
A*------------------------------------*
A A1FLG0 20O COLHDG('FLAG A')
A A1FLG1 20O COLHDG('FLAG O')
A A1FLG2 20O COLHDG('FLAG G')
をつくる。
-
CPYF UNICODE-FILE EBCDIC-FILE MBROPT(*REPLACE) FMTOPT(*MAP)
-
EBCDIC-FILEをDFUなどでデータを修正
-
CPYF EBCDIC-FILE UNICODE-FILE MBROPT(*REPLACE) FMTOPT(*MAP)
CPYFのFMTOPT(*MAP)で、ユニコードとEBCDICの変換をしてくれます。
3. STRSQLを使った更新
対話型SQLのUPDATE命令を使います。
桁の長さの注意点
- G(10)は、10グラフィック文字なので、バッファでは20バイト占有します。
- CCSID(13488)は、1ワード2バイト(SBCSでもDBCSでも)です。※そもそもSBCSもDBCSも同じコードページに入れようとしているわけですからね。
したがって
1234567890というSBCSは、G(20)消費するし、1234567890も同じくG(20)消費します
1)EBCDIC ⇒ UNICODEの例
バイト |
1 |
2 |
3 |
4 |
5 |
6 |
7 |
8 |
9 |
10 |
11 |
12 |
13 |
14 |
15 |
16 |
17 |
18 |
19 |
20 |
文字 |
1 |
0e |
あ |
0f |
3 |
0e |
い |
0f |
5 |
0e |
う |
0f |
7 |
0e |
え |
0f |
という20バイトのオープンフィールドのデータは、
バイト |
1 |
2 |
3 |
4 |
5 |
6 |
7 |
8 |
9 |
10 |
11 |
12 |
13 |
14 |
15 |
16 |
文字 |
1 |
あ |
3 |
い |
5 |
う |
7 |
え |
となり、G(16) 長となります。
2)UNICODE ⇒ EBCDIC の例
バイト |
1 |
2 |
3 |
4 |
5 |
6 |
7 |
8 |
9 |
10 |
11 |
12 |
13 |
14 |
15 |
16 |
17 |
18 |
19 |
20 |
文字 |
1 |
あ |
2 |
い |
3 |
う |
4 |
え |
5 |
お |
という G(20) のデータ(数字は半角)は、
バイト |
1 |
2 |
3 |
4 |
5 |
6 |
7 |
8 |
9 |
10 |
11 |
12 |
13 |
14 |
15 |
16 |
17 |
18 |
19 |
20 |
21 |
22 |
23 |
24 |
25 |
文字 |
1 |
0e |
あ |
0f |
2 |
0e |
い |
0f |
3 |
0e |
う |
0f |
4 |
0e |
え |
0f |
5 |
0e |
お |
0f |
という25バイトのオープンフィールドのデータとなります。
つまり、データが全角と半角を交互に含んでいると、0E0Fで増減があり、EBCDICのコードにした場合、G(1)=
2バイトの計算式は、必ずしも言えないことになります。これは、
UNICODE -> EBCDIC ...UNICODE < EBCDIC
で、受取先に桁あふれがあり得、
EBCDIC -> UNICODE ...UNICODE > EBCDIC
では、受取先に桁あふれはありえない
ということになります。PCのEBCDICへの、アップロードと同じことです。
参考ページ
14.30.オープンフィールドのアップロード最大データ長
但しこの参考ページでは、半角を1バイトとして計算しています。Unicodeは従来の半角も、2バイトを必要とします。老婆心までに。
2003-8-12@
|