Javascript url 编码算法(utf) by shawl.qiu

原创 2007年09月26日 11:09:00

 Javascript url 编码算法(utf) by shawl.qiu


说明:
这个算法没考虑四字节的编码(目前没见过四字节的编码).
另外使用 -1(escape) 选项时, 会丢失数据, 不过 0, 1 没问题.
在我的印像中 escape 好像专门为 codepage 936 而设计的...因此 unicode 的某些字符在 codepage 936 没有时, 解码就出错了...

至于 gb url 编码解码 的算法...使用JS的话, 就必须得用 编码表(code table)
目前已实现, 以后再发表相关文章.

对 gb 编码解码感兴趣的话, 到 下面URL弄个gb-uni 对应表:
http://www.herongyang.com/gb2312/ug_map.html

shawl.qiu
2007-09-26
http://blog.csdn.net/btbtd

下载:
http://files.myopera.com/btbtd/javascript/function/IEncodeURI.7z

演示:
http://files.myopera.com/btbtd/javascript/function/IEncodeURI(encodeURI).htm
http://files.myopera.com/btbtd/javascript/function/IEncodeURI(encodeURIComponent).htm

内容(IEncodeURI(encodeURI).htm):
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
<title>shawl.qiu template</title>
<style type="text/css">
/* <![CDATA[ */

/* ]]> */
</style>
<script type="text/javascript">
/*<![CDATA[*/
 if (navigator.appName=="Microsoft Internet Explorer") 
 {
  //最大化窗口
  self.moveTo(-5,-5)
  self.resizeTo(screen.availWidth +8,screen.availHeight+8)
  //这个脚本定义的宽度其实比原窗口还要大那么一点.
 }
