前言
网上一大堆都是要多种格式相互转换,并且要很大的字库文件,对于小应用工程,小容量的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++;
}
}
}
运行示图
测试程序:
![](/i/l/?n=23&i=blog/1358160/202304/1358160-20230403220551587-1274193040.png)
输出为:
![](/i/l/?n=23&i=blog/1358160/202304/1358160-20230403220552338-1781216635.png)
下面是在墨水屏
上显示的从Android
端发送来的数据
![](/i/l/?n=23&i=blog/1358160/202304/1358160-20230403220556915-873127291.jpg)
结语
在调试过程中一直以为是在Android
端的编码没有转换成功,换了好多种方式,最后发现是发送的问题,真心累啊,希望以后少些这些历史遗留问题占用时间和精力吧。