⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 gb18030.c

📁 关于在GB18030 大字库中的汉字检索的原代码用 C语言开发。
💻 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 + -