不同字符集编码下:英文和中文所占的字节数,及ASCII码表

一.不同字符集编码下:英文和中文所占的字节数

编码英文所占字节中文所占字节
UTF-813
GBK12
GB231212
ISO-8859-111
UTF-1644
UTF-16BE22
UTF-16LE22

附:GBK是在国家标准GB2312基础上扩容后兼容GB2312的标准;
UTF-16BE,其后缀是 BE 即 big-endian,大端的意思。大端就是将高位的字节放在低地址表示。
UTF-16LE,其后缀是 LE 即 little-endian,小端的意思。小端就是将高位的字节放在高地址表示。
UTF-16,没有指定后缀,即不知道其是大小端,所以其开始的两个字节表示该字节数组是大端还是小端。即FE FF表示大端,FF FE表示小端。

二.ASCII编码:

ASCII的局限在于只能显示26个基本拉丁字母、阿拉伯数字和英式标点符号,没有中文;

ASCII码表:

不可显示的控制字符:
二进制十进制十六进制缩写可以显示的表示法名称/意义
0000 0000000NUL空字符(Null)
0000 0001101SOH标题开始
0000 0010202STX本文开始
0000 0011303ETX本文结束
0000 0100404EOT传输结束
0000 0101505ENQ请求
0000 0110606ACK确认回应
0000 0111707BEL响铃
0000 1000808BS退格
0000 1001909HT水平定位符号
0000 1010100ALF换行键
0000 1011110BVT垂直定位符号
0000 1100120CFF换页键
0000 1101130DCR归位键
0000 1110140ESO取消变换(Shift out)
0000 1111150FSI启用变换(Shift in)
0001 00001610DLE跳出数据通讯
0001 00011711DC1设备控制一(XON 启用软件速度控制)
0001 00101812DC2设备控制二
0001 00111913DC3设备控制三(XOFF 停用软件速度控制)
0001 01002014DC4设备控制四
0001 01012115NAK确认失败回应
0001 01102216SYN同步用暂停
0001 01112317ETB区块传输结束
0001 10002418CAN取消
0001 10012519EM连接介质中断
0001 1010261ASUB替换
0001 1011271BESC跳出
0001 1100281CFS文件分割符
0001 1101291DGS组群分隔符
0001 1110301ERS记录分隔符
0001 1111311FUS单元分隔符
0111 11111277FDEL删除
可显示的字符:
二进制十进制十六进制图形
0010 00003220(空格)(␠)
0010 00013321!
0010 00103422"
0010 00113523#
0010 01003624$
0010 01013725%
0010 01103826&
0010 01113927
0010 10004028(
0010 10014129)
0010 1010422A*
0010 1011432B+
0010 1100442C,
0010 1101452D-
0010 1110462E.
0010 1111472F/
0011 000048300
0011 000149311
0011 001050322
0011 001151333
0011 010052344
0011 010153355
0011 011054366
0011 011155377
0011 100056388
0011 100157399
0011 1010583A:
0011 1011593B;
0011 1100603C<
0011 1101613D=
0011 1110623E>
0011 1111633F?
0100 00006440@
0100 00016541A
0100 00106642B
0100 00116743C
0100 01006844D
0100 01016945E
0100 01107046F
0100 01117147G
0100 10007248H
0100 10017349I
0100 1010744AJ
0100 1011754BK
0100 1100764CL
0100 1101774DM
0100 1110784EN
0100 1111794FO
0101 00008050P
0101 00018151Q
0101 00108252R
0101 00118353S
0101 01008454T
0101 01018555U
0101 01108656V
0101 01118757W
0101 10008858X
0101 10018959Y
0101 1010905AZ
0101 1011915B[
0101 1100925C\
0101 1101935D]
0101 1110945E^
0101 1111955F_
0110 00009660`
0110 00019761a
0110 00109862b
0110 00119963c
0110 010010064d
0110 010110165e
0110 011010266f
0110 011110367g
0110 100010468h
0110 100110569i
0110 10101066Aj
0110 10111076Bk
0110 11001086Cl
0110 11011096Dm
0110 11101106En
0110 11111116Fo
0111 000011270p
0111 000111371q
0111 001011472r
0111 001111573s
0111 010011674t
0111 010111775u
0111 011011876v
0111 011111977w
0111 100012078x
0111 100112179y
0111 10101227Az
0111 10111237B{
0111 11001247C
0111 11011257D}
0111 11101267E~
#include #include #include #include #include #include typedef struct { int weight; int parent,lchild,rchild; }HTNode,* HuffmanTree;//哈夫曼结构 typedef char **HuffmanCode;//哈夫曼编码 HuffmanTree HT; HuffmanCode HC; int *w,i=0,j=0,n=0,number=0; char *z; void HuffmanCoding(HuffmanTree &HT,HuffmanCode &HC,int *w,int n)//W存放N个字符的权值,构造哈夫曼树HT,并求出N个字符的哈夫曼编码HC { int m,i,s1,s2,start; int c,f; HuffmanTree p; char *cd; if(n<=1) return; m=2*n-1; HT=(HuffmanTree)malloc((m+1)*sizeof(HTNode)); for(p=HT+1,i=1;iweight=*w; p->parent=0; p->lchild=0; p->rchild=0; } for(;iparent=0; for(i=n+1;i<=m;++i)//建树 { j=1; p=HT; while((j<=i-1)&&(p[j].parent!=0))//未建结点个数 j++; s1=j; while(j<=i-1) { if(p[j].parent==0&&p[j].weight<p[s1].weight)//找出最小值s1 s1=j; j++; } p[s1].parent=i; j=1; p=HT; while(j<=i-1&&p[j].parent!=0)//剩余未建结点个数 j++; s2=j; while(j<=i-1) { if(p[j].parent==0&&p[j].weights2) { j=s1; s1=s2; s2=j; } HT[s1].parent=HT[s2].parent=i; HT[i].lchild=s1; HT[i].rchild=s2; HT[i].weight=HT[s1].weight+HT[s2].weight; } //从叶子到根逆向求每个字符的哈夫曼编码 HC=(HuffmanCode)malloc((n+1)*sizeof(char*)); cd=(char*)malloc(n*sizeof(char)); cd[n-1]='\0'; //编码结束符 for(i=1;i<=n;i++)//逐个字符求哈夫曼编码 { start=n-1;//编码结束位置 for(c=i,f=HT[i].parent;f!=0;c=f,f=HT[f].parent)//从叶子逆向求编码 if(HT[f].lchild==c)//左0右1编码 cd[--start]='0'; else cd[--start]='1'; HC[i]=(char*)malloc((n-start)*sizeof(char)); strcpy(HC[i],&cd[start]); //复制串 } free(cd); } void Initialization()//初使化,从终端读入字符集大小n,以及n个字符n个权值,建树,并存入文件中 { int num; int quan; cout<>num; n=num; w=(int*)malloc(n*sizeof(int));//存放权 z=(char*)malloc(n*sizeof(char));//存放字符 cout<<"请依次输入"<<n<<"个字符"<<endl; char cs[2]; for(i=0;i<n;i++)//存放字符 { cout<<"第"<<i+1<>cs; *(z+i)=*cs; } cout<<endl<<"请依次输入"<<n<<"个权值"<<endl; for(i=0;i<=n-1;i++)//存放权 { cout<<"第"<<i+1<>quan; *(w+i)=quan; } cout<<"字母表为"; for(i=0;i<=n-1;i++) { cout<<setw(3)<<*(z+i); } cout<<endl; cout<<"权值表为"; for(i=0;i<=n-1;i++) { cout<<setw(3)<<*(w+i); } HuffmanCoding(HT,HC,w,n);//建树,编码 cout<<endl<<"各字符对应的编码:"<<endl; for(i=1;i<=n;i++) { cout<<*(z+i-1)<<"............................"; cout<<HC[i]<<endl; } //存入文件htmTree中 FILE *htmTree; char rt[]={' ','\0'}; if((htmTree=fopen("htmTree.txt","w"))==NULL) { cout<<"can not open file"<<endl; return; } fputs(z,htmTree); for(i=0;i<n+1;i++) { fprintf(htmTree,"%5d",*(w+i)); fputs(rt,htmTree); } for(i=1;i<=n;i++) { fputs(HC[i],htmTree); fputs(rt,htmTree); } fclose(htmTree); } void InputMessage()//输入要编译的报文,并将其存入文件tobetran中 { FILE *tobetran; char mess[40]; if((tobetran=fopen("tobetran.txt","w"))==NULL) { cout<<"不能打开文件"<<endl; return; } cout<<"请输入想要编码"<<endl; gets(mess); fputs(mess,tobetran); fclose(tobetran); } void Coding()//读取tobetran中的报文,并编码后存入文件codefile中 { FILE *tobetran,*codefile; if((tobetran=fopen("tobetran.txt","rb"))==NULL) cout<<"不能打开文件"<<endl; if((codefile=fopen("codefile.txt","wb"))==NULL) cout<<"不能打开文件"<<endl; char *tran;//中间变量 tran=(char*)malloc(100*sizeof(char)); int i=1; while(i==1) { if(fgets(tran,100,tobetran)==NULL) { cout<<"不能打开文件"<<endl; break; }//将tobetran中读取的字符存入tran中 for(i=0;*(tran+i)!='\0';i++) { for(j=0;j<=n;j++) { if(*(z+j-1)==*(tran+i))//找到第i个字符对应在Z中的位置 fputs(HC[j],codefile);//编码并存入codefile中 } } } fclose(tobetran); fclose(codefile); free(tran); } void Decoding()//利用已建好的哈夫曼树将codefile中的代进行译,并将结果存入文件txtfile中 { FILE *codef,*txtfile; if((txtfile=fopen("Textfile.txt","w"))==NULL) cout<<"不能打开文件"<<endl; if ((codef=fopen("codefile.txt","r"))==NULL) cout<<"不能打开文件"<<endl; char w[1000],v[1000]; int j=0,i=0,m=0; fgets(w,2000,codef);//将编码存入W中 m=2*n-1; for(i=0;*(w+i-1)!='\0';i++) { if(HT[m].lchild==0&&HT[m].rchild==0) //,无孩子,是叶子结点 { *(v+j)=*(z+m-1);//找到字符 j++; m=2*n-1; i--; } else if(*(w+i)=='0') m=HT[m].lchild;//有孩子 else if(*(w+i)=='1') m=HT[m].rchild; } *(v+j+1)='\0'; fputs(v,txtfile);//将字符存入文件夹中 fclose(txtfile); fclose(codef); } void Pcode()//将codefile以紧凑可式显式在终端上,每行50个代,结果存入 CodePrin中 { FILE * CodePrin,* codefile; if((CodePrin=fopen("CodePrin.txt","w"))==NULL) { cout<<"不能打开文件"<<endl; return; } if((codefile=fopen("codefile.txt","r"))==NULL) { cout<<"不能打开文件"<<endl; return; } char *q; //char *y='\r'; q=(char*)malloc(51*sizeof(char));//存50个字符 do {//将codefile中的每50个字符存入q中 if(fgets(q,51,codefile)==NULL) { cout<<"不能读取文件"<<endl; break; } fputs(q,CodePrin); //fputs(y,CodePrin); puts(q); }while(strlen(q)==50); free(q); fclose(CodePrin); fclose(codefile); } void Print(HuffmanTree p,HuffmanTree HT)//打印哈夫曼树,并将其存入TreePrint中 { if(p!=HT) { FILE * TreePrint; if((TreePrint=fopen("TreePrint.txt","a"))==NULL) { cout<<"创建文件失败"<rchild,HT); cout<<setw(6*number)<weight<weight); Print(HT+p->lchild,HT); number--; fclose(TreePrint); } } void main() { char a; while(a!='Q') { cout<<"请选择要执行的命令:"<<endl; cout<<"I 初使化,建立哈夫曼树; S 输入翻译的报文; E 对报文编码;"<<endl<<" D 对编码进行译; P 打印代文件; T 打印哈夫曼树; Q 退出"<>a; switch(a) { case'I': Initialization();//初使化,建立哈夫曼树 break; case'S': InputMessage();//输入要翻译的报文 break; case'E': Coding();//读取报文并编码 break; case'D': Decoding();//将代进行译 break; case'P': cout<<"打印编码"<<endl; Pcode(); break; case'T': cout<<"打印哈夫曼树"<<endl; Print(HT+2*n-1,HT);//打印哈夫曼树 cout<<"原文,编码结果可在文件中查找。"; break; } } free(z); free(w); free(HT); }
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值