需求
在js中將中文用gb2312編碼。如,「我」編碼後應該是「%CE%D2」。
分析
大家知道,encodeURI和encodeURIComponent會用utf-8編碼,如「我」編碼後是「%E6%88%91」。據實驗,似乎沒有參數指定編碼的地方。只有另尋他法。
大致分析有以下幾種解:
1. 用js建立一個隱藏的iframe並指定其為gb2312編碼,將需要轉換的文字放到iframe的form的一個input中,將form指定為get方式並提交,
然後取得其url並解析,應該可以得到其gb2312編碼後的文字。
2. 用ajax傳到伺服器上編碼,然後傳回來。
3. 在js中建立一個gb2312編碼表。
實現
第一種方案個人覺得太折騰,需要在多個不同的瀏覽器下測試。
第二種方案需要有伺服器配合。
下面是第三種方案的實作:
最開始打算使用陣列儲存編碼表,後來為了減少js檔案大小,改用string來儲存。
於是,js代碼如下:
代碼
function encodeToGb2312(str){ var strOut=""; for(var i = 0; i < str.length; i++){ var c = str.charAt(i); var code = str.charCodeAt(i); if(c==" ") strOut +="+"; else if(code >= 19968 && code <= 40869){ index = code - 19968; strOut += "%" + z.substr(index*4,2) + "%" + z.substr(index*4+2,2); } else{ strOut += "%" + str.charCodeAt(i).toString(16); } } return strOut; } function decodeFromGb2312(str){ var strOut = ''; for (var i=0;i<str.length; i++){ var c = str.charAt(i); // +是空格 if (c == '+'){ strOut += ' '; } // a,b,c,1,2等,非%开头的,直接返回本身 else if (c != '%'){ strOut += c; } // %开头 else{ i++; var nextC = str.charAt(i); // 数字,则不是汉字 if (!isNaN(parseInt(nextC))){ i++; strOut += decodeURIComponent(c+nextC+str.charAt(i)); } else{ var x = new String(); try { var code = str.substr(i,2)+str.substr(i+3,2); i = i + 4; var index = -1; while ((index = z.indexOf(code,index+1)) != -1){ if (index%4 == 0){ strOut += String.fromCharCode(index/4+19968); break; } } }catch(e){} } } } return strOut; } var z='{0}';
(這裡沒考慮中文標點,主要是看unicode里中文標點和日韓的標點混在一起,分佈在幾個地方,就懶得弄了。誰弄了可以弄了。發我一份,謝了。