IFS

24. CPYFRMSTF と CPYFRMIMPF はどうちがう?

IFS からライブラリー・システムへデータをコピーしたいときに使うコマンドは
CPYFRMSTMF CPYFRMIMPF の2 つが用意されているが、どのように違うのだろう?
どのように使い分ければよいのだろう?
F1 ヘルプを見ても IBM の説明はいつものように非常にわかりにくい。
簡単に違いを識別する方法を紹介しよう。

CPYFRMSTMF (Copy From Stream File) : IFS からソース・ファイルへのコピー
CPYFRMIMPF (Copy From IMP File)      : IFS からデータ・ベースへのコピー

と、分かってしまえば簡単である。
通常、業務で使用しているファイルはデータ・ベースであるので
一般的にデータをライブラリーのデータ・ベースにコピーする場合は
CPYFRMIMPF を使う。
このとき文字コード : CCSID は IFS とデータ・ベースの CCSID を見て
自動的に変換される。
ただしすべての CCSID に対応しているかというとそうではない。
i Access (旧Client Access) の転送記述は CCSID : 1202 という UNI コードでできている。
一般的に UniCode (ユニコード) と言えば

UTF-16 1200 (半角文字は2バイト , 漢字は2バイトもしくは4バイト)
UTF-8   1208 (半角文字は1バイト , 漢字は3バイト)

このサイトでは何度も説明しているが CCSID : 1399 は Unicode ではない。
Unicode で漢字は 3バイトで表現されるが CCSID : 1399 を設定しても
IBM i の内部の漢字は 2 バイトのままであり 3 バイトになることはない。

が主流であるが i Access の転送記述 (.TTO, .TFR, .DTF, .DTT) はユニコードであるが
CCSID は 1202 である。
ところが IBM i は CCSID : 1202 の変換はサポートしていない。
これは API : iconv を使っても 1202 を EBCDIC に変換することはできない。
これは IBM i 内部で CCSID : 1202 の変換テーブルを保有していないためだと
推測される。

AutoWeb のデータ転送機能では CCSID : 1202 の変換もサポートしている。
これは i Access のデータ転送定義を読み取るためであるが
CCSID : 1202 と EBCDIC (5026, 5035 および 1399) との相互変換もサポートしている。
書き込みも可能である。

さらに ACS (=Access Client Solutions) の転送記述の CCSID は 1208 (UTF-8) と
IBM は製品をリリースする度に CCSID を変えて迷走しているようである。
ILE-RPG は UTF-16 : 1200 はサポートしているが 1208 はサポートしていない。
IBM が Unicode は 1200 であると主張するのであれば ACS はなぜ 1208 にしたのか
理解できない。
Unicode は Web の世界では圧倒的に UTF-8 が普及している。
UTF-8 は半角アルファベットは ASCII と同じコードで 1 バイト表示であり
コードも ASCII と同じである
しかし漢字は 3 バイト表現である。
つまり漢字だけが Unicode として表現されていて、英小文字は ASCII と同じである。
この UTF-8 が Unicode では圧倒的に普及していて、今、ご覧になっている
このサイトも charset = utf-8 として表示されている。