亚洲av成人无遮挡网站在线观看,少妇性bbb搡bbb爽爽爽,亚洲av日韩精品久久久久久,兔费看少妇性l交大片免费,无码少妇一区二区三区

  免費注冊 查看新帖 |

Chinaunix

  平臺 論壇 博客 文庫
最近訪問板塊 發(fā)新帖
查看: 2990 | 回復(fù): 0
打印 上一主題 下一主題

EBCDIC和GBK/GBK2312的轉(zhuǎn)換AS/400中的實現(xiàn) [復(fù)制鏈接]

論壇徽章:
0
跳轉(zhuǎn)到指定樓層
1 [收藏(0)] [報告]
發(fā)表于 2011-03-31 16:42 |只看該作者 |倒序瀏覽
AS/400采用EBCDIC編碼保存在QSYS.LIB中的所有中文字符,而在pc端winows 95,
windows NT采用GBK內(nèi)碼保 存中文字符,兩者之間在進(jìn)行中文數(shù)據(jù)傳輸?shù)臅r候,會遇到EBCDIC和GBK的相互轉(zhuǎn)換。所以,掌握EBCDIC和GBK 的轉(zhuǎn)換碼表對于程序員非常重要。

1 收集GBK字符文件
首先必須根據(jù)GBK的編碼原則得到GBK的漢字庫。GBK的編碼區(qū)間為0X8140到0XFEFE。整個碼表分為 5個區(qū)間,稱為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包括擴(kuò)充漢字符號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進(jìn)制代碼,0X0D 0X0A是換行符號的16進(jìn)制代碼,在每一個字符的兩旁增加雙引號和緩行符號是為了滿足CPYFRMIMPF對Import file的格式要求而特別增加的。
(2).結(jié)果文件假設(shè)命名為GBK.TXT,文件樣本見附件。

程序2:得到?jīng)]有" "和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);
}
[注]:
假設(shè)結(jié)果文件命名為GBK_01.TXT

2.利用FTP把GBK.TXT上傳到AS400的IFS的目錄下,例如/home目錄,注意ftp在傳輸雙字節(jié)的時候需要制定AS400端CCSID的值。如果只傳輸GB2312漢字,指定CCSID=1381;如果傳輸GBK漢字,指定CCSID=1386.
[注]:
如果傳輸正確,使用DSPF或EDTF可以看到正確的中文字符。

3.利用STRSQL交互式SQL生成接受GBK漢字的數(shù)據(jù)庫文件
      CREATE TABLE GBK(COL CHAR(4) CCSID 138

4.利用CPYFRMIMPF把流文件數(shù)據(jù)導(dǎo)入GBK數(shù)據(jù)庫文件
     CPYFRMIMPF FROMSTMF('/home/gbk.txt')
               TOFILE(GBK/QGPL)
               RCDDLM(*LF)

5. 利用FTP的BIN方式,把GBK的文件下傳到PC的得到GBK.MBR,從PC端用NOTEPAD觀察可以看到文件有許多亂碼,這是因為GBK.MBR 使用的是EBCDIC,許多編碼在PC上無法識別,而且可以發(fā)現(xiàn)每個漢字EBCDIC代碼的兩旁有0E..0F的標(biāo)識符,這樣觀察起來很不方便,使用下面的程序把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);
}
[注]:
假設(shè)得到的沒有0E..0F標(biāo)識的文件名稱為GBK_01.MBR

6.利用GBK_O1.TXT,GBK_01.MBR得到EBCDIC< >GBK的轉(zhuǎn)換碼表文件
程序: 得到最終轉(zhuǎn)換文件
#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);
}

[注]:
假設(shè)最終得到的轉(zhuǎn)換文件為GBK_CVT.TXT
您需要登錄后才可以回帖 登錄 | 注冊

本版積分規(guī)則 發(fā)表回復(fù)

  

北京盛拓優(yōu)訊信息技術(shù)有限公司. 版權(quán)所有 京ICP備16024965號-6 北京市公安局海淀分局網(wǎng)監(jiān)中心備案編號:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年舉報專區(qū)
中國互聯(lián)網(wǎng)協(xié)會會員  聯(lián)系我們:huangweiwei@itpub.net
感謝所有關(guān)心和支持過ChinaUnix的朋友們 轉(zhuǎn)載本站內(nèi)容請注明原作者名及出處

清除 Cookies - ChinaUnix - Archiver - WAP - TOP