f_unicode.c

来自「基于arm9的,usb设备(u盘)的读写操作实现.」· C语言 代码 · 共 172 行

C
172
字号

#include "inc.h" 
#include "b2u_tables.h"
#include "gb2u_table.h"

u16 MX_Big5ToUnicode(u16 big5)
{
	u16 c1, c2;
	u32 offset;
	u16 unicode;

	c1 = (big5>>8)&0x00FF;
	c2 = big5&0x00FF;
	c2 -= (c2>=0xA1?(0xA1-0x3F):0x40);
	offset = ((c1-0x81)*157+c2)*2;
	unicode = (((u16)(BtoU[offset+1]))<<8)+(u16)(BtoU[offset]);
	return unicode;
}

u16 MX_UnicodeToBig5(u16 unicode)
{
	u32 offset;
	u16 big5;

	if(unicode>0x80)
	{
		offset = unicode*2;
		big5 = (((u16)(UtoB[offset+1]))<<8)+(u16)(UtoB[offset]);
	}else{
		big5 = unicode;
	}
	return big5;
}

void MX_UniStrToBig5Str(u16 *unistr, u8 *big5str)
{
	u16 i,j;
	u16 big5;
	
	i=0;
	j=0;
	while(unistr[i]!=0x0000)
	{
		big5=MX_UnicodeToBig5(unistr[i]);
		if(big5 > 0x80)
		{
			big5str[j]=(big5>>8)&0xFF;
			big5str[j+1]=(big5&0xFF);
			j+=2;
		}else{
			big5str[j]=(u8)big5;
			j++;
		}
		i++;
	}
	big5str[j]=0x00;
}

void  MX_Big5StrToUniStr(u8 *big5str, u16 *unistr)
{
	u16 i,j;
	u16 uni;

	i=0;
	j=0;
	while(big5str[i]!=0x00)
	{
		if(big5str[i]<0x80)
		{
			unistr[j]=(u16)big5str[i];
			i++;
			j++;
		}else{
			uni = (((u16)(big5str[i]))<<8)+(u16)(big5str[i+1]);
			unistr[j]=MX_Big5ToUnicode(uni);
			i+=2;
			j++;
		}
	}
	unistr[j]=0x0000;
}

u16 MX_GB2312ToUnicode(u16 gb2312)
{
	u32 offset;
	u16 unicode=0;

	for(offset=1;offset<sizeof(gb2u_table)/2;)
	{
		if(gb2312 == gb2u_table[offset])
		{
			break;
		}
		else
			offset+=2;
	}
	unicode = gb2u_table[offset-1];
	return unicode;
}

u16 MX_UnicodeToGB2312(u16 unicode)
{
	u32 offset;
	u16 gb2312;

	for(offset=0;offset<sizeof(gb2u_table)/2;)
	{
		if(unicode == gb2u_table[offset])
		{
			break;
		}
		else
			offset+=2;
	}
	gb2312 = gb2u_table[offset+1];
	return gb2312;
}

u8 MX_UniStrToGB2312Str(u16 *unistr, u8 *gb2312str)
{
	u16 i,j;
	u16 gb2312;
	
	i=0;
	j=0;
	while(unistr[i]!=0x0000)
	{
		if(unistr[i] > 0x80)
		{
			gb2312=MX_UnicodeToGB2312(unistr[i]);
			gb2312str[j]=(gb2312>>8)&0xFF;
			gb2312str[j+1]=(gb2312&0xFF);
			j+=2;
		}else{
 			gb2312str[j]=unistr[i]&0xff;
			j++;
		}
		i++;
	}
	gb2312str[j]=0x00;

	return j;
}

u8  MX_GB2312StrToUniStr(u8 *gb2312str, u16 *unistr)
{
	u16 i,j;
	u16 uni;

	i=0;
	j=0;
	while(gb2312str[i]!=0x00)
	{
		if(gb2312str[i]<0x80)
		{
			unistr[j]=(u16)gb2312str[i];
			i++;
			j++;
		}else{
			uni = (((u16)(gb2312str[i]))<<8)+(u16)(gb2312str[i+1]);
			unistr[j]=MX_GB2312ToUnicode(uni);
			i+=2;
			j++;
		}
	}
	unistr[j]=0x0000;	//modified by denny 2006-11-30

	return j;
}


⌨️ 快捷键说明

复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?