对经常玩单片机的人员来说都知道怎样通过软件制作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/