javascript
cyico收集的关于utf8转换gb2312,以及关于javascript实现urlencode和urldecode的一些方法...
http://hi.baidu.com/cyico/blog/item/596e6f1694417d4e20a4e99a.html
關(guān)鍵詞: gb2312轉(zhuǎn)換utf-8 utf-8轉(zhuǎn)換gb2312 javascript urlencode解碼 Hex Asc Chr
在我的前一篇文章里面已經(jīng)實(shí)現(xiàn)了用javascript給urlencode解碼的問(wèn)題,很希望您能看下我前一篇帖子"客戶端用javascript代碼解析urlencode字符串",也許那才是您想要的, 以下我搜集的帖子能給大家在其它方面帶來(lái)些參考幫助,以下的都是他們自己的源代碼和原話,在下不敢隨意竄改,因?yàn)楫?dāng)時(shí)沒(méi)記下你們的網(wǎng)址和名字,所以沒(méi)粘上去,各位兄臺(tái)見(jiàn)諒啊
【轉(zhuǎn)貼1】
javascript編碼轉(zhuǎn)換????
隨便寫(xiě)寫(xiě), 有興趣就看, 與.net無(wú)多大關(guān)系.
這幾天無(wú)聊, 看到了"adsl密碼終結(jié)者"這個(gè)軟件, 嗯, 對(duì)它的功能不甚滿意, 想針對(duì)我這里的寫(xiě)一個(gè), 當(dāng)
時(shí)考慮用C#, 不過(guò)呢, 我對(duì)網(wǎng)絡(luò)傳輸這塊不熟, 還是用比較熟的東西, javascript + xmlhttp, 當(dāng)時(shí)在寫(xiě)
的時(shí)候, 可能請(qǐng)求的所有網(wǎng)頁(yè)都是utf-8編碼的, 代碼一直運(yùn)行良好, 可是在掃描到某個(gè)地址的時(shí)候, 總
是出現(xiàn)異常, 我搞出來(lái)一看, 原來(lái)那網(wǎng)頁(yè)的編碼是gb2312的, 以前也曾遇到過(guò)類似的問(wèn)題, 不過(guò), 那時(shí)候
的解決辦法同得用ado.record對(duì)像吧, 現(xiàn)在瀏覽器創(chuàng)建這對(duì)象卻失敗, 只能另外想辦法, google有一通以
后, 找到這幾個(gè)函數(shù),
LEADBBS CODE
//將收到的gb2312編碼轉(zhuǎn)換成對(duì)應(yīng)的文字
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("%"));
}
//對(duì)文字進(jìn)行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;??
}
這兩個(gè)函數(shù)呢, 我花了點(diǎn)時(shí)間, 才看懂, 這兩個(gè)也是網(wǎng)上較為常見(jiàn)的, 但我后來(lái)考慮到, 如果我要發(fā)送
gb2312編碼數(shù)據(jù)怎么辦? 于是, 瘋狂的搜索, 功夫不負(fù)有心人, 被我找到兩個(gè)函數(shù), 他奶奶的卻是
vbscript版的, 并且作者也是沒(méi)有辦法, 才用vbscript寫(xiě)的, 呵呵, 這個(gè)么, 沒(méi)辦法, 我非常不喜歡
vbscript的語(yǔ)法, 決定還是改寫(xiě)成javascript的, 但在幾個(gè)位置, 不得不承認(rèn), vbscript稍微強(qiáng)一點(diǎn).
LEADBBS CODE
//轉(zhuǎn)化成十六進(jìn)制, 調(diào)用的是vbscript的Hex函數(shù)
function Hex(n)
{??
c = n;
execScript("c = Hex(c)", "vbscript");
return c;
}
//返回文字的AscaII編碼, 調(diào)用的是vbscript的Asc函數(shù)
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編碼進(jìn)行解碼
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;
}
這個(gè)算是部份原創(chuàng)吧, 相信這兩個(gè)函數(shù)的javascript版本, 不是太多, 反正我是沒(méi)找到, 也許就我這一家
. 嗯, 如果想知道這些函數(shù)怎么工作的, 請(qǐng)去了解gb2312是怎么編碼, 還有utf-8是怎么對(duì)unicode字符進(jìn)
行編碼.
【轉(zhuǎn)貼2】
(注:以下代碼或許是你搜索過(guò)程經(jīng)常找得到的,但是很遺憾,不一定給你帶來(lái)什么實(shí)質(zhì)性的進(jìn)展,其中的vbs代碼你可以找一種方式代替,寫(xiě)到j(luò)avascript里面,就像上一個(gè)帖子里面的那樣用execScript函數(shù))
< script language="vbscript">
Function str2asc(strstr)
str2asc = hex(asc(strstr))
End Function
Function asc2str(ascasc)
asc2str = chr(ascasc)
End Function
</script>
<script language="javascript">
/*這里開(kāi)始時(shí)UrlEncode和UrlDecode函數(shù)*/
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>
轉(zhuǎn)載于:https://www.cnblogs.com/igin/archive/2008/04/07/1141006.html
總結(jié)
以上是生活随笔為你收集整理的cyico收集的关于utf8转换gb2312,以及关于javascript实现urlencode和urldecode的一些方法...的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: 保存图片时出现800700de错误的解决
- 下一篇: DNN 4.6.2的中文语言包