ITEM: E8778L

Character translation from EBCDIC to ASCII


Question:

Communication is between a Mainframe (TSO) to a RS/6000, Model 370 
running on AIX 3.2.4. I want to know how to do character translation
from EBCDIC to ASCII. I want to do everything except Packed Decimal.
I am receiving the data over LU6.2 (SNA) and want to convert it using
C subroutine calls.

Response:

Customer was confused about use of obsolete NLXIN that has been replaced
by iconv routines.  He also wanted to know how to change the EBCDIC/ASCII
conversion tables for use by these conversion routines and I will answer
this question first.

To make your own EBCDIC-ASCII conversion tables, modify ones included 
with AIX.
-----------------------------
  1.  mkdir $HOME/iconvTable
      mkdir $HOME/iconvTable/mine
      cd $HOME/iconvTable/mine
      cp -p $LOCPATH/IBM-037_IBM-850_src ./037850.x
      cp -p $LOCPATH/IBM-850_IBM-037_src ./850037.x
  2.  Edit these source files as appropriate, for example:
       When I tn3270 to VM I observe that the conversions for AIX 
       give some strange conversions for the characters \^ [ ] since some
       versions of telnet or ftp or mail manage to send non-037 codes 
       for the ebcdic.  The following table shows what is happening.

                                  tn3270   ftp,mail
                                  sends    send
                         IBM-850  IBM-037  "whatever"  
                 symbol  ascii    ebcdic   ebcdic
                 ------  -------  -------  --------
                      \^     5E       B0        5F (Logical Not)
                      [     5B       BA        AD (y acute capital)
                      ]     5D       BB        BD (umlaut accent)

       If I want these characters (however they are sent) to be displayed
       correctly, the following will accomplish that objective. In the 
       IBM-037_IBM-850_src file:

           replace this       with this
           ------------       -----------
           0x5F   0xAA        0x5F   0x5E
           0xAD   0xED        0xAD   0x5B       
           0xBD   0xF9        0xBD   0x5D

        This means, of course, that AA(Logical Not), ED(y acute capital),
        and F9(umlaut accent) cannot now be translated correctly by any
        program using this conversion table (tn3270, tn -e3270).
  3.  Having changed the source files to your liking, you must generate 
      new conversion tables by:

        genxlt \< 037850.x > ../IBM-037_IBM-850
        genxlt \< 850037.x > ../IBM-850_IBM-037 (not needed, this example)

  4.  In the window that you will use this new conversion, make a change 
      in environment by:

        export LOCPATH=$HOME   ( normally this is /usr/lib/nls/loc )

  5.  Now run the application that is to use the new conversion in the
      window with the new LOCPATH.

Below I have included an example EBCDIC/ASCII conversion program:
-----------------------------------------------------------------
/* ebcasc.c                                              */
/* IBM-037 for EBCDIC (U.S.English)                      */
/* IBM-850 for En_US                                     */
/* ISO8859-1 for en_US                                   */
/* Execute by:                                           */
/*   cc -liconv -o ebcasc ebcasc.c                       */
/*   ebcasc                                              */
/*                                                       */
/* This is a very simple routine that demonstrates how   */
/* to use the EBCDIC/ASCII conversion subroutines.       */
/*                                                       */
/* You will need to read more about iconv routines in    */
/* InfoExplorer or you may choose to use ConsultLine to  */
/* modify this sample program to use your way of reading */
/* data and make this routine safe enough to be trusted. */
/* This program is only intended to illustrate the use   */
/* of the iconv subroutine calls.                        */

\#include \
\#include \
main(int argc, char *argv[])
{  iconv_t cd;
  char inBuf[1024]={'a','b','c','d'}, outBuf[1024]={'A', 'B', 'C', 'D'};
  char *i, *o, *ip, *op;
  size_t iLeft, oLeft;
  size_t ii;
  cd = iconv_open("IBM-037", "IBM-850");
  if (cd == -1) exit(0);
  strcpy(inBuf, ".\<(+!");
  iLeft = 5;
  oLeft = 5;
  ip = inBuf;
  op = outBuf;
  ii = iconv(cd, &ip, &iLeft, &op, &oLeft);
printf("IBM-037 vs IBM-850\\n");
printf("  %s vs   %s\\n", inBuf, outBuf);
  iconv_close(cd);

HR
CENTER
FONT size=2Support Line: Character translation from EBCDIC to ASCII ITEM: E8778L
BRDated: November 1993 Category: N/A
BRThis HTML file was generated 99/06/24~13:30:53
BRComments or suggestions?
A href="../../../../feedback.htm"BContact us/B/ABR
/FONT
/CENTER
/BODY
/HTML