路由器中文SSID测试与分析

以Ralink SDK中的goahead为例:

web/wireless/basic.asp中,有设置ssid的UI代码,form关键内容如下:

<form method=post name=wireless_basic action="/goform/wirelessBasic" onSubmit="return CheckValue()">

这个action定义在src/wireless.c中

/* goform/wirelessBasic */
       static void wirelessBasic(webs_t wp, char_t *path, char_t *query);

代码中,先读取用户提交的ssid:

mssid_1 = websGetVar(wp, T("mssid_1"), T(""));

然后写入NVRAM:

nvram_bufset(RT2860_NVRAM, racat("SSID", i), mssid_1);

nvram_bufset函数位于lib/libnvram/nvram_env.c中

ssid用utf-8格式保存,而中文版Windows由于其历史原因,一直沿用GB2312作为其默认汉字编码格式。

bufset 0 'SSID1'->'中文测试'
       Hexdump value: E4,B8,AD,E6,96,87,E6,B5,8B,E8,AF,95,

修改代码,加入HEX String转义:

// manfeel, read AABBCCDDEEFF hex string
int pos = 0;
char str[33] = {0};
for(;;pos++) {
    if(pos>32 || mssid_1[2*pos] == 0 || mssid_1[2*pos+1] == 0)
        break;
 
    sscanf(mssid_1+2*pos, "%2X", &str[pos]);
}
nvram_bufset(RT2860_NVRAM, racat("SSID", i), str);

测试结果如下:

EFBBBFE4B8ADE69687 utf-8,手机正常,win7直接显示EF.....
      E4B8ADE69687 手机正常,Win7乱码(涓 。。)OpenWrt系统采用的方式
     FFFE2D4E8765 utf-16,手机乱码,win7显示FF....
    2D4E8765 utf-16无bom,手机乱码,win7乱码
    D6D0CEC4 GBK,  手机乱码,win7正常
    0102D6D0CEC4 GBK,  手机乱码(前面有空白字符),win7正常(说明Win7对GBK有容错性)
    0100D6D0CEC4 GBK,  手机空白字符,win7找不到该AP()

总结:
手机端:        正规utf-8编码方式(OP截断了前导,会导致Windows乱码)
Windows端:    GBK编码方式,手机端乱码(无法避免)

 

Windows端能够识别正规utf-8或者utf-16的中文SSID,只是会直接把其HEX显示出来

发布了59 篇原创文章 · 获赞 12 · 访问量 43万+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章