/*]]*/
</script>
</head>
<body>
<script type="text/javascript">
/*<![CDATA[*/
 
 var Str = fGeneratingBoundStr(1127);
 var sPe = encodeURI(Str.join(""));
 var sEn = IEncodeURI(Str.join(""))
 var sDe = decodeURI(sEn)
 
 document.write("<p/>Str:  "+Str.join(""));
 document.write("<p/>sPe: "+sPe);
 document.write("<p/>sEn: "+sEn);
 document.write("<p/>sDe: "+sDe);
 document.write("<hr/>");
 
 function IEncodeURI(sStr, iOneByteStyle)
 {// shawl.qiu code, return string; Func: fUtfCharToPE
  var Len = sStr.length;
  var Ar = [];
  for(var i=0; i<Len; i++)
   Ar.push(fUtfCharToPE(sStr.charAt(i), iOneByteStyle));
  
  return Ar.join("");
 } // end function IEncodeURI(Source)

 
 /*
  iOneByteStyle meaning:
  
  Enum{-1, 0, 1}:
  -1 = escape, ignore: @+-./_*
  0 = encodeURI, ignore: ,-.#$@&*()=:/;?+'_~
  1 = encodeURIComponent, ignore: !*()-.'_~
  
  -1 选项, 在页面编码为 utf-8 时, unescape解码 会丢失数据
 */

 function fUtfCharToPE(sChar, iOneByteStyle) 
 { // shawl.qiu code, return char; Func: fStringSpace, fGetUtfCharBound 
  var iCode = sChar.charCodeAt();
  var iBound = fGetUtfCharBound(iCode);
  var sBin = iCode.toString(2);
  
  if(typeof(iOneByteStyle)=="undefined") iOneByteStyle = 0;
  
  var Ar = [];
  var iLen = sBin.length
  
  switch(iBound)
  {
   case 1:
    
    switch(iOneByteStyle)
    {
     case -1:
      if(/[^a-zA-Z0-9/@/*///+/-/.///_]/.test(sChar))
      {
       var sHex = parseInt(["0", sBin].join('')2).toString(16);
       if(sHex.length<2) sHex = "0"+sHex;
       Ar.push(sHex);
      }
      else return sChar;
      break;
      
     case 0:
      if(/[^a-zA-Z0-9/,/-/./#/$/@/&/*/(/)/=/:///;/?/+/'/_/~]/.test(sChar))
      {
       var sHex = parseInt(["0", sBin].join('')2).toString(16);
       if(sHex.length<2) sHex = "0"+sHex;
       Ar.push(sHex);
      }
      else return sChar;
      break;
      
     case 1:
      if(/[^a-zA-Z0-9/!/*/(/)/-/./'/_/~]/.test(sChar))
      {
       var sHex = parseInt(["0", sBin].join('')2).toString(16);
       if(sHex.length<2) sHex = "0"+sHex;
       Ar.push(sHex);
      }
      else return sChar;
      break
    }
    
    break;
    
   case 2:
    if(iLen<11) sBin = fStringSpace("0"11-iLen)+sBin;
    
    Ar.push(parseInt(["110", sBin.substring(05)].join('')2).toString(16));
    Ar.push(parseInt(["10", sBin.slice(5)].join('')2).toString(16));
    break;
    
   case 3:
    if(iLen<16) sBin = fStringSpace("0"16-iLen)+sBin;
    
    Ar.push(parseInt(["1110", sBin.substring(04)].join('')2).toString(16));
    Ar.push(parseInt(["10", sBin.substring(410)].join('')2).toString(16));
    Ar.push(parseInt(["10", sBin.slice(10)].join('')2).toString(16));
    break;
    
   case 4:
    break;
  }
    
  return "%"+Ar.join("%").toUpperCase();
 } // end function fUtfCharToPE(sChar, iOneByteStyle) 
  
 function fStringSpace(sStr, iTime)
 { // shawl.qiu code, return string
  var iLen=arguments.length;
  if(iLen===0)
  {
   sStr='&nbsp;'
   iTime=2;
  }
  else if(iLen===1) iTime=2;
  
  return new Array(iTime+1).join(sStr);
 } // end function fStringSpace
 
 function fGetUtfCharBound(iCharCode)
 { // shawl.qiu code, return integer
  var iLBound = iUBound = 0;
  
  //000000 - 00007F
  iLBound = 0x000000-1; iUBound = 0x00007f+1;
  if(iCharCode>iLBound&&iCharCode<iUBound) return 1;
  
  //000080 - 0007FF
  iLBound = 0x000080-1; iUBound = 0x0007FF+1;
  if(iCharCode>iLBound&&iCharCode<iUBound) return 2;
  
  //000800 - 00FFFF
  iLBound = 0x000800-1; iUBound = 0x00FFFF+1;
  if(iCharCode>iLBound&&iCharCode<iUBound) return 3;
  
  //010000 - 10FFFF
  iLBound = 0x010000-1; iUBound = 0x10FFFF+1;
  if(iCharCode>iLBound&&iCharCode<iUBound) return 4;
  
  return 0;
 } // end function fGetUtfCharBound(iCharCode)
 
 function fGeneratingBoundStr(iPadBegin, iLen)
 {
  if(!iPadBegin) iPadBegin = 0; 
  if(!iLen) iLen = 10; 
  var Ar = [];
  var iLBound = iUBound = 0;
  
  iLBound = 0+iPadBegin; iUBound = iLBound+iLen; 
  for(;iLBound<iUBound; iLBound++ )
  {
   Ar.push(String.fromCharCode(iLBound));
  }
  
  iLBound = 0x000080+iPadBegin; iUBound = iLBound+iLen;
  //IWrite.write("<br/>iLBound: "+iLBound); 
  for(;iLBound<iUBound; iLBound++ )
  {
   Ar.push(String.fromCharCode(iLBound));
  }
  
  iLBound = 0x000800+19000+iPadBegin; iUBound = iLBound+iLen;
  //IWrite.write("<br/>iLBound: "+iLBound);  
  for(;iLBound<iUBound; iLBound++ )
  {
   Ar.push(String.fromCharCode(iLBound));
  }
  
  iLBound = 0x010000+iPadBegin; iUBound = iLBound+iLen; 
  //IWrite.write("<br/>iLBound: "+iLBound);
  for(;iLBound<iUBound; iLBound++ )
  {
   Ar.push(String.fromCharCode(iLBound));
  }
  
  return Ar;
 }
/*]]*/
</script>
</body>
</html>



JavaScript url 编码转换

在Web应用中经常会发现碰到被编码的字符串,看起来很费劲,这里提供一个简单的编解码程序,可以方便地查看原码或转码: unescape,decodeURI // ...
  • hongweigg
  • hongweigg
  • 2016年07月07日 19:22
  • 1132

javascript utf-8 url 编码 之 纯算法 解码 by shawl.qiu 2007-9-24

javascript utf-8 url 编码 之 纯算法 解码 by shawl.qiu 2007-9-24说明:这个东西的用处嘛...在于, 你使用 非utf-8 编码作为页面编码, 但是接收 r...
  • btbtd
  • btbtd
  • 2007年09月24日 01:50
  • 4384

Javascript url 解码算法(utf-8) by shawl.qiu

Javascript url 解码算法(utf-8) by shawl.qiu注: 上一篇相关文章: javascript utf-8 url 编码 之 纯算法 解码 by shawl.qiu 200...
  • btbtd
  • btbtd
  • 2007年09月25日 03:01
  • 3394

C#版winform实现UrlEncode (URL编码)

分类:             c#              2012-07-19 16:36     603人阅读     评论(0)     收藏     举报     wi...
  • oMingZi12345678
  • oMingZi12345678
  • 2013年09月07日 17:10
  • 1638

url编码转换utf8的方法

目前公司有用到https传输协议web配置无法解决get乱码的方法后台重新编码,具体方法如下 private String getParmsForQueryString(String key) th...
  • qxaobn622848
  • qxaobn622848
  • 2017年04月03日 07:35
  • 226

url utf8编码互转

package com; import java.io.UnsupportedEncodingException; import java.net.URLDecoder; import java.n...
  • an74520
  • an74520
  • 2015年07月06日 11:41
  • 637

IOS把url中含有的中文字符转化为UTF8编码方法

今天做项目的时候遇到,需要把汉字放进url,例如http://lolbox.duowan.com/phone/apiCheckUser.php?action=getPlayersInfo&server...
  • litong19930321
  • litong19930321
  • 2015年03月10日 19:13
  • 4449

javaScript中URL编码转换

在使用url进行参数传递时,经常会传递一些中文名的参数或带特殊字符的参数或URL地址,在后台处理时会发生转换错误。在有些传递页面使用GB2312,而在接收页面使用UTF8,这样接收到的参数就可能会与原...
  • lcb521
  • lcb521
  • 2008年08月28日 16:24
  • 2443

[原]VC++ URL编码的解码

bool  DecodeUrl(char *Src, char  *url, int  MaxLen) {     if(NULL == url || NULL == Src)     {      ...
  • sunnysab
  • sunnysab
  • 2014年02月25日 17:49
  • 2483

URL链接中汉字乱码转UTF-8和gb2312

在使用URL向服务器提交数据的时候,如果我们提交的数据中存在汉字,就会出现下列情况 http://192.168.11.22/cgi-bin/serial.cgi?type=text&text=%C...
  • u011037149
  • u011037149
  • 2016年04月02日 18:45
  • 1224
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:Javascript url 编码算法(utf) by shawl.qiu
举报原因:
原因补充:

(最多只允许输入30个字)