日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 前端技术 > javascript >内容正文

javascript

cyico收集的关于utf8转换gb2312,以及关于javascript实现urlencode和urldecode的一些方法...

發布時間:2025/4/14 javascript 30 豆豆
生活随笔 收集整理的這篇文章主要介紹了 cyico收集的关于utf8转换gb2312,以及关于javascript实现urlencode和urldecode的一些方法... 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

http://hi.baidu.com/cyico/blog/item/596e6f1694417d4e20a4e99a.html

關鍵詞: gb2312轉換utf-8 utf-8轉換gb2312 javascript urlencode解碼 Hex Asc Chr

在我的前一篇文章里面已經實現了用javascript給urlencode解碼的問題,很希望您能看下我前一篇帖子"客戶端用javascript代碼解析urlencode字符串",也許那才是您想要的, 以下我搜集的帖子能給大家在其它方面帶來些參考幫助,以下的都是他們自己的源代碼和原話,在下不敢隨意竄改,因為當時沒記下你們的網址和名字,所以沒粘上去,各位兄臺見諒啊

【轉貼1】

javascript編碼轉換????
隨便寫寫, 有興趣就看, 與.net無多大關系.

這幾天無聊, 看到了"adsl密碼終結者"這個軟件, 嗯, 對它的功能不甚滿意, 想針對我這里的寫一個, 當

時考慮用C#, 不過呢, 我對網絡傳輸這塊不熟, 還是用比較熟的東西, javascript + xmlhttp, 當時在寫

的時候, 可能請求的所有網頁都是utf-8編碼的, 代碼一直運行良好, 可是在掃描到某個地址的時候, 總

是出現異常, 我搞出來一看, 原來那網頁的編碼是gb2312的, 以前也曾遇到過類似的問題, 不過, 那時候

的解決辦法同得用ado.record對像吧, 現在瀏覽器創建這對象卻失敗, 只能另外想辦法, google有一通以

后, 找到這幾個函數,

LEADBBS CODE

//將收到的gb2312編碼轉換成對應的文字
function gb2utf8(data)
{
?? var glbEncode = [];
?? gb2utf8_data = data;
?? execScript("gb2utf8_data = MidB(gb2utf8_data, 1)", "VBScript");
?? var t = escape(gb2utf8_data).replace(/%u/g,"").replace(/(.{2})(.{2})/g,"%$2%$1").replace

(/%([A-Z].)%(.{2})/g,"@$1$2");
?? t = t.split("@");
?? var i = 0, j = t.length, k;
?? while( ++i < j )
?? {
????? k = t[i].substring(0,4);
????? if(!glbEncode[k])
????? {
???????? gb2utf8_char = eval("0x"+k);
???????? execScript("gb2utf8_char = Chr(gb2utf8_char)", "VBScript");
???????? glbEncode[k] = escape(gb2utf8_char).substring(1,6);
????? }
????? t[i] = glbEncode[k]+t[i].substring(4);
?? }
?? gb2utf8_data = gb2utf8_char = null;
?? return unescape(t.join("%"));
}
//對文字進行utf-8編碼
function utf8(wide)
{
var c, s;
var enc = "";
var i = 0;
while(i<wide.length)
{
c= wide.charCodeAt(i++);
// handle UTF-16 surrogates
if (c>=0xDC00 && c<0xE000) continue;
if (c>=0xD800 && c<0xDC00)
{
?? if (i>=wide.length) continue;
?? s= wide.charCodeAt(i++);
?? if (s<0xDC00 || c>=0xDE00) continue;
?? c= ((c-0xD800)<<10)+(s-0xDC00)+0x10000;
}
// output value
if (c<0x80)
?? enc += String.fromCharCode(c);
else if (c<0x800)
?? enc += String.fromCharCode(0xC0+(c>>6),0x80+(c&0x3F));
else if (c<0x10000)
?? enc += String.fromCharCode(0xE0+(c>>12),0x80+(c>>6&0x3F),0x80+(c&0x3F));
else
?? enc += String.fromCharCode(0xF0+(c>>18),0x80+(c>>12&0x3F),0x80+(c>>6&0x3F),0x80+

(c&0x3F));
}
return enc;
}
var hexchars = "0123456789ABCDEF";??
function toHex(n)
{??
return hexchars.charAt(n>>4)+hexchars.charAt(n & 0xF);??
}
var okURIchars = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789_-";??
function encodeURIComponentNew(s)
{??
var s = utf8(s);??
var c;??
var enc = "";??
for(var i= 0; i < s.length; i++)
{??
if(okURIchars.indexOf(s.charAt(i))==-1)??
?? enc += "%"+toHex(s.charCodeAt(i));??
else??
?? enc += s.charAt(i);??
}??
return enc;??
}

