以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顯示出來