Chinaunix首页 | 论坛 | 博客
  • 博客访问: 1177048
  • 博文数量: 573
  • 博客积分: 0
  • 博客等级: 民兵
  • 技术积分: 66
  • 用 户 组: 普通用户
  • 注册时间: 2016-06-28 16:21
文章分类

全部博文(573)

文章存档

2018年(3)

2016年(48)

2015年(522)

分类: C/C++

2015-12-02 16:34:19


点击(此处)折叠或打开

  1. #include <string.h>
  2. #include <stdio.h>
  3. #include <stdlib.h>

  4. char * myTrim(char * str) /*去掉字符串首尾*/
  5. {
  6.     if(NULL == str)
  7.     {
  8.         return NULL;
  9.     }
  10.     char * head = str;
  11.     char * tail = str + strlen(str) -1;
  12.     while((*head == ' ')&&(head < tail))head++;
  13.     while((*tail == ' ')&&(tail > head))tail--;
  14.     *(tail + 1) = '\0';
  15.     memcpy(str, head, sizeof(char) * (tail - head + 2));
  16.     return str;
  17. }

  18. int main(int argc, char ** agrgv)
  19. {
  20.     char hanzi[3];
  21.     int quma=0x80;
  22.     int weima=0x7c;
  23.     char chquma;
  24.     char chweima = weima;
  25.     int i = 0;

  26.     printf("位码为0x7c(字符'|')的汉字有:\n");
  27.     for(i = 0; i < 128; i++)
  28.     {
  29.         quma = quma + i;
  30.         chquma = quma;
  31.         quma = 0x80;
  32.         memset(hanzi, 0, sizeof(hanzi));
  33.         memcpy(hanzi, &chquma, sizeof(char));
  34.         memcpy(hanzi + sizeof(char), &chweima, sizeof(char));
  35.     /*    myTrim(hanzi);*/
  36.         if((i%8) == 0)
  37.         {
  38.             printf("\n");
  39.         }
  40.         printf(" [%s]", hanzi);
  41.         fflush(stdout);
  42.     }
  43.     printf("\n");
  44.     return 0;
  45. }

  46. /*
  47. 计算机中信息的编码
  48. 在计算机中,各种信息都是以二进制编码的形式存在的;也就是说,不管是文字、图形、声音、动画,还是电影等各种信息,在计算机中都是以0和1组成的二进制代码表示的;计算机之所以能区别这些信息的不同,是因为它们采用的编码规则不同。比如:同样是文字,英文字母与汉字的编码规则就不同,英文字母用的是单字节的ASCII码,汉字采用的是双字节的汉字内码;但随着需求的变化,这两种编码有被统一的UNICODE码(由Unicode 协会开发的能表示几乎世界上所有书写语言的字符编码标准)所取代的趋势;当然图形、声音等的编码就更复杂多样了。这也就告诉我们,信息在计算机中的二进制编码是一个不断发展的、高深的、跨学科的知识领域。
  49. 1、字符(英文,包括字母、数字、标点、运算符等)编码
  50. 字符的编码采用国际通用的ASCII码(American Standard Code for Information Interchange,美国信息交换标准代码),每个ASCII码以1个字节(Byte)储存,从0到数字127代表不同的常用符号,例如大写A的ASCII码是65,小写a则是97。由于ASCII码只用了字节的七个位,最高位并不使用,所以后来又将最高的一个位也编入这套编码码中,成为八个位的延伸ASCII(ExtendedASCII)码,这套内码加上了许多外文和表格等特殊符号,成为目前常用的编码。基本的ASCII字符集共有128个字符,其中有96个可打印字符,包括常用的字母、数字、标点符号等,另外还有32个控制字符。标准ASCII码使用7个二进位对字符进行编码,对应的ISO标准为ISO646标准。下表展示了基本ASCII字符集及其编码:
  51. 字母和数字的ASCII码的记忆是非常简单的。我们只要记住了一个字母或数字的ASCII码(例如记住A为65,0的ASCII码为48),知道相应的大小写字母之间差32,就可以推算出其余字母、数字的ASCII码。
  52. 虽然标准ASCII码是7位编码,但由于计算机基本处理单位为字节(1byte = 8bit),所以一般仍以一个字节来存放一个ASCII字符。每一个字节中多余出来的一位(最高位)在计算机内部通常保持为0(在数据传输时可用作奇偶校验位)。由于标准ASCII字符集字符数目有限,在实际应用中往往无法满足要求。为此,国际标准化组织又制定了ISO2022标准,它规定了在保持与ISO646兼容的前提下将ASCII字符集扩充为8位代码的统一方法。ISO陆续制定了一批适用于不同地区的扩充ASCII字符集,每种扩充ASCII字符集分别可以扩充128个字符,这些扩充字符的编码均为高位为1的8位代码(即十进制数128~255),称为扩展ASCII码。下表展示的是最流行的一套扩展ASCII字符集和编码:
  53. 2、汉字的编码
  54. (1)汉字内码
  55. 汉字信息在计算机内部也是以二进制方式存放。由于汉字数量多,用一个字节的128种状态不能全部表示出来,
  56. 因此在1980年我国颁布的《信息交换用汉字编码字符集——基本集》,
  57. 即国家标准GB2312-80方案中规定用两个字节的十六位二进制表示一个汉字,每个字节都只使用低7位(与ASCII码相同),
  58. 注意:拓展了的ASCII码有256种,但是中国文字不需要后面的128种,只需要前面的128个字符,所以只取前面的128个字符。

  59. 即有128×128=16384种状态。由于ASCII码的34个控制代码在汉字系统中也要使用,为不致发生冲突,不能作为汉字编码,
  60. 128除去34只剩94种,所以汉字编码表的大小是94×94=8836,用以表示国标码规定的7445个汉字和图形符号。
  61. 每个汉字或图形符号分别用两位的十进制区码(行码)和两位的十进制位码(列码)表示,不足的地方补0,组合起来就是区位码。
  62. 把区位码按一定的规则转换成的二进制代码叫做信息交换码(简称国标码)。

  63. 国标码共有汉字6763个
  64. (一级汉字,是最常用的汉字,按汉语拼音字母顺序排列,共3755个;
  65. 二级汉字,属于次常用汉字,按偏旁部首的笔划顺序排列,共3008个),数字、字母、符号等682个,共7445个。


  66. 下面是重点
  67. :::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::
  68. 由于国标码不能直接存储在计算机内,为方便计算机内部处理和存储汉字,
  69. 又区别于ASCII码,将国标码中的每2个字节在最高位改设为1,
  70. 所以,使用国标码时,一旦最高位是1,即单个字符大于128,0x80,计算机就认为这是区码,
  71. 即计算机在显示时,就会认为接下来的2个字符表示一个汉字。
  72. 也就是说,汉字的区码一定大于0x80,位码一定小于0x80。

  73. 基本ASCII码,只有0~127,共128个字符
  74. 拓展ASCII码,有10~255,共256个字符
  75. 汉字不需要后面的128~255。
  76. 也就是说,GB2312-80方案规定:表示汉字的2个字节,都只使用了基本ASCII码,
  77. 同时也规定汉字的区码的最高位是1.
  78. :::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::

  79. 这样就形成了在计算机内部用来进行汉字的存储、运算的编码叫机内码(或汉字内码,或内码)。
  80. 内码既与国标码有简单的对应关系,易于转换,又与ASCII码有明显的区别,且有统一的标准(内码是惟一的)。

  81. (2)汉字外码
  82. 无论是区位码或国标码都不利于输入汉字,为方便汉字的输入而制定的汉字编码,称为汉字输入码。汉字输入码属于外码。不同的输入方法,形成了不同的汉字外码。常见的输入法有以下几类:
  83. 按汉字的排列顺序形成的编码(流水码):如区位码;
  84. 按汉字的读音形成的编码(音码):如全拼、简拼、双拼等;
  85. 按汉字的字形形成的编码(形码):如五笔字型、郑码等;
  86. 按汉字的音、形结合形成的编码(音形码):如自然码、智能ABC。
  87. 输入码在计算机中必须转换成机内码,才能进行存储和处理。

  88. (3)汉字字形码
  89. 为了将汉字在显示器或打印机上输出,把汉字按图形符号设计成点阵图,就得到了相应的点阵代码(字形码)。
  90. 全部汉字字码的集合叫汉字字库。汉字库可分为软字库和硬字库。软字库以文件的形式存放在硬盘上,现多用这种方式,硬字库则将字库固化在一个单独的存储芯片中,再和其它必要的器件组成接口卡,插接在计算机上,通常称为汉卡。
  91. 用于显示的字库叫显示字库。显示一个汉字一般采用16×16点阵或24×24点阵或48×48点阵。已知汉字点阵的大小,可以计算出存储一个汉字所需占用的字节空间。例:用16×16点阵表示一个汉字,就是将每个汉字用16行,每行16个点表示,一个点需要1位二进制代码,16个点需用16位二进制代码(即2个字节),共16行,所以需要16行×2字节/=32字节,即16×16点阵表示一个汉字,字形码需用32字节。
  92.  即:字节数=点阵行数×点阵列数/8
  93. 用于打印的字库叫打印字库,其中的汉字比显示字库多,而且工作时也不像显示字库需调入内存。
  94. 可以这样理解,为在计算机内表示汉字而统一的编码方式形成汉字编码叫内码(如国标码),内码是惟一的。为方便汉字输入而形成的汉字编码为输入码,属于汉字的外码,输入码因编码方式不同而不同,是多种多样的。为显示和打印输出汉字而形成的汉字编码为字形码,计算机通过汉字内码在字模库中找出汉字的字形码,实现其转换。
  95. */
