× The internal search function is temporarily non-functional. The current search engine is no longer viable and we are researching alternatives.
As a stop gap measure, we are using Google's custom search engine service.
If you know of an easy to use, open source, search engine ... please contact support@midrange.com.



On Mon, 8 Mar 2004, Larry wrote:
>
> I have a problem: I want to create a stream file with data in UTF-8 format.
> Thanks to Scott Klement, I've sorted out my open() O_CCSID vs O_CODEPAGE
> dilemma, but I need to convert my data before I write it to the file.

Why?  Why not let open() convert it for you?


> Sounds simple? It should be. The problem is that I know I can use the
> iconv_open(), iconv() and iconv_close() triplets to do the CCSID conversion
> of the data I have sitting on my pointers, but I can't seem to get it
> working. I can perform the open ok (return value of 0). It's calling iconv()
> that is causing me grief.

The following code works for me.  But, IMHO, iconv() is an awkward API.  I
would strongly recommend getting open() to do the conversion for you
instead, it'll make your code much more readable.

      *  Quick & Dirty iconv() Demo
      *
      *
     H DFTACTGRP(*NO) ACTGRP(*NEW)
     H BNDDIR('QC2LE')

     d iconv_t         DS                  based(prototype_only)
     d   return_value                10I 0
     d   cd                          10I 0 dim(12)

     d from            DS
     d  from_CCSID                   10I 0
     d  from_ConvAlt                 10I 0 inz(0)
     d  from_SubsAlt                 10I 0 inz(0)
     d  from_ShiftAlt                10I 0 inz(1)
     d  from_InpLenOp                10I 0 inz(0)
     d  from_ErrorOpt                10I 0 inz(1)
     D  from_Reserved                 8A   inz(*ALLx'00')

     d to              DS
     d  to_CCSID                     10I 0
     d  to_ConvAlt                   10I 0 inz(0)
     d  to_SubsAlt                   10I 0 inz(0)
     d  to_ShiftAlt                  10I 0 inz(1)
     d  to_InpLenOp                  10I 0 inz(0)
     d  to_ErrorOpt                  10I 0 inz(1)
     D  to_Reserved                   8A   inz(*ALLx'00')

     d QtqIconvOpen    PR                  extproc('QtqIconvOpen')
     d                                     like(iconv_t)
     d    tocode                           like(to) const
     d    fromcode                         like(from) 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 iconv_close     PR            10I 0 extproc('iconv_close')
     D   cd                                like(iconv_t) value

      *
      * MI function to get a hex dump of data in memory
      *   (target will be twice the size of the source)
      *
     D HexDump         PR                  ExtProc('cvthc')
     D   target                   32767A   options(*varsize)
     D   src_bits                 32767A   options(*varsize) const
     D   length                      10I 0 value

     D ic              ds                  likeds(iconv_t)
     D Data            s             12A   varying
     D p_Data          s               *
     D DataLen         s             10U 0
     D HexData         s             24A

      *
      *  1252 = MS Windows, US ASCII
      *     0 = special value meaning "current job's CCSID"
      *
     c                   eval      to_CCSID = 1252
     c                   eval      from_CCSID = 0


      *
      *  initialize iconv() API
      *
     c                   eval      ic = QtqIconvOpen(to: from)
     c                   if        ic.return_value = -1
      **       ... FIXME: handle error ...
     c                   endif


      *
      *  Convert "hello world" to Windows ASCII
      *
      *
     c                   eval      Data = 'Hello World!'
     c                   eval      p_Data = %addr(Data) + 2
     c                   eval      DataLen = %len(Data)

     c                   if        iconv(ic: p_Data: DataLen:
     c                                       p_Data: DataLen) = -1
      **       ... FIXME: handle error ...
     c                   endif

      *
      * Create hex dump to test conversion
      *
     c                   callp     HexDump( HexData
     c                                    : Data
     c                                    : %size(HexData))
     c                   dsply                   HexData


      *
      * call iconv_close() to free up resources when done
      *
     c                   callp     iconv_close(ic)
     c                   eval      *inlr = *on

As an Amazon Associate we earn from qualifying purchases.

This thread ...

Replies:

Follow On AppleNews
Return to Archive home page | Return to MIDRANGE.COM home page

This mailing list archive is Copyright 1997-2024 by midrange.com and David Gibbs as a compilation work. Use of the archive is restricted to research of a business or technical nature. Any other uses are prohibited. Full details are available on our policy page. If you have questions about this, please contact [javascript protected email address].

Operating expenses for this site are earned using the Amazon Associate program and Google Adsense.