📄 gb18030.c
字号:
/**************************************************************************************************************
在中国,中文信息编码由政府负责制定并监督实施。这是为了保证对于所有的系统中文的编码都是一致的,能够互相进行操作。
从计算机的应用开始,我国已经颁布了多种中文信息编码标准,常用的是GB2312-1980,GB12345,GB13000(GBK),以及最新
标准GB18030。值得一提的是,最新的GB18030标准将要作为强制标准实行,所有不支持GB18030标准的软件将不能作为产品出售。
从GB2312-1980编码开始,汉字都是采用双字节编码。为了与系统中基本的ASCII字符集区分开,所有汉字编码的每个字节的第一位都是1。
例如:“啊”字的编码为0xB0A1。GB2312的汉字编码规则为:第一个字节的值在0xB0到0xF7之间,第二个字节的值在0xA0到0xFE之间。
GB12345和GB13000是对GB2312-1980的扩充,所有已经包含在GB2312中的汉字编码不变,另外增加更多的码位。其编码规则大致为:
第一个字节的值在0x81到0xFE之间,第二个字节的值在0x40到0xFE之间。由于GB13000是对GB2312的扩展,所以也被成为GBK。
GB18030也是对GB2312的扩展,其编码长度由2个字节变为1~4个字节。其中包括: * 单字节,其值从0到0x7F
* 双字节,第一个字节的值从0x81到0xFE,第二个字节的值从0x40到0xFE(不包括0x7F)
* 四字节,第一个字节的值从0x81到0xFE,第二个字节的值从0x30到0x39,第三个字节的值从0x81到0xFE,第四个字节的值从0x30到0x39。
可以看出,GB18030的容量非常大,共有码位160万左右。另外,它与GB13000标准是兼容的。
因此,所有基于GB13000设计的软件都能够不经修改运行在支持GB18030的系统平台上。
汉字点阵在字库中的地址的计算由下面的函数实现(ANSI C 语言编写)
***********************************************************************************************************************/
/***************************************************************************************************
函数:unsigned long gt(unsigned char c1, unsigned char c2, unsigned char c3, unsigned char c4)
功能:计算汉字点阵在字库中的地址
参数:c1,c2,c3,c4:4字节汉字内码通过参数c1,c2,c3,c4传入,双字节内码通过参数c1,c2传入,c3=0,c4=0
返回:汉字点阵的字节地址(byte address)。如果用户是按word mode 读取点阵数据,则其地址(word
address)为字节地址除以2,即:word address = byte address / 2 .
例如:BaseAdd: 说明汉字点阵数据在字库中的起始地址,
“啊”字的内码为0xb0a1,则byte address = gt(0xb0,0xa1,0x00,0x00) *32
“ ”字的内码为0x8139ee39,则byte address = gt(0xee,0x39,0x81,0x39) *32
****************************************************************************************************/
unsigned long gt (unsigned char c1, unsigned char c2, unsigned char c3, unsigned char c4)
{
unsigned long h=0;
if(c2==0x7f)
return (h);
if(c1>=0xA1 && c1 <= 0xAB && c2>=0xa1) //Section 1
h= (c1 - 0xA1) * 94 + (c2 - 0xA1);
else if(c1>=0xa8 && c1 <= 0xa9 && c2<0xa1) //Section 5
{
if(c2>0x7f)
c2--;
h=(c1-0xa8)*96 + (c2-0x40)+846;
}
if(c1>=0xb0 && c1 <= 0xf7 && c2>=0xa1) //Section 2
h= (c1 - 0xB0) * 94 + (c2 - 0xA1)+1038;
else if(c1<0xa1 && c1>=0x81) //Section 3
{
if(c2>0x7f)
c2--;
h=(c1-0x81)*190 + (c2-0x40) + 1038 +6768;
}
else if(c1>=0xaa && c2<0xa1) //Section 4
{
if(c2>0x7f)
c2--;
h=(c1-0xaa)*96 + (c2-0x40) + 1038 +12848;
}
if(c2>=0x30 && c2<=0x39) //Extended Section (With 4 BYTES InCode)
{
if(c4<0x30 || c4>0x39)
return(h=0);
h=(c3-0x81)*12600+(c4-0x39)*1260+(c1-0xee)*10+(c2-0x39)+22046;
if(h>=22046 && h<=22046+6530)
return(h);
else
{ h=0;
return(h);
}
}
return(h);
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -