IC SunsetThe developerWorks Connections platform will be sunset on December 31, 2019. On January 1, 2020, this community and its apps will no longer be available. More details available on our FAQ.
Topic
  • 3 replies
  • Latest Post - ‏2019-08-01T16:32:14Z by jlab
jlab
jlab
7 Posts

Pinned topic iconv() translation

‏2019-07-31T20:20:41Z |

I receive text from web service in ASCII, and I use ICONV() to translate it to EBCID.  It works fine until I have accents in the text. When accents are found, like letter é    the return code on the ICONV API call is 4294967295 

and it is not translated.

 

This is how I open:

     source.CCSID = 1208;   // 1208 = UTF-8                   
     target.CCSID = 0;      //    0 = current job's CCSID     
     toEBC = QtqIconvOpen( target: source );          

 

My machine setup is as follow: 

 System value . . . . . :   QCHRID  is:                                

     Character ID . . . . . :   697            1-32767                  

    Code page  . . . . . . :   37             1-32767                  

                                                                    

                                                      

 System value . . . . . :   QCCSID                             

   Coded character set                                           

   identifier . . . . . :   65535      1-65535  

                                                              
  I`ve tried all sorts of combination for the Source.CCSID and Target.CCSID  and nothing works.  Any idea on how I can get this done?

I also tried the Translate program, but that changes the é to an i

 

Thank you!    

  • jlab
    jlab
    7 Posts
    ACCEPTED ANSWER

    Re: iconv() translation

    ‏2019-08-01T16:32:14Z  

    I discussed with the vendor  and he is sending it as extended ascii Windows-1252.  .  I changed source.ccsid = 1252    And it is working!!

    Thank you,

     

  • barbara_morris
    barbara_morris
    605 Posts

    Re: iconv() translation

    ‏2019-07-31T20:51:31Z  

    Please show more code so that we can try your code to see what's wrong. Show your data structure definitions, your prototypes, and all tthe code related to QtqIconvOpen() and iconv().

  • jlab
    jlab
    7 Posts

    Re: iconv() translation

    ‏2019-08-01T12:48:48Z  

    Please show more code so that we can try your code to see what's wrong. Show your data structure definitions, your prototypes, and all tthe code related to QtqIconvOpen() and iconv().

    Good morning,   here is the code.  Thank you for your help,  let me know if you need something else,

    ----------------------------------------------------------

           febdatajo  uf   e           k disk                                                            
          /copy qcpysrc,iconv_h                                                                        
         d in_data         s          32767a   varying                                                 
         d in_datatr       s          32767a                                                           
         d in_datal        s          32767a   varying                                                 
         d in_dataltr      s          32767a                                                           
         D options         s            200a   varying                                                 
         d length          s             10i 0                                                         
                                                                                                       
         d decode          s          32767a                                                           
         d decodelen       s             10u 0                                                         
         D outputbuf       s          32767a                                                           
         D outputlen       s             10u 0                                                         
                                                                                                       
         d source          ds                  likeds(QtqCode_t)                                       
         d                                     inz(*likeds)                                            
         d target          ds                  likeds(QtqCode_t)                                       
         d                                     inz(*likeds)                                            
         d toEBC           ds                  likeds(iconv_t)                                         
                                                                                                       
         D p_input         s               *                                                           
         D p_output        s               *                                                           
         D inputleft       s             10u 0                                                         
         D outputleft      s             10u 0                                                         
         D nReturn         s             10u 0                                                         
                                                                                                       
          /free                                                                                        
            // For converting app beg                                                                  
            // -----------------------------------------------                                         
            //   find the appropriate translation 'table'                                              
            //   for converting UTF-8 to the job's CCSID                                               
            //                                                                                         
            //  Note: 0 is a special value that means                                                  
            //        "job CCSID".  Better to use that than                                            
            //        to hard-code 37.                                                                 
            // -----------------------------------------------                                         
                                                                                                       
            source.CCSID = 1208;   // 1208 = UTF-8                                                     
            target.CCSID = 0;      //    0 = current job's CCSID                                       
            toEBC = QtqIconvOpen( target: source );                                                    
                                                                                                       
            if (toEBC.return_value = -1);                                                              
               // handle error...                                                                      
            endif;                                                                                     
                                                                                                       
            read ebdatar;                                                                              
            dow not %eof(ebdatajo);                                                                    
                                                                                                       
            // This will translate ascii in_data into in_data in ebcdic                                
            clear in_data;                                                                             
            clear outputbuf;                                                                           
            in_data = %trim(ebcont);                                                                   
            length = %len(%trim(in_data));                                                             
                                                                                                       
            decode = %trim(in_data);                                                                   
            exsr $iconv;                                                                               
            clear in_data;                                                                             
            in_data = %trim(outputbuf);                                                                
                                                                                                       
            read ebdatar;                                                                              
            enddo;                                                                                     
                                                                                                       
                                                                                                       
            iconv_close(toEBC);                                                                        
                                                                                                       
          /end-free                                                                                    
         c                   Eval      *inlr = *on                                                     
                                                                                                       
                                                                                                       
            begsr $iconv;                                                                              
            // -----------------------------------------------                                         
            //   Translate data.                                                                       
            //                                                                                         
            //   the iconv() API will increment/decrement                                              
            //   the pointers and lengths, so make sure you                                            
            //   do not use the original pointers...                                                   
            // -----------------------------------------------                                         
                                                                                                       
            p_input  = %addr(decode);                                                                  
            inputleft = %len(%trimr(decode));                                                          
                                                                                                       
            p_output = %addr(outputbuf);                                                               
            outputleft = %size(outputbuf);                                                             
                                                                                                       
            nReturn = iconv( toEBC                                                                     
                 : P_input                                                                             
                 : inputleft                                                                           
                 : p_output                                                                            
                 : outputleft);                                                                        
                                                                                                       
            // -----------------------------------------------                                         
            //                                                                                         
            //  At this point, 'outputbuf' should contain                                              
            //  the EBCDIC data.                                                                       
            // -----------------------------------------------                                         
                                                                                                       
                                                                                                       
            endsr;

     

    And this is the iconv_h cpysrc:

     

         d iconv_t         DS                  qualified                             
         d                                     based(StructureTemplate)              
         d   return_value                10I 0                                       
         d   cd                          10I 0 dim(12)                               
                                                                                     
         d QtqCode_T       DS                  qualified                             
         d  CCSID                        10I 0 inz                                   
         d  ConvAlt                      10I 0 inz                                   
         d  SubsAlt                      10I 0 inz                                   
         d  ShiftAlt                     10I 0 inz                                   
         d  InpLenOp                     10I 0 inz                                   
         d  ErrorOpt                     10I 0 inz                                   
         d  Reserved                      8A   inz(*ALLx'00')                        
                                                                                     
         d iconv_code_t    DS                  qualified                             
         d  owner                         8a   inz('IBMCCSID')                       
         d  CCSID                         5a   inz('00000')                          
         D  ReservedTo                                                               
         d   ConvAlt                      3a   inz('000')                            
         D                                     overlay(ReservedTo)                   
         d   SubsAlt                      1a   inz('0')                              
         D                                     overlay(ReservedTo:*next)             
         d   ShiftAlt                     1a   inz('0')                              
         D                                     overlay(ReservedTo:*next)             
         d   InpLenOpt                    1a   inz('0')                              
         D                                     overlay(ReservedTo:*next)             
         d   ErrorOpt                     1a   inz('0')                              
         D                                     overlay(ReservedTo:*next)             
         d   ReservedFrom                12A   inz(*ALLx'00')                        
         D                                     overlay(ReservedTo:*next)             
                                                                                     
         d QtqIconvOpen    PR                  extproc('QtqIconvOpen')               
         d                                     like(iconv_t)                         
         d    toCode                           likeds(QtqCode_t) const               
         d    fromCode                         likeds(QtqCode_t) const               
                                                                                     
         D iconv_open      PR                  extproc('iconv_open')                 
         D                                     like(iconv_t)                         
         D   toCode                            like(iconv_code_t) const              
         D   fromCode                          like(iconv_code_t) const              
                                                                                     
         d iconv           PR            10U 0 extproc('iconv')                      
         d   cd                                like(iconv_t) value                   
         d   inbuf                         *                                         
         d   inbytesleft                 10U 0                                       
         d   outbuf                        *                                         
         d   outbytesleft                10U 0                                       
                                                                                     
         d QlgTransformUCSData...                                                    
         d                 PR            10U 0 extproc('QlgTransformUCSData')        
         d   xformtype                   10i 0 value                                 
         d   inbuf                         *                                         
         d   inbytesleft                 10U 0                                       
         d   outbuf                        *                                         
         d   outbytesleft                10U 0                                       
         d   outspacereq                 10U 0                                       
                                                                                     
         D ICONV_FAIL      C                   CONST(4294967295)                     
                                                                                     
         D iconv_close     PR            10I 0 extproc('iconv_close')                
         D   cd                                like(iconv_t) value                   
                                                                                     

     

     

                                                                                           

  • jlab
    jlab
    7 Posts

    Re: iconv() translation

    ‏2019-08-01T16:32:14Z  

    I discussed with the vendor  and he is sending it as extended ascii Windows-1252.  .  I changed source.ccsid = 1252    And it is working!!

    Thank you,