C语言实现GB2312与UNICODE互转(char * 与 wchar_t* 互转)


众所周知,GB2312与UNICODE互转,需要查“表”转换,那么关键就是怎么制作这个“表”了。

UNICODE码从0X4E00开始,到0X9FA0就可以了,另外还有几个,不那么常用,就可以不用添加了,可以先把这些打到一个文件里,并存储为数组形式,

unsigned short uniChar[] = {0X4E00.....0X9FA0};


然后把这个文件改成.h的,包含到工程里来,定义一个结构体,


typedef struct tg_Char
{
	unsigned short uni;
	unsigned short gb;
}TGCHAR;

然后利用前面打印好的数组,做一个以unicode码排序的结构体数组,代码如下:


	int length = sizeof(uniChar)/2;
	
	freopen("TGCHAR unicode_order.h","w+",stdout);

	printf("unicode_order[] = {\n");

	for (int i = 0;i 0x80)
		{
			unsigned short temp = uniChar[i];
			wchar_t wTemp[2] = {temp};
			char cTemp[8] = {8};

			WideCharToMultiByte (CP_ACP, 0, wTemp, 2, cTemp, 8, NULL, NULL);

			gTemp = (unsigned char)cTemp[0] << 8 | (unsigned char)cTemp[1];
		
			printf("{0x%X,0x%X}/*%s*/,\n",temp,gTemp,cTemp);
		}
	}


以上代码就可以输出一个以unicode排序的结构体数组,需要把unicode码转到gb2312,就可以差这个结构体数组,即可以用二分查找。


	int left = 0;

	int right = length- 1;

	while(left <= right)
	{
		int middle = (left+right)/2;

		if (uniCode == unicode_order[middle].uniChar) 
			return unicode_order[middle].gbChar;
		if (uniCode > unicode_order[middle].uniChar) 
			left = middle + 1;
		else 
			right = middle - 1;
	}



要实现gb2312查找unicode,把unicode排序的数组,按照gb2312排序,重新制作一个gb2312_order的数组即可使用二分查找。







你可能感兴趣的:(WINCE导航编程之路)