Migaro. 技術Tips

                       

ミガロ. 製品の技術情報
IBMiの活用に役立つ情報を掲載!


CCSID 1027のデータをCCSID 290に変換する方法

SmartPad4i(Cobos4i)ではCCSID290の英小文字についても入出力が可能です。例えば、メールアドレスやWebサイトのURLをIBMiプログラムから出力する際にも英小文字として扱うことができます。
英小文字をファイルから取得する際にはCCSID290の英小文字のコードポイントで登録されている必要があります。
CCSIDが290のフィールドにCCSID1027のデータが格納されている場合には正しく変換ができませんのでファイルのデータを変換が必要です。TipsではCCSID290のフィールドに登録されたCCSID1027のデータをCCSID290に変換する方法をご紹介します。

CCSID 290 のフィールドにCCSID1027のデータ

日本のIBMiユーザーはジョブのデフォルトCCSIDが5026で使用されていることが多いようです。
ホストコードページ930(カタカナ)でIBMiに接続した場合には、DFUを使用してファイルに英語の小文字を登録することはできません。
CCSID5026に対応するSBCSのCCSID290の英小文字は標準EBCDICコードページとは異なる特殊な位置に割り当てられています。標準のEBCDICで英小文字で使用されるコードポイントが、日本語のカタカナ文字に割り当てられているためです。

CCSID290のフィールドにCCSID1027で登録

IBM i のJavaベースクライアントツール IBMi ACS(Access Client Solution)では、ホストコードページのデフォルト値が939になっているため、IBMiに接続後 JOBのCCSIDが5026の状態でDFUを使用して英小文字を入力してファイルを更新するとCCSID 290のフィールドにCCSID 1027のコードポイントでデータが登録されてしまいます。
エミュレータ上でファイルを表示すると正しくデータが登録されているように見えますが、SQLでファイルを参照すると文字化けして表示されます。

文字化けしてしまう

CCSID290のフィールドに登録されたデータを修正

TESTF ファイル に FURLという名前のCCSID290 で設定されたフィールドが定義されており、CCSID1027のデータを変換する方法を例として説明します。

CCSID1027のフィールドを持つ同じファイルを作成

CCSID1027のフィールドを定義したファイルへ転送

FILETというファイルにFURLというCCSID290のフィールドが定義されている場合、FURLフィールドをCCSID1027に設定した別名のファイルを作成します。

例では、FILET2という一時ファイルを作成しました。

一時ファイルにデータをコピー

FILETからFILET2にデータをコピーします。
CPYFコマンドで現在のファイルから一時ファイルにデータをコピーしてください。

例) FILETが元ファイル、一時ファイルがFILET2です。 

QSYS/CPYF FROMFILE(SPTEST/FILET)      
          TOFILE(SPTEST/FILET2)  MBROPT(*REPLACE)            
          FMTOPT(*NOCHK)  ERRLVL(*NOMAX)            

FILET2のCCSID1027のフィールドにFILETのCCSID290(コードポイントは1027) で登録されているデータがコピーされますので、FILET2のデータはCCSID1027で英小文字として認識されるデータが登録されます。

一時ファイルから元のファイルへデータを戻す

一時ファイルから元のファイルにデータを戻します。
元ファイルの全レコードを削除後に、一時ファイルのデータをSQLで挿入します。

CCSID290に変換して登録

例) 元のファイルのレコードを削除

TRUNCATE TABLE SPTEST.FILET

例) 一時ファイルから元ファイルへデータをコピー

INSERT INTO SPTEST.FILET SELECT * FROM SPTEST.FILET2
CCSID290に変換して登録した結果