您的位置:首页 > Web前端 > JavaScript

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

2008-04-07 21:17 1006 查看
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>
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: