RPG

420. EBCDICを簡単にUTF-8に変換するには

ILE-RPGでは組込み関数%UCS2を使うとEBCDICの文字ストリングを
UCS2つまりUTF-16に変換することができる。
つまりEBDCICからUnicodeへの変換である。

例えば次のような具合である。

0025.01 D UCS2            S            512C   CCSID(1200)
 :
0051.01  /FREE                    
0051.02    UCS2 = %UCS2(XML);
0051.03  /END-FREE

IBMはUnicodeと言えばUTF-16(CCSID:1200)が標準であり
一般的であると思っていたようである。
しかし現実はそうではなくUTF-8(CCSID: 1208 )が主流である。
インターネットのホーム・ページは大半がUTF-8 で
作成されておりUTF-16のコンテンツなどは見たことがない。
MSNやGoogle, YahooもみなUTF-8で作成されている。
これはUTF-16もUTF-8も漢字はほぼ3バイトであるが
UTF-16の場合の半角英数字は2バイトであるのに対して
UTF-8の場合の半角英数字は1バイトであり
ASCIIコードと同じである。
つまり扱いやすいし容量も少なくて済む。
ということでUnicodeの現状はUTF-8が占めている。
Ajaxなどに使用されるのもUTF-8であるし
LINEの通信に利用されているのもUTF-8である。

IBMもようやく周りからの意見などによって
UTF-16よりもUTF-8のほうが必要であることに
気がついてUTF-8への対応をi5/OS Ver7.2から開始した。
私たちはIBMがUnicode対応を打ち出した当初から
IBMは遅れていると気が付いていて%UCS2は
使い物にはならないと感じていたが
IBMもようやく %UCS2を次のように拡張した。

0025.01 D UCS8            S            512C   CCSID(1208)
 :
0051.01  /FREE                    
0051.02    UCS8 = %UCS2(XML:1208);
0051.03  /END-FREE                

これによってCCSIDを追加で指定することによって
EBCDICをUTF-8に変換することが可能になった。

CCSID 1399はUnicodeではありません

都市伝説のように特約店のSEなどでCCSIDをUnicode 1399に変えましょうと
言ったりするSEがいるがこれは全くの間違い。
PCOMMなどのエミュレータで 1399(Unicode)と書かれていることが
原因であると思うが1399はあくまでもEBCDICである。
Unicodeの場合はUTF-8であっても漢字は3バイトである。
CCSIDを1399に変更してもEBCDICの漢字は3バイトにはならない。
個人サイトでいまだにCCSID1399はUnicodeですと書かれているサイトも
あるが全くの誤りである。