js下用gb2312編碼解碼實(shí)現(xiàn)方法
更新時(shí)間:2009年12月31日 23:26:15 作者:
在js中將中文用gb2312編碼。如,“我”編碼后應(yīng)該是“%CE%D2”。
需求
在js中將中文用gb2312編碼。如,“我”編碼后應(yīng)該是“%CE%D2”。
分析
大家知道,encodeURI和encodeURIComponent會(huì)用utf-8編碼,如“我”編碼后是“%E6%88%91”。據(jù)實(shí)驗(yàn),似乎沒(méi)有參數(shù)指定編碼的地方。只有另尋他法。
大致分析有如下幾種解決方案:
1. 用js創(chuàng)建一個(gè)隱藏的iframe并指定其為gb2312編碼,將需要轉(zhuǎn)換的文本放到iframe的form的一個(gè)input中,將form指定為get方式并提交,
然后獲取其url并解析,應(yīng)該可以得到其gb2312編碼后的文本。
2. 用ajax傳到服務(wù)器上編碼,然后傳回來(lái)。
3. 在js中創(chuàng)建一個(gè)gb2312編碼表。
實(shí)現(xiàn)
第一種方案?jìng)€(gè)人感覺(jué)太折騰,需要在多個(gè)不同的瀏覽器下測(cè)試。
第二種方案需要有服務(wù)器配合。
下面是第三種方案的實(shí)現(xiàn):
最開(kāi)始打算使用數(shù)組存儲(chǔ)編碼表,后來(lái)為了減小js文件大小,改用string來(lái)存儲(chǔ)。
于是,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等,非%開(kāi)頭的,直接返回本身
else if (c != '%'){
strOut += c;
}
// %開(kāi)頭
else{
i++;
var nextC = str.charAt(i);
// 數(shù)字,則不是漢字
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}';
(這里沒(méi)考慮中文標(biāo)點(diǎn),主要是看unicode里中文標(biāo)點(diǎn)和日韓的標(biāo)點(diǎn)混在一起,分布在幾個(gè)地方,就懶得弄了。誰(shuí)弄了可以發(fā)我一份,謝了。)
最后用.NET生成z處的代碼:
代碼
StringBuilder sb = new StringBuilder();
string strFormat = @"...z = '"; // 前面的js代碼
const int MinHanzi = 19968;
const int MaxHanzi = 40869;
for (int i = MinHanzi; i < MaxHanzi + 1; i++)
{
byte[] bytes = Encoding.GetEncoding("gb2312").GetBytes(((char)i).ToString());
sb.AppendFormat("{0}{1}", Convert.ToString(bytes[0], 16).ToUpper(), Convert.ToString(bytes[1], 16).ToUpper());
}
string str = strFormat + sb.ToString(0, sb.Length - 1) + "';";
System.IO.File.WriteAllText(@"F:\encodeGb2312.js", str, Encoding.ASCII);
在js中將中文用gb2312編碼。如,“我”編碼后應(yīng)該是“%CE%D2”。
分析
大家知道,encodeURI和encodeURIComponent會(huì)用utf-8編碼,如“我”編碼后是“%E6%88%91”。據(jù)實(shí)驗(yàn),似乎沒(méi)有參數(shù)指定編碼的地方。只有另尋他法。
大致分析有如下幾種解決方案:
1. 用js創(chuàng)建一個(gè)隱藏的iframe并指定其為gb2312編碼,將需要轉(zhuǎn)換的文本放到iframe的form的一個(gè)input中,將form指定為get方式并提交,
然后獲取其url并解析,應(yīng)該可以得到其gb2312編碼后的文本。
2. 用ajax傳到服務(wù)器上編碼,然后傳回來(lái)。
3. 在js中創(chuàng)建一個(gè)gb2312編碼表。
實(shí)現(xiàn)
第一種方案?jìng)€(gè)人感覺(jué)太折騰,需要在多個(gè)不同的瀏覽器下測(cè)試。
第二種方案需要有服務(wù)器配合。
下面是第三種方案的實(shí)現(xiàn):
最開(kāi)始打算使用數(shù)組存儲(chǔ)編碼表,后來(lái)為了減小js文件大小,改用string來(lái)存儲(chǔ)。
于是,js代碼如下:
代碼
復(fù)制代碼 代碼如下:
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等,非%開(kāi)頭的,直接返回本身
else if (c != '%'){
strOut += c;
}
// %開(kāi)頭
else{
i++;
var nextC = str.charAt(i);
// 數(shù)字,則不是漢字
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}';
(這里沒(méi)考慮中文標(biāo)點(diǎn),主要是看unicode里中文標(biāo)點(diǎn)和日韓的標(biāo)點(diǎn)混在一起,分布在幾個(gè)地方,就懶得弄了。誰(shuí)弄了可以發(fā)我一份,謝了。)
最后用.NET生成z處的代碼:
代碼
復(fù)制代碼 代碼如下:
StringBuilder sb = new StringBuilder();
string strFormat = @"...z = '"; // 前面的js代碼
const int MinHanzi = 19968;
const int MaxHanzi = 40869;
for (int i = MinHanzi; i < MaxHanzi + 1; i++)
{
byte[] bytes = Encoding.GetEncoding("gb2312").GetBytes(((char)i).ToString());
sb.AppendFormat("{0}{1}", Convert.ToString(bytes[0], 16).ToUpper(), Convert.ToString(bytes[1], 16).ToUpper());
}
string str = strFormat + sb.ToString(0, sb.Length - 1) + "';";
System.IO.File.WriteAllText(@"F:\encodeGb2312.js", str, Encoding.ASCII);
您可能感興趣的文章:
- js 編碼轉(zhuǎn)換 gb2312 和 utf8 互轉(zhuǎn)的2種方法
- Javascript下的urlencode編碼解碼方法附decodeURIComponent
- js對(duì)圖片base64編碼字符串進(jìn)行解碼并輸出圖像示例
- js 顯示base64編碼的二進(jìn)制流網(wǎng)頁(yè)圖片
- utf-8編碼引起js輸出中文亂碼的解決辦法
- 通過(guò)javascript進(jìn)行UTF-8編碼的實(shí)現(xiàn)方法
- 將字符串轉(zhuǎn)換成gb2312或者utf-8編碼的參數(shù)(js版)
- JS 文字符串轉(zhuǎn)換unicode編碼函數(shù)
- JavaScript Base64編碼和解碼,實(shí)現(xiàn)URL參數(shù)傳遞。
- JavaScript實(shí)現(xiàn)Base64編碼轉(zhuǎn)換
- JS實(shí)現(xiàn)的哈夫曼編碼示例【原始版與修改版】
相關(guān)文章
在layui框架中select下拉框監(jiān)聽(tīng)更改事件的例子
今天小編就為大家分享一篇在layui框架中select下拉框監(jiān)聽(tīng)更改事件的例子,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧2019-09-09javascript手風(fēng)琴下拉菜單實(shí)現(xiàn)代碼
手風(fēng)琴效果的下拉菜單大家都有見(jiàn)到過(guò)吧,實(shí)現(xiàn)的方法也有很多,這篇文章就為大家分享了javascript手風(fēng)琴下拉菜單實(shí)現(xiàn)代碼,純手寫(xiě)的,感興趣的朋友不要錯(cuò)過(guò)。2015-11-11JavaScript表單通過(guò)正則表達(dá)式驗(yàn)證電話號(hào)碼
通過(guò)正則表達(dá)式實(shí)現(xiàn)判斷一個(gè)輸入量是否為電話號(hào)碼,需要的朋友可以參考下2014-03-03訪問(wèn)百度和谷歌網(wǎng)速測(cè)試的javascript代碼
訪問(wèn)百度和谷歌網(wǎng)速測(cè)試的javascript代碼...2007-08-08Kindeditor在線文本編輯器如何過(guò)濾HTML
KindEditor使用JavaScript編寫(xiě),可以無(wú)縫的與Java、.NET、PHP、ASP等程序接合。本文給大家介紹Kindeditor在線文本編輯器如何過(guò)濾HTML,需要的朋友參考下吧2016-04-04