GBK与UNICODE编码互转

时间:2024-03-09 15:14:03

  对经常玩单片机的人员来说都知道怎样通过软件制作GBK字库,再使用GBK公式计算处理在LCD屏上显示中文汉字,如果不知道GBK制作软件及方式的话可以通过文末链接下载学习;这里主要是介绍UNICODE与GBK的相互转化,在一些应用场景可能只有UNICODE编码然后中文形式显示在LCD屏上,这时可能需要转换为GBK编码。

GBK与UNICODE没有直接对应的关系,通过查表方式将两者联系起来,具体实现方式:

1. 先从Fatfs系统获取cc936.c文件

cc936.c是所需要的GBK与unicode对应的表,里面包含了查表的算法,只需要调用即可。

转换函数说明:

/*****
Function: 将Unicode转GBK
Parameter:
		WCHAR	chr: Unicode 数据
		UINT	dir: 0: Unicode to OEMCP, 1: OEMCP to Unicode
Return value:gbk_value: 16进制数据,两个字节
******/
WCHAR ff_convert (	/* Converted code, 0 means conversion error */
	WCHAR	chr,	/* Character code to be converted */
	UINT	dir		/* 0: Unicode to OEMCP, 1: OEMCP to Unicode */
)

2. 编程实现

有些应用场景UNICODE编码可能还要区分大小端模式

通常我们获取的到的是一串字符串,这里需要进行处理:

/*****
Name: LCD_UNICODEStr
Function: 将Unicode以中文显示在LCD上
Parameter:
		int x: x 坐标
		int y: y 纵坐标
		int size: 字体大小,size=12或size=16
		char *str: Unicode 编码数据
		int Data_Type: 数据大小端模式;1:-->大端模式;0:-->小端模式;
		int back_color: 背景色
		int fron_color: 前景色(字体颜色)
Return value:无
******/
void LCD_UNICODEStr(u16 x,u16 y,u16 size,char *str,u8 Data_Type,u16 back_color,u16 fron_color)
{
	if(str == NULL) return ;

	if(size != FONT_SIZE12 &&size != FONT_SIZE16) return;	//不支持的size
	/***GBK相关变量***/
	.....
	/*****ASCII***/
    	unsigned char byte_len;
	/*******UNICODE*******/
	unsigned short result;
	while(*str != \'\0\')
	{
	    result = UNICODEToGBKChar(str,Data_Type);//处理Unicode字符串
	    result = ff_convert(result,0);//Unicode转GBK
            y = y0;//
	    if(((result&0xFF00)>>8)>0x80) //中文
	    {
                ........
            }
            else
            {
                ........
            }
	}
	return ;
}

处理Unicode字符串转为十六进制数据

/*****
Name: UNICODEToGBKChar
Function: 将Unicode字符串处理,转为十六进制
Parameter:
		char *str: Unicode 编码数据
		int Data_Type: 数据大小端模式;1:-->大端模式;0:-->小端模式;
Return value:gbk_value: 16进制数据,两个字节
******/
unsigned short UNICODEToGBKChar(char *str,u8 Data_Type)
{
	if(str == NULL) return -1;
	
	if((strlen(str)/4) < 1) return -1;

	char num[4]={0};
	int i=0;
	unsigned short gbk_value=0;
	while(i<4)
	{
		if(*str>=\'0\'&&*str<=\'9\')//0~9
		{
			num[i]=*str-48;
		}
		else if(*str>=\'A\'&&*str<=\'F\')//A~F
		{
			num[i]=*str- 55;
		}
		else if(*str>=\'a\'&&*str<=\'f\')//a~f
		{
			num[i]=*str- 87;
		}
		else return -1;
		str++;
		i++;
	}
	//获取十六进制数据
	if(Data_Type==1)
	{
		gbk_value=num[2]<<12|num[3]<<8|num[0]<<4|num[1];
	}
	else if(Data_Type==0)
	{
		gbk_value=num[0]<<12|num[1]<<8|num[2]<<4|num[3];
	}
	else
	{
		return -1;
	}
	return gbk_value;
}

接下来就是调用移植的cc936.c中的函数:

result = ff_convert(result,0);//Unicode转GBK

获取到GBK编码通过寻址公式再显示到LCD屏上

 

字库制作及使用文档https://download.csdn.net/download/zdw6868/11106573

在线Unicode编码转换:http://unicode.duoshitong.com/