嗯, js编码转换(转)

随便写写, 有兴趣就看, 与.net无多大关系.

这几天无聊, 看到了"adsl密码终结者"这个软件, 嗯, 对它的功能不甚满意, 想针对我这里的写一个, 当时考虑用C#, 不过呢, 我对网络传输这块不熟, 还是用比较熟的东西, javascript + xmlhttp, 当时在写的时候, 可能请求的所有网页都是utf-8编码的, 代码一直运行良好, 可是在扫描到某个地址的时候, 总是出现异常, 我搞出来一看, 原来那网页的编码是gb2312的, 以前也曾遇到过类似的问题, 不过, 那时候的解决办法同得用ado.record对像吧, 现在浏览器创建这对象却失败, 只能另外想办法, googl有一通以后, 找到这几个函数,

//将收到的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稍微强一点.

//转化成十六进制, 调用的是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字符进行编码.

以上函数, 在xpsp2 + ie7.0下通过.

原贴地址: http://www.leadbbs.com/a/a.asp?B=205&ID=2668820
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值