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のフィールドを使用することで、ユニコードベースで世界中の文字をあつかうことができますので是非ご活用ください。