RPG プログラムの中での EBCDIC からユニコード(UCS2)への変換

文字をユニコード (UCS2) に変換するための関数として %UCS2 というものが ILE/RPG には用意されています。

いろんなデータベースの世界でも、データをユニコードで格納する、というのは結構ホットな話題のようです。
確かに、データが文字化けしてしまう、というのは情報のロスに他ならないので何とかしたい、というのは当然ですよね。

そういった世の流れの中、RPG プログラムでもユニコードを扱えないと商売に差し障りが出てくるわけです。
そこでこの組み込み関数の登場、というわけですね。

使い方をちょっと実験してみたので、とりあえずの紹介です。


UCSLIB/UCSTEST

HDftActGrp(*NO) BndDir('QICU/QXICUAPI16')                             
 *                                                                    
DIsDigit          PR            10i 0 extproc(*cwiden:'u_isdigit')    
D                                1c   value                           
DUCSChar          S             10c                                   
DRtnCode          S             10i 0                                 
DTrue             C                   1                               
 *                                                                    
C                   eval      UCSChar = %UCS2('Test')                 
C                   eval      RtnCode = IsDigit(UCSChar)              
C                   exsr      Check                                   
C                   eval      UCSChar = %UCS2('Test')                 
C                   eval      RtnCode = IsDigit(%UCS2('Test'))        
C                   exsr      Check                                   
C                   eval      UCSChar = %UCS2(' テスト ')             
C                   eval      RtnCode = IsDigit(UCSChar)               
C                   exsr      Check                                 
C                   eval      UCSChar = %UCS2(' テスト ')           
C                   eval      RtnCode = IsDigit(%UCS2(' テスト '))  
C                   exsr      Check                                 
C                   eval      UCSChar = %UCS2('1234')               
C                   eval      RtnCode = IsDigit(UCSChar)            
C                   exsr      Check                                 
C                   eval      UCSChar = %UCS2('1234')               
C                   eval      RtnCode = IsDigit(%UCS2('1234'))      
C                   exsr      Check                                 
C                   eval      *inlr = '1'                           
 *                                                                  
C                   return                                          
 *                                                                  
C     Check         begsr                                           
C     UCSChar       dsply     'UCSMSGQ'                             
C                   if        RtnCode = True                        
C     'Is Digit'    dsply     'UCSMSGQ'              
C                   else                             
C     'Not Digit'   dsply     'UCSMSGQ'              
C                   endif                            
C                   endsr                            

CRTMSGQ UCSLIB/UCSMSGQ

UCSLIB がライブラリーリストに入っているのを確認してからコンパイルしてください。

CALL UCSLIB/UCSTEST

DSPMSG UCSLIB/UCSMSGQ

UCSLIB/UCSTEST1

HDftActGrp(*NO) BndDir('QICU/QXICUAPI16')                               
 *                                                                      
FUCSTEST1  CF   E             WORKSTN                                   
 *                                                                      
DIsDigit          PR            10i 0 extproc(*cwiden:'u_isdigit')      
D                                1c   value                             
DUCSChar          S             10c                                     
DRtnCode          S             10i 0                                   
DTrue             C                   1                                 
 *                                                                      
C                   exfmt     UCSREC1                                   
 *                                                                      
C                   eval      UCSChar = %UCS2(CHAR10)                   
C                   eval      RtnCode = IsDigit(UCSChar)                
C                   exsr      Check                                     
C                   eval      UCSChar = %UCS2(CHAR10)                    
C                   eval      RtnCode = IsDigit(%UCS2(char10))          
C                   exsr      Check                                     
C                   eval      UCSChar = %UCS2(%char(NUMBER10))          
C                   eval      RtnCode = IsDigit(UCSChar)                
C                   exsr      Check                                     
C                   eval      UCSChar = %UCS2(%char(NUMBER10))          
C                   eval      RtnCode = IsDigit(%UCS2(%char(NUMBER10))) 
C                   exsr      Check                                     
C                   eval      *inlr = '1'                               
 *                                                                      
C                   return                                              
 *                                                                      
C     Check         begsr                                               
C     UCSChar       dsply     'UCSMSGQ'                                 
C                   if        RtnCode = True                            
C     'Is Digit'    dsply     'UCSMSGQ'                                 
C                   else                                                
C     'Not Digit'   dsply     'UCSMSGQ'                                
C                   endif                                              
C                   endsr                                              

DDS はたとえばこんなかんじのものです。全然適当に作成したものなので、ツッコミはメールでください。

UCSLIB/UCSTEST1

A                                      DSPSIZ(24 80 *DS3) 
A          R UCSREC1                   CA03(03)           
A            CHAR10        10O  B  5 13                   
A            NUMBER10      10  0B  7 13                    

MOVEL

ちょっと蛇足ですが、以下のようなファイルを作成し、MOVEL を試してみたところ、最近の ILE RPG では MOVEL で CCSID 変換をサポートしているのでは? という疑問がわいてきました。

A          R UCSREC2                               
A            UCHAR1        10A         CCSID(1208) 
A            UCHAR2        10A         CCSID(1208)  

こんなコードで試してみましたが、CHAR10 は UCHAR2 にきちんと入っているようでした。(その時のジョブ CCSID は 5035)

誰か何か知っている人、教えていただけないでしょうか ...... やはりこの件のツッコミもメールでくださいませ。

HDftActGrp(*NO) BndDir('QICU/QXICUAPI16')                             
 *                                                                    
FUCSTEST1  CF   E             WORKSTN                                 
FUCSFILE2  UF A E             DISK                                    
 *                                                                    
DIsDigit          PR            10i 0 extproc(*cwiden:'u_isdigit')    
D                                1c   value                           
DUCSChar          S             10c                                   
DRtnCode          S             10i 0                                 
DTrue             C                   1                               
 *                                                                    
C                   exfmt     UCSREC1                                 
 *                                                                    
C                   eval      UCSChar = %UCS2(CHAR10)                 
C                   eval      RtnCode = IsDigit(UCSChar)              
C                   exsr      Insert                                  
C                   eval      *inlr = '1'                              
 *                                                                     
C                   return                                             
 *                                                                     
C     Insert        begsr                                             
C*                  movel     UCSChar       UCHAR1                    
C                   movel     CHAR10        UCHAR2                    
C                   write     UCSREC2                                 
C                   endsr                                             

補足

ちなみにテストに使用したシステムは V5R3 です。

[Top Pageに戻る]

Ads by TOK2