实例文件:

点击(此处)折叠或打开

  1. #include <string.h>
  2. #include <stdio.h>
  3. #include <stdlib.h>
  4. #include <stdarg.h>

  5. int main(int argc, char ** argv)
  6. {
  7.     unsigned char buf[1024];
  8.     unsigned char *p;
  9.     int i,k,j;
  10.     FILE *fp;

  11.     memset(buf, 0, sizeof(buf));
  12.     strcpy(buf, "弢");
  13.     
  14.      fp=fopen("/home/eas/src/API_fun/hanzi.log","a");
  15.      if(fp==NULL) return;

  16.     p=(unsigned char *)buf;
  17.     fprintf(fp,"\n---------------------------\n");
  18.     fprintf(fp,"%02x ",p[0]&0x000000FF);
  19.     fprintf(fp,"%02x ",p[1]&0x000000FF);
  20.     fprintf(fp,"\n---------------------------\n");
  21.     fprintf(fp,"%0x ",p[0]);
  22.     fprintf(fp,"%0x ",p[1]);
  23.     fprintf(fp,"\n============= begin:[][]===============len[]\n");
  24.     for(i=0,k=0;i<strlen(buf);i++)
  25.     {
  26.         if(i==0) fprintf(fp,"%06d> ",i);
  27.         if( (i % 16) == 0 && i != 0)
  28.         {
  29.             fprintf(fp,"> ");
  30.             for(j=0;j<16;j++)
  31.             {
  32.                 if( (p[16*k+j] == '\0' ) ||(p[16*k+j] == '\n') ||
  33.                     (p[16*k+j] < ' ') )
  34.                     fprintf(fp,".");
  35.                 else
  36.                     fprintf(fp,"%c",p[16*k+j]);
  37.             }
  38.             fprintf(fp,"\n");
  39.             fprintf(fp,"%06d> ",i);
  40.             k++;
  41.         }
  42.         fprintf(fp,"%02x ",p[i]);
  43.     }
  44.     return 0;
  45. }

阅读(1882) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~