首页 > 其他分享 >Android与STM32通信中巧妙解决中文乱码问题

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

时间:2023-04-03 22:23:18浏览次数:43  
标签:STM32 转换 编码 hstr GBK 乱码 Android

前言

网上一大堆都是要多种格式相互转换,并且要很大的字库文件,对于小应用工程,小容量的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端的编码没有转换成功,换了好多种方式,最后发现是发送的问题,真心累啊,希望以后少些这些历史遗留问题占用时间和精力吧。

标签:STM32,转换,编码,hstr,GBK,乱码,Android
From: https://www.cnblogs.com/pie-o/p/17284684.html

相关文章

  • STM32 FSMC的 NOR FLASH B模式模拟LCD 8080时序
    STM32 FSMC:FSMC(FlexibleStaticMemoryController):翻译为:灵活的静态存储管理器。可管理的存储类型包括:NORFLASH 和 SRAMNANDFLASHPC Card(PC卡,不知道是什么东西)具体功能是将外部的存储设备映射为内部地址,可以用程序访问这些地址,间接地,由FSMC 自动产生相应时序,......
  • Android开发-Android常用组件-SeekBar拖动条
    4.9 SeekBar拖动条android:max滑动条的最大值android:progress滑动条的当前值android:secondaryProgress二级滑动条的进度android:thumb滑块的drawable 接着要说下SeekBar的事件了,SeekBar.OnSeekBarChangeListener我们只需重写三个对应......
  • 成品直播源码推荐,Android 禁止下拉菜单栏
    成品直播源码推荐,Android禁止下拉菜单栏1.屏蔽非锁屏下的下拉菜单栏这种Android系统其实是提供了方法的,只不过是隐藏的,只给系统应用,也就是用mk编译的apk使用。如果第三方应用想要使用,或者Androidstuido编译方式的想要使用。则可以使用反射。 /** *Allowsanapptoco......
  • 搭建直播平台,android 如何得到本地视频的缩略图
    搭建直播平台,android如何得到本地视频的缩略图 publicclassVideoThumbUtils{  /**   *得到视屏的缩略图   *   *@paramvideoPath   *@paramwidth   *@paramheight   *@return   */  publicstaticBitmapgetVideoThum......
  • idea run控制台中文乱码
    教程:https://blog.csdn.net/weiwu13/article/details/121417404解决方式方式1:设置虚拟机参数(-Dfile.encoding=UTF-8)......
  • Android AVB中的几种Descriptor
    avbtoolinfo_image查看img信息./android/external/avb/avbtoolinfo_image--imageout/evb/download_images/emmc/vbmeta.imgMinimumlibavbversion:1.0HeaderBlock:256bytesAuthenticationBlock:576bytesAuxiliaryBlock:3456byte......
  • 野火书籍《STM32库开发指南》 第26章LCD代码勘误
     第26章LCD代码,P303代码写错。原来的代码写错,因为是D/CX引脚,高电平(1)意味着数据,低电平(0)意味着命令:#defineFSMC_Addr_ILI9341_CMD((uint32_t))0x60020000#defineFSMC_Addr_ILI9341_DATA((uint32_t))0x60000000因此应该将两个宏定义对换。正确的为:#defineFS......
  • .net6(.net core)使用MailKit收取邮件乱码的问题
    配置IMAP地址后,MailKit读取邮件时中文乱码。主要问题是.netcore以后默认缺失中文字符集。1.安装System.Text.Encoding.CodePages包  2.在Main方法注册staticvoidMain(){//注册字符集,缺失字符集,一些中文编码数据为乱码Encoding......
  • Android Studio——sdk相关包
    SDKPlatforms相关   SDKTools相关 ......
  • stm32------使用keil和标准外设库进行stm32工程模板创建
    keil软件版本:V5.35.00st官网:STM32固件-意法半导体STMicroelectronics单片机型号:STM32F103VET6配置步骤大致为:新建本地文件夹--->新建工程--->添加本地文件到相应工程--->打开魔术棒进行配置--->添加main文件step1:新建本地工程文件夹(这里取名为template,因后续想要做为模板使......