区码和位码
在国标GB2312-80中规定,所有的国标汉字及符号在字库中的存储形式是:分配在一个94行94列的陈列中,阵列的每一行称为一个“区”,共有01区到94区;每一列称为一个“位”,共有01位到94位,阵列中的每一个汉字和符号所在的区号和位号组合在一起形成的四个阿拉伯数字就是它们的“区位码”。区位码的前两位是它的区号,后两位是它的位号。01-09区是特殊符号,10-15区未编码,16-55区是一级汉字,56-87区是二级汉字。例如,汉字“啊”的区位码是1601.
机内码
汉字的机内码是指在计算机表示一个汉字的编码。机内码与区位码稍有区别。如上所述,汉字区位码的区码和位码的取值均在 1~94 之间,如直接用区位码作为机内码,就会与基本ASCII 码混淆。为避免与ASCII码混淆,在区码和位码分别加上 20H,在此基础上再加 80H。用机内码的两个字节表示一个汉字,这两个字节分别称为高位字节和低位字节。
高位字节 = 区码+20H+80H(或区码+A0H)
低位字节 = 位码+20H+80H(或位码+A0H)
- 使用时候要把机内码变成转换为区位码就可以。
#include <stdio.h>
void main(void)
{
unsigned char high8bit,low8bit;
unsigned char *hz = "啊";
high8bit = *hz;
low8bit = *(hz+1);
printf("h = %3d,l = %3d\n",high8bit,low8bit); /*h = 176,l = 161*/
}
预先准备一个16*12的字库,命名为test,放在工程目录下,就可以根据字库来打印输出。
#include <stdio.h>
void printhz(int pos);
void main(void)
{
unsigned char high8bit,low8bit;
unsigned char *hz = "想";
int pos;
high8bit = *hz-0xA1;
low8bit = *(hz+1)-0xA1;
pos = (high8bit*94 + low8bit)*2*12;
printhz(pos);
//printf("h = %02d,l = %02d\n",high8bit,low8bit); /*h = 176,l = 161*/
}
void printhz(int pos)
{
int i,j;
FILE *fp;
unsigned char arr[24] = {0};
unsigned char kk;
if((fp=fopen("test","r"))==NULL)
{
printf("file cannot be opened\n");
return ;
}
fseek(fp,pos,0);
fread(arr,sizeof(char),24,fp);
for(i=0;i<12;i++)
{
for(j=0;j<8;j++)
{
kk = arr[2*i] << j;
if(kk & 0x80)
{
printf("*");
}
else
{
printf(" ");
}
}
for(j=0;j<8;j++)
{
kk = arr[2*i+1] << j;
if(kk & 0x80)
{
printf("*");
}
else
{
printf(" ");
}
}
printf("\n");
}
fclose(fp);
}
/****输出************
* *
* ******
***** * *
* *****
*** * *
** * *****
* * * *
* *****
* *
* * * *
* * * *
******
*******************/
网友评论