路由器中文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萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章