一种基于多字节编码的字符集GB2312

  本例介绍了国标GB2312编码的基本原理。

  GB2312编码又称为“汉字区位码”, 它按照汉字的汉语拼音顺序, 将汉字分区, 在每区定义固定的汉字数。

  GB2312是我国国家标准汉字编码的一部分, 也是常用汉子编码GBK编码的一部分, 是非常常用的汉字编码。

  GB2312使用两个字节表示一个汉字(即一个short int类型), 每个字节值大于0xA0并以此来判断某个字节究竟是汉字GB2312编码的一部分或是ASCII编码。

#include <stdlib.h>
#include <stdio.h>
#include <memory.h>


// 区位码将汉字分为87个区
#define TABLE_COUNT 87

// 区位码中每区共94个字符
#define TABLE_SIZE 94


// 定义表示一个GB2312汉字的联合体
typedef union {
	short sChar;        // 表示汉子编码, 16位

	struct {
		char cLow;        // 汉字编码的高位
		char cHigh;        // 汉子编码的低位
	};
} CHARSET, *LPCHARSET;

/**
 * 将一个 4位长度的short int类型的数字转为字符串表示(16进制)
 * 参数:pc, 一个指向CHARSET联合体的变量的指针
 * 返回值:指向转化结果字符串的指针
 */
const char* ShortToString(const LPCHARSET pc) {
	const int NUM = 16;   
	static char pBuffer[5] = "";
	int i, nEach;
	int nValue = (unsigned short)pc->sChar;        // 将short int去掉符号转为整型

	// 从数字的最低位开始, 诸位转化为字符(共 4 位)
	for (i = 3; i >= 0; --i) {
		if (nValue > 0) {
			nEach = nValue % NUM;
			nValue /= NUM;

			if (nEach < 10) {
				pBuffer[i] = '0' + nEach;
			} else {
				pBuffer[i] = 'A' + (nEach - 10);
			}
		} else {
			pBuffer[i] = '0';
		}
	}
	return pBuffer;
}
 	
/**
 * 将一个CHARSET结构体变量转化为一个GB2312编码汉字
 * 参数:pc, 一个指向CHARSET联合体的变量的指针
 * 返回值:一个指向表示汉字的字符串的指针
 */
const char* StructToString(const LPCHARSET pc) {
	static char pBuffer[3] = "";

	pBuffer[0] = pc->cHigh;
	pBuffer[1] = pc->cLow;
	return pBuffer;
}
 	
 	
int main(int argc, char* argv[]) {

	// 定义汉字区位表结构体
	CHARSET c;
	int i, j;

	c.sChar = 0;

	// 显示封面
	printf("/n/n/n/n/n/n/n");
	printf("========================="
		   "========================="
		   "========================="
		   "=====/n");
	printf("/t/t/t/t汉字区位表(基于GB2312)/n/n/n/n");
	printf("/t/t/t/t   作者:Purple/n/n");
	printf("========================="
		   "========================="
		   "========================="
		   "=====");
	printf("/n/n/n/n/n请按回车键继续...");
	getchar();

	// 显示区位表
	for (i = 1; i <= TABLE_COUNT; ++i) {
		printf("=================================== ");
		printf("第 %d 区", i);
		printf(" ====================================");
		c.cHigh =0xA0+ i;

		printf("   ");

		// 显示列号
		for (j = 1; j <= 5; ++j) {
			printf("      %d     ", j);
		}

		for (j = 0; j < TABLE_SIZE; ++j) {
			c.cLow =0xA0+ j + 1;
			if (j % 5 == 0) {
				// 显示行号汉字及编码
				printf("/n%2d: %s[%s]    ", j / 5 + 1, StructToString(&c), ShortToString(&c));
			} else {
				// 显示汉字及编码
				printf("%s[%s]    ", StructToString(&c), ShortToString(&c));
			}           
		}
		printf("/n/n/n请按回车键继续...");
		getchar();
	}
	return 0;
}


  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值