Android与STM32通信中巧妙解决中文乱码问题

前言

网上一大堆都是要多种格式相互转换,并且要很大的字库文件,对于小应用工程,小容量的STM32芯片,额外多出这些开销会感到蛮不舒服的,而且绝大部分的乱码问题时发生在STM32这边,所以本文是从Android端解决编码格式转化的问题,STM32那边稍做处理即可,我做的转换是从UTF-8转到GBK

解决方案

先是在芸芸众文中发现一篇介绍JAVA正确做字符串编码转换的文章,确实可以在Android端实现转换,但是在Socket通信时还是按utf8的编码格式发,到STM32端还是乱码,所以编码转换毫无意义了。后来很巧的看到另一种方式的编码转换格式URLEncoder,然后就是使用了。

URLEncoder.encode(str,"GBK");

把中文转换出来的数据就是类似于"%B6%E0%CA%C7%C4%E3%BA%C3"的字符串,如果是ASCII码就是原样输出,百分号后面的两位字符就是对应的GBK汉字机内码了,所以只要在STM32端做一下数据格式处理就可以直接获取到GBK编码的汉字,而不用再做额外的映射表,字库之类的东西了。
下面是数据处理获取GBK编码的代码了

//把字符串格式的16进制数转换为整型16进制数
uchar hstr2Hex(uchar *hstr){
	uchar a=0;
	if(hstr[0]>=0x30 && hstr[0]<=0x39){
		a=hstr[0]-0x30;
			
	}else if(hstr[0]>=0x41 && hstr[0]<=0x46){
		a=hstr[0]-0x37;
	}
	a<<=4;
	if(hstr[1]>=0x30 && hstr[1]<=0x39){
		a+=hstr[1]-0x30;
			
	}else if(hstr[1]>=0x41 && hstr[1]<=0x46){
		a+=hstr[1]-0x37;
	}
	
}
//调用这个函数做数据处理,对于非汉字数据不做处理
void getUrlGbk(uchar *nstr,uchar *ostr,int strlen){
	int i,j;
	uchar hstr[2];
	for(i=0,j=0;i<strlen;i++){
		if(ostr[i]=='%'){
			hstr[0]=ostr[i+1];
			hstr[1]=ostr[i+2];
			nstr[j]=hstr2Hex(hstr);
			j++;
			i+=2;
		}
		else{
			nstr[j]=ostr[i];
			j++;
		}
	}
}

运行示图

测试程序:

输出为:

下面是在墨水屏上显示的从Android端发送来的数据

结语

在调试过程中一直以为是在Android端的编码没有转换成功,换了好多种方式,最后发现是发送的问题,真心累啊,希望以后少些这些历史遗留问题占用时间和精力吧。

posted @ 2023-04-03 22:14  pie_thn  阅读(113)  评论(0编辑  收藏  举报