1.首先认识一下GBK和GB2312
gbk是gb2312的超集,gbk不光包括简体字还包括繁体字等一些其他字体。
2.GB2312和区位码
GB2312和GBK才有区位码之说,其他编码方式比如utf-8就没有这种说法
3.区位码
GB2312收集了7445个字符组成94*94的方阵,每一行称为一个“区”,编号为01-94,每一列称为一个“位”,编号为01-94,这种用来表示每个字符所处位置的图称为“区位图”,用字符所在区位图中的位置来表示字符的代码称为“区位码”。比如“啊”的区位码为1601。
4.国标码
对这些编号进行编码的结果就得到“国家标准代码”,简称为“国标码”,也称“汉字交换码”
国标码由两个字节组成,其高字节和低字节的最高位都为0,与7位标准ASCII码类似。
编码方法是现将十进制表示的区码和位码转换为十六进制表示的区码和位码,再讲这个代码的高字节(第一个字节)和低字节(第二个字节)分别加上20H(100000B),就得到国标码。每个字节加20H的原因是为了避开ASCII码表的32个控制字符。
内码
为了解决ASCII码和国标码在同事使用时产生的二义性,讲国标码的高字节和低字节的最高位b7都变成1,或者说每个字节都加上0x80,这样得到的代码被称为机内码,常被简写成“内码”
文字存储方式
任何数据在计算机最终存储形式都是0011这种二进制字符串当然进一步包装转换就是8进制16进制,所以不管什么编码他的实际存储形式就是字节比特,那计算机在读取过程就是按一个字节一个字节读取,所以当同时使用ASCII码和GB2312就要有所区分,前者是1个字节编码后者是两个字节,那么你现在读到的这个字节是属于ASCII码还是GB2312就要根据标识判断一下,如果是属于GB2312那就再读取下一个字节再用GB2312的编码方法翻译反之就用ASCII
代码
#include<stdio.h>
#include<malloc.h>
const char* hex_code = "0123456789ABCDEF";
//区位码转换成国标码+20H相当于十进制32
const int toStandard = 32;
//国标码转换成内码+80H相当于十进制128
const int toInner = 128;
//十进制转16进制
//这个函数写法只能转换256-0xFF
char* toHex(int num){
char* hex;
//获得两个单元的字符数组
hex = (char*)malloc(sizeof(char)*2);
//获得前4位的16进制字符
hex[0] = (char)(hex_code[num/16]);
//获得后4位的16进制字符
hex[1] = (char)(hex_code[num%16]);
printf("%d\n",num);
printf("%c,%c\n",hex[0],hex[1]);
return hex;
}
char getInnerCode(int area_code,int pos_code){
char innerCode;
char* head = toHex(area_code);
char* tail = toHex(pos_code);
//这个想获得一个前4位16进制字符和后4位16进制字符的合并的表现形式
//此写法不通也没必要合并
//innerCode = ((head&0xFF)<<8)|((tail&0xFF));
return innerCode;
}
int main(){
int area_code = 16;
int pos_code = 1;
area_code = area_code+toStandard+toInner;
pos_code = pos_code+toStandard+toInner;
char innerCode = getInnerCode(area_code,pos_code);
printf("%c\n",innerCode);
return 0;
}