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端的编码没有转换成功,换了好多种方式,最后发现是发送的问题,真心累啊,希望以后少些这些历史遗留问题占用时间和精力吧。
Android与STM32通信中巧妙解决中文乱码问题的更多相关文章
- git status 显示中文和解决中文乱码
目录 git status 显示中文和解决中文乱码 解决git status不能显示中文 解决git bash 终端显示中文乱码 通过修改配置文件来解决中文乱码 git status 显示中文和解决中 ...
- java web 中有效解决中文乱码问题-pageEncoding与charset区别, response和request的setCharacterEncoding 区别
这里先写几个大家容易搞混的编码设置代码: 在jsp代码中的头部往往有这两行代码 pageEncoding是jsp文件本身的编码contentType的charset是指服务器发送给客户端时的内容编码J ...
- 在PHP中PDO解决中文乱码问题的一些补充
我的环境是appsver包, 在网上最常出现的解决中文乱码显示的代码是: 第一种:PDO::__construct($dsn, $user, $pass, array (PDO::MYSQL_ATTR ...
- Web(Jsp+ Servlet)开发中如何解决中文乱码问题
1.中文乱码的成因 编码的字符集和解码的字符集不一致. 2.web开发过程中可能出现的乱码的位置及解决方案 ①request乱码 在向服务器传递数据时,所传递的中文有可能出现乱码. post请求(协议 ...
- Python3中如何解决中文乱码与编码的问题
1.解决乱码问题: pyhton中内部所有编码是Unicode,中文是gbk:正常情况下,我们输出的是utf-8: 我们可以采用sys.getdefaultencoding()查看系统默认的编码: 解 ...
- Struts 2中如何解决中文乱码问题?
在配置文件中定义如下常量值配置: <constant name=”struts.i18n.encoding” value=”UTF-8”/> 注意:只能解决post请求的乱码问题,针对ge ...
- 在PHP中PDO解决中文乱码问题
$this->pdo = new PDO($dsn, $user, $password, array(PDO::ATTR_PERSISTENT => true)); $stmt = $th ...
- HttpServletRequest解决中文乱码的问题
HTTP请求有get和post,这两中方式解决中文乱码的方式如下: 1.Post方式请求 //这句话是设置post请求体的编码为utf-8 request.setCharacterEncoding(& ...
- 关于web.xml中配置Spring字符编码过滤器以解决中文乱码的问题
当出现中文乱码问题,Spring中可以利用CharacterEncodingFilter过滤器解决,如下代码所示: <!-- Spring字符编码过滤器:解决中文乱码问题 --> < ...
- Android studio 配置file encoding 无效,中文乱码解决办法
通过配置Android studio 配置file encoding 无效,中文乱码,问题出现在java编译的时候jack采用了默认编码(中文windows默认的GBK编码)而乱码,所以不管更改bui ...
随机推荐
- 【Azure 应用服务】Azure App Service能否使用Storage Account File Share
问题描述 Azure App Service能否使用Storage Account File Share? 问题回答 如果部署的App Service为Linux环境,可以直接使用Mount stor ...
- Dockerfile编写(备份)
1-使用#注释 2-Dockerfile 主体内容分为四部分:基础镜像信息. 维护者信息. 镜像操作指令和容器启动时执行指令 简单示例: FROM xxx:latest #基于xxx:late ...
- .NET 全能 Cron 表达式解析库(支持 Cron 所有特性)
前言 今天大姚给大家分享一个.NET 全能 Cron 表达式解析类库,支持 Cron 所有特性:TimeCrontab. Cron表达式介绍 Cron表达式是一种用于配置定时任务的时间表达式.它由一系 ...
- .Net下的CORS跨域设置
CORS跨域访问问题往往出现在"浏览器客户端"通过ajax调用"服务端API"的时候.而且若是深究原理,还会发现跨域问题其实还分为[简单跨域]与[复杂跨域]这两 ...
- Vue前端项目架构梳理
撰写日期:2020-07-23 撰稿人:彭成刚 转载需经本人同意. Vue前端项目架构梳理 后期可以将TypeScript加入到项目来,对参数的数据类型进行更严格的校验. 现在主流就 Vue 和 Re ...
- http-server -S 开启 https 服务
下载 openssl Win64 OpenSSL v1.1.1k Light http://slproweb.com/download/Win64OpenSSL_Light-1_1_1k.exe 一路 ...
- Rust 标准库 Trait 指南
部分内容来自 Rust 2021 年期刊 内容目录 引言 Trait 基础 自动 Trait 泛型 Trait 格式化 Trait 操作符 Trait 转换 Trait 错误处理 迭代器 Trait ...
- 修改Tomcat服务器Server Locations
首先双击我们集成好的Tomcat服务器 修改Server Locations选项 Specify the server path (i.e. catalina.base) and deploy p ...
- Tomcat错误之java.lang.OutOfMemoryError:PermGen space解决方案
公司的站点是跑在Tomcat环境下的,运行一段时间后,有时会报这样的错误:java.lang.OutOfMemoryError: PermGen space 在网上查询了一下,大部分都说是jvm虚拟机 ...
- 游戏引擎中的实时渲染和在V-Ray中渲染有什么区别 2022-11-25
游戏引擎中的实时渲染和在V-Ray中渲染有什么区别,下面我们一起来分析一下,从2个方面来具体分析实时渲染和在V-Ray中渲染种的不一样的区别. 原理区别 VRay等渲染器原理上叫做离线渲染(Offli ...