以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显示出来