MCU收到视屏终端的225报文时解析终端名称汉文出错,直接解析为\uXXXX的字符串,其实是因为mcu网络代理进程采用java栈后,发到后台的名字采用json的unicode编码,linux不能识别\u转义符,而将其解析为 \ 和 u 两个字符,于是自己手动转换
wchar_t wstr;
int k=0;
char strbuf_tmp[kCallMaxAddrLen] = { 0 };
char * ptr=strbuf_tmp;
setlocale(LC_ALL, "zh_CN.utf8");
unsigned char chs[4]="";
for (int i = 0; i < displayLen; )
{
if(0x5c==strbuf[i]&&0x75==strbuf[i+1])
{
i+=2;
for(int j=0;j<4;j++)
{
if(strbuf[i+j]<='9'&&strbuf[i+j]>='0')
chs[j]=(strbuf[i+j]-48);
else
chs[j]=(strbuf[i+j]-87);
}
i+=4;
wstr=chs[0]<<12 | chs[1]<<8 | chs[2]<<4 | chs[3];
ptr+=wctomb(ptr,wstr);
}
else
{
*ptr=strbuf[i];
++ptr;
++i;
}
}
写的比较丑,用wctomb是考虑了中文和数字字母混合名称的处理,这里主要记一下 setlocale(LC_ALL, "zh_CN.utf8")这个函数,linux下locale命令可以查看系统支持的语言库,要是系统没有该字体,会返回错误,记得先确认好系统是否有你设置的字库,不然发现后空余懊恼