`
fireflyjava
  • 浏览: 187329 次
  • 性别: Icon_minigender_1
  • 来自: 深圳
社区版块
存档分类
最新评论

EBCDIC和GBK/GBK2312的转换 AS/400中的实现

阅读更多

AS/400采用EBCDIC编码保存在QSYS.LIB中的所有中文字符,而在pc端winows 95,
windows NT采用GBK内码保 存中文字符,两者之间在进行中文数据传输的时候,会遇到EBCDIC和GBK的相互转换。所以,掌握EBCDIC和GBK 的转换码表对于程序员非常重要。

1 收集GBK字符文件
首先必须根据GBK的编码原则得到GBK的汉字库。GBK的编码区间为0X8140到0XFEFE。整个码表分为5个区间,称为GBK1(A1A1 A9FE)、GBK2(B0A1 F7EE)、GBK3(8140 A0FE)、GBK4(AA40 FEA0)、GBK5(A840 A9A0).其中GBK1包括符号717个,GBK2包括GB2312汉字6763个,GBK3包括GB13000.1中的汉字6080个,GBK4包括增补的汉字8160个,GBK5包括扩充汉字符号166个。
程序1:
/* file1.c */
#include<stdio.h>
void main(void)
{
FILE *fp;
 char ch[4],file[10],enter[2],hi,lo;
long int i;

enter[0]=0x0d;
enter[1]=0x0a;

printf("please input the file name:\n");
scanf("%s",file);
if((fp=fopen(file,"wb"))==NULL)
{
      printf("cannot open %s\n",file);
      exit(0);
}

hi=0xa7;
lo=0x40;

for(i=0;i<2*191;i++)
{
     ch[0]=0x22;
     if(i%191==0)
          hi=hi+1;
     ch[1]=hi;
     ch[2]=(lo+i%191);
     ch[3]=0x22;
     fwrite(ch,sizeof(char),4,fp);
     fwrite(enter,sizeof(char),2,fp);
}

}
程序说明:
(1).OX22是'"'(双引号)的16进制代码,0X0D 0X0A是换行符号的16进制代码,在每一个字符的两旁增加双引号和缓行符号是为了满足CPYFRMIMPF对Import file的格式要求而特别增加的。
(2).结果文件假设命名为GBK.TXT,文件样本见附件。

程序2:得到没有" "和0X0D 0X0A的汉字字库文件
#include<stdio.h>
void main(void)
{
FILE *fp;
 char ch[2],file[10],hi,lo;
long int i;

printf("please input the file name:\n");
scanf("%s",file);
if((fp=fopen(file,"wb"))==NULL)
{
      printf("cannot open %s\n",file);
      exit(0);
}

hi=0x80;
lo=0x40;

for(i=0;i<126*191;i++)
{
       if(i%191==0)
             hi=hi+1;
       ch[0]=hi;
       ch[1]=(lo+i%191);
       fwrite(ch,sizeof(char),2,fp);
}
fclose(fp);
}
[注]:
假设结果文件命名为GBK_01.TXT

2.利用FTP把GBK.TXT上传到AS400的IFS的目录下,例如/home目录,注意ftp在传输双字节的时候需要制定AS400端CCSID的值。如果只传输GB2312汉字,指定CCSID=1381;如果传输GBK汉字,指定CCSID=1386.
[注]:
如果传输正确,使用DSPF或EDTF可以看到正确的中文字符。

3.利用STRSQL交互式SQL生成接受GBK汉字的数据库文件
      CREATE TABLE GBK(COL CHAR(4) CCSID 1388)

4.利用CPYFRMIMPF把流文件数据导入GBK数据库文件
     CPYFRMIMPF FROMSTMF('/home/gbk.txt')
               TOFILE(GBK/QGPL)
               RCDDLM(*LF)

5. 利用FTP的BIN方式,把GBK的文件下传到PC的得到GBK.MBR,从PC端用NOTEPAD观察可以看到文件有许多乱码,这是因为GBK.MBR使用的是EBCDIC,许多编码在PC上无法识别,而且可以发现每个汉字EBCDIC代码的两旁有0E..0F的标识符,这样观察起来很不方便,使用下面的程序把0E..0F剔除。
程序3: 剔除.mbr中的0E..0F字符
#include<stdio.h>
void main(void)
{
     FILE *fp1,*fp2;
     char f1[10],f2[10],ch[4];

     scanf("%s",f1);
     scanf("%s",f2);
     if((fp1=fopen(f1,"rb"))==NULL)
     {
            printf("error open input file %s\n",f1);
            exit(0);
     }
     if((fp2=fopen(f2,"wb"))==NULL)
     {
            printf("error open output file %s\n",f2);
            exit(0);
     }


     while(!feof(fp1))
     {
            fread(ch,4,1,fp1);
            if((ch[0]==0x0E)&&(ch[3]==0x0F))
            {
                   fwrite(&ch[1],1,1,fp2);
                   fwrite(&ch[2],1,1,fp2);
            }
     }

     fclose(fp1);
     fclose(fp2);
}
[注]:
假设得到的没有0E..0F标识的文件名称为GBK_01.MBR

6.利用GBK_O1.TXT,GBK_01.MBR得到EBCDIC< >GBK的转换码表文件
程序: 得到最终转换文件
#include<stdio.h>
void main(void)
{
      int i;
      FILE *in,*out,*gb;
      unsigned char ch[2],ch2[2];
      char str[40],str2[40];
      char enter[2],space=' ';

      enter[0]=0x0d;
      enter[1]=0x0a;

      if((in=fopen("gbk_01.mbr","rb"))==NULL)
      {
            printf("cannot open file\n");
            exit(0);
      }
      if((out=fopen("gbk_cvt.txt","wb"))==NULL)
      {
            printf("cannot open outfile\n");
            exit(0);
      }
      if((gb=fopen("gbk_01.txt","rb"))==NULL)
      {
            printf("cannot open hzgb.txt\n");
            exit(0);
      }


      while(!feof(in))
      {
             fread(ch,2,1,in);
             fread(ch2,2,1,gb);

             sprintf(str,"%02x%02x",ch[0],ch[1]);
             sprintf(str2,"%02x%02x",ch2[0],ch2[1]);

             fwrite(ch2,2,1,out);
             fwrite(&space,1,1,out);
             fwrite(str,5,1,out);
             fwrite(str2,5,1,out);
             fwrite(enter,2,1,out);
      }

      fclose(in);
      fclose(out);
      fclose(gb);
}

[注]:
假设最终得到的转换文件为GBK_CVT.TXT
 

 
 原文地址 http://www.900.ibm.com/cn/support/viewdoc/detail?DocId=2222001000000 

分享到:
评论

相关推荐

    EbcdicGbkConverter_ebcdic_ebcdic查看工具_源码

    ebidic转码,提供了java的测试程序,仅供参考,本人挪用

    ssis中实现ebcdic 到 ascii的转换控件

    描述中提到的“控件的使用方法详细在用法说明中”,可能是指这样的第三方工具,用户只需按照说明配置,即可轻松实现转换。 3. SSIS的Derived Column Transformation: 虽然Derived Column Transformation本身不...

    Ebcdic和ASCII字符对照表

    在实际应用中,经常需要在EBCDIC和ASCII之间进行转换。IBM和其他软件供应商提供了多种工具和库来实现这种转换,确保不同编码系统之间的数据可以无缝交互。例如,IBM的CONVERT函数可以在z/OS环境中用于EBCDIC到ASCII...

    ssis中ebcdic 到ascii码的转换控件

    本篇将详细讲解如何在SSIS中实现EBDIC到ASCII的转换,并介绍相关的控件和使用方法。 EBDIC(Extended Binary Coded Decimal Interchange Code)是一种IBM大型机和小型机系统中广泛使用的字符编码方式,而ASCII...

    Ebcdic和ASCII字符对照表.zip

    在实际应用中,如果你需要在支持ASCII编码的系统和使用EBCDIC编码的系统之间交换数据,就需要理解和使用这样的对照表。例如,如果你在处理来自IBM大型机的数据,这些数据可能是EBCDIC编码的,而你的现代计算机系统...

    ebcdic.rar_conversion_ebcdic

    标题中的"ebcdic.rar_conversion_ebcdic"表明这是一个关于EBCDIC编码转换的压缩包文件,其中可能包含了实现EBCDIC(Extended Binary Coded Decimal Interchange Code)与ASCII(美国标准信息交换代码)之间相互转换...

    Ebcdic-ascii 对照表.

    Ebcdic-ascii 对照表. UTF-EBCDIC is a character encoding used to represent Unicode characters. It is meant to be EBCDIC-friendly, so that legacy EBCDIC applications on mainframes may process the ...

    ebcdic转ascii

    ebcdic编码与ascii编码互转,仅供参考,如果用于报文编码转换,需进行字段拆解转码,否则会造成报文长度错误

    EBCDIC码与ASCII码转换处理源代码

    IBM MainFrame(AS400,S/390)与UNIX/Windows之间的编码转换

    ASCII EBCDIC 编码表

    ASCII(American Standard Code for Information Interchange,美国信息交换标准代码)和EBCDIC(Extended Binary Coded Decimal Interchange Code,扩展二进制码十进制交换码)是两种早期广泛使用的字符编码系统,...

    EBC和ASCII码转换

    总的来说,EBCDIC和ASCII码转换是IT行业中跨平台数据交换时的一个重要环节,尤其是在与IBM大型机系统交互时。理解和掌握这两种编码系统以及它们之间的转换方法,对于系统集成、数据迁移和软件开发具有重要意义。

    conv_gbk_ibm1388:GBKIBM1388字符集转换

    GBK / IBM1388字符集转换GBK是PC上使用的主要简体中文字符集,而IBM1388在大型机上。 这两个字符集不能通过像Unicode在UTF-8和UTF-16之间所做的操作来直接互换。 它们基于具有不同汉字顺序的不同编码(ASCII / ...

    EBCDIC编码表

    EBCDIC编码,ASCII码与EBCDIC编码进行转换的编码表

    AS400异步接收程序

    AS/400异步短连接接收工具。自带EBCDIC编码转换。使用共享内存作为LR与工具间通信方法。 上传原因:近期有一个神马的性能测试人员离职。这些代码原本是几年前神马一个性能测试团队中其他人编写的工具。项目结束后他...

    iseries as400 ccsid map

    在IT领域,特别是涉及到IBM iSeries(也称为AS/400)的系统中,`CCSID`(Coded Character Set Identifier)是一个至关重要的概念,它定义了字符集的编码方式,用于处理不同语言和地区的文本数据。CCSID是IBM主机系统...

    db2连接驱动

    解决无法将 Unicode 字符串转换为 Ebcdic 字符串的问题

    ANSi2EBCDiC:Python脚本,用于生成将ANSI art转换为EBCDICTN3270 art所需的HLASMJCL!

    ANSi转换为EBCDiC 从: 到: (来源: : ) 这个python脚本比将ANSi艺术转换为EBCDiC的功能要多,但是名称很吸引人。 该脚本将采用您可以找到/创建的任何ANSi艺术作品并将其转换为在TN3270中显示该艺术作品所...

Global site tag (gtag.js) - Google Analytics