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端的編碼沒有轉換成功,換了好多種方式,最后發現是發送的問題,真心累啊,希望以后少些這些歷史遺留問題占用時間和精力吧。
本文來自博客園,作者:pie_thn,轉載請注明原文鏈接:http://www.rzrgm.cn/pie-o/p/17284684.html

浙公網安備 33010602011771號