查表法实现UNICODE转GB2312
这几天在写个程序需要在arm7做的平台上既显示UNICODE字符也要显示GB2313字符,查阅很多网站都没有找到UNICODE和GB2312的对应关系,唯一的办法就是做成对应的表。经过不懈的查找,终于在CSDN上找到一个源码,里面有个UNICODE和GB2312的对应表,该表囊括了7445个字符,这个对我实在是太有用了。
但是UNICODE中有不少字符是GB2312中没有的,显然,这将导致UNICODE码在表中出现不连续的现象,所以由这种对应关系去将UNICODE转为GB2312,势必每个UNICODE码都要去进行查询,这样将可能导致程序速度变慢,实时性变差。因此,可以想到做成查表方式,即以UNICODE作为数组下标,GB2312作为数组元素。对于无法与GB2312对应的UNICODE,可以用0×0020代替。如此,做成的表文件大概130k大小,虽然占用了一些空间但是换取了更快的速度。
下面是一段制作表的小程序,Unicode_GB2312数组较大不便在此列出。
int main(void)
{
unsigned short int zz[65536];
unsigned long int i,k;
FILE *fp;
for(i = 0;i < 32;i++)
{
zz[i] = 0×0020;
}
for(i = 32;i < 127;i++)
{
zz[i] = i;
}
for(i = 127;i < 65536;i++)
{
for(k = 0;k < 7445;k++)
{
if(i == Unicode_GB2312[k][0])
{
zz[i] = Unicode_GB2312[k][1];
break;
}
else
{
zz[i] = 0×0020;
}
}
}
fp = fopen(“unicode2gb2312.txt”,”wt”);
for(i= 0;i<65536;i++)
{
fprintf(fp,”%s%04x%c\n”,”0x”,zz[i],’,');
}
fclose(fp);
return 1;
}