這兩個函數呢, 我花了點時間, 才看懂, 這兩個也是網上較為常見的, 但我后來考慮到, 如果我要發送

gb2312編碼數據怎么辦? 于是, 瘋狂的搜索, 功夫不負有心人, 被我找到兩個函數, 他奶奶的卻是

vbscript版的, 并且作者也是沒有辦法, 才用vbscript寫的, 呵呵, 這個么, 沒辦法, 我非常不喜歡

vbscript的語法, 決定還是改寫成javascript的, 但在幾個位置, 不得不承認, vbscript稍微強一點.
LEADBBS CODE

//轉化成十六進制, 調用的是vbscript的Hex函數
function Hex(n)
{??
c = n;
execScript("c = Hex(c)", "vbscript");
return c;
}
//返回文字的AscaII編碼, 調用的是vbscript的Asc函數
function Asc(s)
{
c = s;
execScript("c = Asc(c)", "vbscript");
return c;
}
//獲取文字的gb2312編碼
function gb2312Encode(str)
{
var string = "";
c = s = "";
var high = "";
var low = "";
for(var i = 0; i < str.length; i++)
{
c = Asc(str.charAt(i));
if(Math.abs(c) < 0xFF)
?? string += str.charAt(i);
else
{
?? if(c < 0) c += 0x10000;
?? high = ((c & 0xFF00) >> 8) & 0x00FF;
?? low = c & 0xFF;
?? string += "%" + Hex(high) + "%" + Hex(low);
}
}
return string;
}
//將收到的gb2312編碼進行解碼
function gb2312Decode(data)
{
string = "";
str = "";
d = data;
n = "";
c = "";
execScript("l = LenB(d)", "vbscript");
execScript("d = MidB(d, 1)", "vbscript");
for( i = 1; i <= l; i++)
{
execScript("c = AscB(MidB(d, i, 1))", "vbscript");
if( c < 0x80)
{
?? execScript("str = Chr(c)", "vbscript");
?? string += str;
}
else
{
?? execScript("n = AscB(MidB(d, i + 1, 1))", "vbscript");
?? execScript("str = Chr(CLng(c) * &H100 + CInt(n))", "vbscript");
?? string += str;
?? i = i + 1;
}
}
return string;
}

這個算是部份原創吧, 相信這兩個函數的javascript版本, 不是太多, 反正我是沒找到, 也許就我這一家

. 嗯, 如果想知道這些函數怎么工作的, 請去了解gb2312是怎么編碼, 還有utf-8是怎么對unicode字符進

行編碼.

【轉貼2】

(注:以下代碼或許是你搜索過程經常找得到的,但是很遺憾,不一定給你帶來什么實質性的進展,其中的vbs代碼你可以找一種方式代替,寫到javascript里面,就像上一個帖子里面的那樣用execScript函數)

< script language="vbscript">
Function str2asc(strstr)
str2asc = hex(asc(strstr))
End Function
Function asc2str(ascasc)
asc2str = chr(ascasc)
End Function
</script>

<script language="javascript">
/*這里開始時UrlEncode和UrlDecode函數*/
function UrlEncode(str){
var ret="";
var strSpecial="!\"#$%&'()*+,/:;<=>?[]^`{|}~%";
for(var i=0;i<str.length;i++){
?? var chr = str.charAt(i);
??? var c=str2asc(chr);
??? tt += chr+":"+c+"n";
??? if(parseInt("0x"+c) > 0x7f){
????? ret+="%"+c.slice(0,2)+"%"+c.slice(-2);
??? }else{
????? if(chr==" ")
??????? ret+="+";
????? else if(strSpecial.indexOf(chr)!=-1)
??????? ret+="%"+c.toString(16);
????? else
??????? ret+=chr;
??? }
}
return ret;
}
function UrlDecode(str){
var ret="";
for(var i=0;i<str.length;i++){
?? var chr = str.charAt(i);
??? if(chr == "+"){
????? ret+=" ";
??? }else if(chr=="%"){
???? var asc = str.substring(i+1,i+3);
???? if(parseInt("0x"+asc)>0x7f){
????? ret+=asc2str(parseInt("0x"+asc+str.substring(i+4,i+6)));
????? i+=5;
???? }else{
????? ret+=asc2str(parseInt("0x"+asc));
????? i+=2;
???? }
??? }else{
????? ret+= chr;
??? }
}
return ret;
}
alert(UrlDecode("%C2%D2%C2%EB"));
< /script>

轉載于:https://www.cnblogs.com/igin/archive/2008/04/07/1141006.html

總結

以上是生活随笔為你收集整理的cyico收集的关于utf8转换gb2312,以及关于javascript实现urlencode和urldecode的一些方法...的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。