`

嗯, 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
分享到:
评论

相关推荐

    JS实现URL编码转换中文

    ### JS实现URL编码转换中文 在Web开发过程中,经常需要处理URL中的特殊字符,特别是中文字符。由于URL传输限制及浏览器解析原因,中文等非ASCII字符需要被编码为特定格式才能在网络上传输。本文将详细介绍如何使用...

    易语言JS实现编码转换源码

    在本案例中,我们讨论的主题是利用易语言来实现JavaScript(JS)编码转换的源码。JavaScript是一种广泛应用于Web开发的脚本语言,它在处理字符串编码时扮演着重要角色,尤其是在处理不同字符集和编码格式之间转换时...

    mac文件编码转换

    - 如果你熟悉编程,Python、Java、Node.js等语言都有库可以处理编码转换,例如Python的`codecs`模块,Java的`Charset`类。 6. **理解编码** - 理解字符编码如ASCII、UTF-8、GBK等的基本概念,以及它们在不同语言...

    易语言源码易语言JS实现编码转换源码.rar

    在"易语言源码易语言JS实现编码转换源码.rar"这个压缩包中,我们找到了一个关于易语言与JavaScript(JS)之间进行编码转换的源码实现。这种编码转换在处理不同字符集和编码格式的数据时非常关键,尤其是在处理多国...

    JS实现编码转换.rar

    综上所述,JS实现编码转换涉及到了JavaScript的字符串处理、Unicode编码以及可能的第三方库使用。在实际项目中,要充分理解各种编码标准,熟练掌握相关的API和工具,以便在多语言环境下保证数据的正确传输和显示。...

    易语言JS实现编码转换

    易语言JS实现编码转换源码,JS实现编码转换,decodeURI,encodeURI

    Node.js-iconv-lite-纯javascript转换字符编码

    `iconv-lite` 是一个纯 JavaScript 实现的字符编码转换库,它不需要任何 C++ 扩展,因此可以在包括 Windows、Linux、Mac OS X 在内的各种平台上无缝工作。这个库主要设计用于解决 Node.js 应用程序在处理多语言或多...

    字符编码转换 convert unicode to Shift-JIS

    各类编码转换,从unicode 到 Shift-JIS

    Quoted-printable 编码介绍、Quoted-printable编码解码转换方法

    Quoted-printable编码的数据可以通过以下的伪代码函数进行编码转换: ```pseudo function quoted_printable_encode($string){ return preg_replace('/[^\r\n]{73}[^=\r\n]{2}/', "$0=\r\n", str_replace("%", "=",...

    JavaScript实现Base64编码转换

    简介 Base64是一种基于64个可打印字符来表示二进制数据的表示方法。由于2的6次方等于64,所以每6个...当然,你也可以将图片、文本和音视频转换成二进制序列,再然后转换为Base64编码。我们这里讨论的是如何将二进制转换

    js的encodeUri编码转换为GBK问题

    在博文《js的encodeUri编码转换为GBK问题》中,作者可能讨论了如何实现这个转换过程。`GBKUrl.js`这个文件很可能是用来处理GBK编码到URI编码转换的工具脚本。这个脚本可能包含以下功能: 1. 使用`TextDecoder`来...

    js2c#-js转换c#代码

    "js2c#"工具正是一个旨在帮助开发者将JavaScript代码转换为C#代码的实用工具。这个工具的亮点在于它能够将JS代码编译成DLL或EXE文件,使得C#项目可以直接引用这些编译后的库,从而实现跨语言的代码复用。 首先,...

    易语言JS实现编码转换源码.7z

    当你看到“易语言JS实现编码转换源码”时,可以理解为这是一个使用易语言编写的程序,该程序的功能是处理JavaScript中的字符编码转换问题。 在编程中,编码转换是一个非常关键的环节,尤其是在处理多国语言或者跨...

    字符编码转换类,支持 ANSI、Unicode、Unicode big endian、UTF-8、UTF-8+Bom互相转换

    但是,如果你需要一个类来处理多种编码转换,可能需要编写自定义代码或者使用第三方库,如压缩包中的"CharsetConv"。 "CharsetConv"类可能包含了以下功能: - 检测字符串的当前编码 - 将字符串从ANSI转换为Unicode...

    html编码安全转换

    通过运行该函数,能对提交的文本进行安全转换,防止html字符导致页面格局出错和攻击。

    中文转换成十六进制编码

    十六进制编码是一种将字符转换为数字表示的方法,尤其在处理非ASCII字符集(如中文)时非常有用。本文将详细介绍如何将中文字符转换成十六进制编码,并通过一个简单的步骤进行演示。 中文字符集主要有GB2312、GBK、...

    web js转换简体繁体

    总的来说,“web js转换简体繁体”插件的核心是利用JavaScript和相关库进行字符编码转换。通过理解和应用这些技术,开发者可以轻松地在网页中添加简体繁体转换功能,为用户提供更贴心的浏览体验。

    编码转换convertz8.02

    标签中的“js”表明这个转换工具可能包含了JavaScript实现的部分,JavaScript是一种广泛用于Web开发的脚本语言,可以用于客户端的交互逻辑,例如在浏览器中进行编码转换。这可能意味着convertz8.02提供了JavaScript...

    批量转换网页文件编码工具

    网页文件编码转换是一个重要的IT领域话题,特别是在处理多种语言或者跨平台内容时。批量转换网页文件编码工具就是为了解决这一问题而设计的。这类工具能够有效地帮助用户将大量HTML、CSS、JavaScript或其他类型的...

    url编码转换器

    在这个“url编码转换器”中,我们可以看到它主要服务于将这些特殊字符转换为它们在网络传输中安全的表示形式。 在URL中,非字母数字的字符通常会被转换为"%xy"的形式,其中xy是该字符在ASCII码表中的16进制表示。...

Global site tag (gtag.js) - Google Analytics