Migaro. 技術Tips

                       

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


Valence RPGLEプログラムでのユニコード文字入出力

ValenceではUTF-16(CCSID1200)のデータを入出力することが可能です。
例えば、絵文字😊のようなサロゲートペアの絵文字もIBMiのファイルに保存/出力ができます。
Tipsでは、入出力の方法についてご紹介します。

IBMi CCSID1200 について

IBMiではCCSID1200を使用することでUTF-16のユニコード文字を扱えます。
CCSID1200を使用する場合にはファイルのフィールド型をGRAPHICフィールド、またはVARGRAPHICフィールドに設定する必要があります。

例) ファイル UNICDPF のDDS定義

0001.00      A          R UNICDPR                                 
0002.00      A            ASTR           5A                       
0003.00      A            USTR         500G         CCSID(1200)   

CCSID 1200を含む ファイルUNICDPFからデータソースを作成 > Formウィジェットを作成します。
Valence6.3 20250708.0以降では、ウィジェットからボタンクリック等でRPGプログラムを呼び出した場合、サロゲートペアの文字も含む文字列もHEXの文字列としてRPG側に送信されます。

RPGプログラム側での処理

例) SQLRPGLEプログラム(TIPS2604)

**free
/copy qcpylesrc,vvHspec
/include qcpylesrc,vvNabBtn
// --------------------------------------------------------------
// program start
// --------------------------------------------------------------
Initialize();
// place your code within the Process procedure...
//
Process();
CleanUp();
*inlr=*on;
// --------------------------------------------------------------
dcl-proc process;
  dcl-s lastr  char(5);
  dcl-s lustr  varucs2(500) ccsid(1200);
  dcl-s ltustr varchar(2000);
  dcl-s stmt   varchar(1000);

  lastr = GetFormChar('F1_ASTR');
  //unidocde文字はvarcharで一旦取得
  ltustr = GetFormChar('F1_USTR');
  //vvUtility_decodeUTF16でデコード
  lustr = vvUtility_decodeUTF16(ltustr);

  //SQL文を組み立てる
  stmt =  'INSERT INTO UNICDPF(ASTR,USTR) ';
  stmt += 'VALUES(?,?)';

  //SQL文を準備してから実行する
  exec sql prepare mystmt from :stmt;
  exec sql execute mystmt using :lastr,
                                :lustr;

  // SQLの結果を確認
  if sqlcod = 0 ;
    SetResponse('success':'true');
    SetResponse('info':'登録完了');
  else;
    SetResponse('success':'false');
    SetResponse('msg':'登録に失敗しました。');
  endif;
end-proc;
/include qcpylesrc,vvNabBtn

変数宣言

  dcl-s lastr  char(5);
  dcl-s lustr  varucs2(500) ccsid(1200);
  dcl-s ltustr varchar(2000);
  dcl-s stmt   varchar(1000);

データソースがGraphic型でCCSID 1200に定義されている場合、ウィジェットから送信されるデータはHEXの文字列として送信されます。
例えば、「こんにちは」が送信される場合、RPG側に送信されるデータは「30533093306B3061306F」になります。

  • こ = 3053
  • ん = 3093
  • に = 306B
  • ち = 3061
  • は = 306F

そのため、一時的にHEXの文字列をうけとるltustr変数はvarcharで宣言されています。
また、UTF-16(CCSID1200)の文字列として扱うlustr変数はvarcus2型のCCSID 1200として宣言します。

変換処理

  //unidocde文字はvarcharで一旦取得
  ltustr = GetFormChar('F1_USTR');
  //vvUtility_decodeUTF16でデコード
  lustr = vvUtility_decodeUTF16(ltustr);

ltustrに「30533093306B3061306F」が格納されて、Valenceのtoolkitに含まれる「vvUtility_decodeUTF16」を呼び出すことで「30533093306B3061306F」がデコードされて「こんにちは」がlustrに格納されます。

登録処理

  //SQL文を組み立てる
  stmt =  'INSERT INTO UNICDPF(ASTR,USTR) ';
  stmt += 'VALUES(?,?)';

  //SQL文を準備してから実行する
  exec sql prepare mystmt from :stmt;
  exec sql execute mystmt using :lastr,
                                :lustr;

処理は、UNICDPF テーブルへデータを追加登録するものです。
SQL文を文字列として作成し、PREPARE で準備した後、EXECUTE … USING で lastr と lustr の値を ASTR、USTR 列に登録しています。

  // SQLの結果を確認
  if sqlcod = 0 ;
    SetResponse('success':'true');
    SetResponse('info':'登録完了');
  else;
    SetResponse('success':'false');
    SetResponse('msg':'登録に失敗しました。');
  endif;

処理が成功すればsqlcod(sqlcode)に0が格納されるため処理成功、0以外の場合はエラーとしてレスポンスを返却します。

おわりに

IBMiでもCCSID1200のフィールドを使用することで、ユニコードベースで世界中の文字をあつかうことができますので是非ご活用ください。