首頁  >  文章  >  web前端  >  js下用gb2312編碼解碼實作方法

js下用gb2312編碼解碼實作方法

高洛峰
高洛峰原創
2017-02-04 09:46:422132瀏覽

需求 
在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 = &#39;&#39;; 
for (var i=0;i<str.length; i++){ 
var c = str.charAt(i); 
// +是空格 
if (c == &#39;+&#39;){ 
strOut += &#39; &#39;; 
} 
// a,b,c,1,2等,非%开头的,直接返回本身 
else if (c != &#39;%&#39;){ 
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=&#39;{0}&#39;;

(這裡沒考慮中文標點,主要是看unicode里中文標點和日韓的標點混在一起,分佈在幾個地方,就懶得弄了。誰弄了可以弄了。發我一份,謝了。

陳述:
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn