免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
最近访问板块 发新帖
查看: 5217 | 回复: 3
打印 上一主题 下一主题

[代码] URI之中的UTF8转换到GB2312的代码 [复制链接]

论坛徽章:
1
技术图书徽章
日期:2013-12-05 23:25:45
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2005-12-20 19:23 |只看该作者 |倒序浏览
[代码] URI之中的UTF8转换到GB2312的代码

   
  1. <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN">
  2. <HTML>
  3. <HEAD>
  4. <TITLE> chineseFromUtf8Url </TITLE>
  5. <META NAME="Generator" CONTENT="EditPlus">
  6. <META NAME="Author" CONTENT="">
  7. <META NAME="Keywords" CONTENT="">
  8. <META NAME="Description" CONTENT="">
  9. </HEAD>

  10. <BODY>
  11. <script type="text/javascript" language="javascript">  
  12. function  chineseFromUtf8Url(strUtf8)
  13. {  
  14.         var  bstr  =  "";  
  15.         var  nOffset  =  0; //  processing  point  on  strUtf8  
  16.          
  17.         if(  strUtf8  ===  ""  )  
  18.         {
  19.                 return  "";  
  20.         }
  21.          
  22.         strUtf8  =  strUtf8.toLowerCase();  
  23.         nOffset  =  strUtf8.indexOf("%e");  
  24.         if(  nOffset  ==  -1  )  
  25.         {
  26.                 return  strUtf8;  
  27.         }
  28.          
  29.         while(  nOffset  !=  -1  )  
  30.         {  
  31.                 bstr  +=  strUtf8.substr(0,  nOffset);  
  32.                 strUtf8  =  strUtf8.substr(nOffset,  strUtf8.length  -  nOffset);  
  33.                 if(  strUtf8  === "" ||  strUtf8.length  <  9  )  //  bad  string  
  34.                 {
  35.                         return  bstr;
  36.                 }
  37.                  
  38.                 bstr  +=  utf8CodeToChineseChar(strUtf8.substr(0,  9));  
  39.                 strUtf8  =  strUtf8.substr(9,  strUtf8.length  -  9);  
  40.                 nOffset  =  strUtf8.indexOf("%e");  
  41.         }  
  42.          
  43.         return  bstr  +  strUtf8;  
  44. }  

  45. function  unicodeFromUtf8(strUtf8)
  46. {  
  47.         var  bstr  =  "";  
  48.         var  nTotalChars  =  strUtf8.length; //  total  chars  to  be  processed.  
  49.         var  nOffset  =  0; //  processing  point  on  strUtf8  
  50.         var  nRemainingBytes  =  nTotalChars; //  how  many  bytes  left  to  be  converted  
  51.         var  nOutputPosition  =  0;  
  52.         var  iCode,  iCode1,  iCode2; //  the  value  of  the  unicode.  
  53.          
  54.         while  (nOffset  <  nTotalChars)  
  55.         {  
  56.                 iCode  =  strUtf8.charCodeAt(nOffset);  
  57.                 if  ((iCode  &  0x80)  ===  0) //  1  byte.  
  58.                 {  
  59.                         if  (  nRemainingBytes  <  1  ) //  not  enough  data  
  60.                         {
  61.                                 break;  
  62.                         }
  63.                          
  64.                         bstr  +=  String.fromCharCode(iCode  &  0x7F);  
  65.                         nOffset  ++;  
  66.                         nRemainingBytes  -=  1;  
  67.                 }  
  68.                 else  if  ((iCode  &  0xE0)  ==  0xC0) //  2  bytes  
  69.                 {  
  70.                         iCode1  = strUtf8.charCodeAt(nOffset  +  1);  
  71.                         if  (  nRemainingBytes  <  2 || //  not  enough  data  
  72.                          (iCode1  &  0xC0)  !=  0x80  ) //  invalid  pattern  
  73.                         {  
  74.                                 break;  
  75.                         }  
  76.                          
  77.                         bstr  +=  String.fromCharCode(((iCode  &  0x3F)  <<  6) |  (  iCode1  &  0x3F));  
  78.                         nOffset  +=  2;  
  79.                         nRemainingBytes  -=  2;  
  80.                 }  
  81.                 else  if  ((iCode  &  0xF0)  ==  0xE0) //  3  bytes  
  82.                 {  
  83.                         iCode1  = strUtf8.charCodeAt(nOffset  +  1);  
  84.                         iCode2  = strUtf8.charCodeAt(nOffset  +  2);  
  85.                         if  (  nRemainingBytes  <  3 || //  not  enough  data  
  86.                          (iCode1  &  0xC0)  !=  0x80 || //  invalid  pattern  
  87.                          (iCode2  &  0xC0)  !=  0x80  )  
  88.                         {  
  89.                                 break;  
  90.                         }  
  91.                          
  92.                         bstr  +=  String.fromCharCode(((iCode  &  0x0F)  <<  12) |
  93.                         ((iCode1  &  0x3F)  << 6) |  
  94.                         (iCode2  &  0x3F));  
  95.                         nOffset  +=  3;  
  96.                         nRemainingBytes  -=  3;  
  97.                 }  
  98.                 else //  4  or  more  bytes  --  unsupported  
  99.                 {       
  100.                         break;  
  101.                 }
  102.         }  
  103.          
  104.         if  (nRemainingBytes  !==  0)  
  105.         {  
  106.                 //  bad  UTF8  string.  
  107.                 return  "";  
  108.         }  
  109.          
  110.         return  bstr;  
  111. }  

  112. function  utf8CodeToChineseChar(strUtf8)  
  113. {  
  114.         var  iCode,  iCode1,  iCode2;  
  115.         iCode  =  parseInt("0x"  +  strUtf8.substr(1,  2),0);  
  116.         iCode1  =  parseInt("0x"  +  strUtf8.substr(4,  2),0);  
  117.         iCode2  =  parseInt("0x"  +  strUtf8.substr(7,  2),0);  
  118.          
  119.         return  String.fromCharCode(((iCode  &  0x0F)  <<  12) |
  120.         ((iCode1  &  0x3F)  << 6) |  
  121.         (iCode2  &  0x3F));  
  122. }  
  123. alert(chineseFromUtf8Url("%E6%B5%8B%E8%AF%95"));  
  124. </script>
  125. </BODY>
  126. </HTML>
复制代码

论坛徽章:
0
2 [报告]
发表于 2005-12-21 08:38 |只看该作者
我也贴段int -> utf8 的编码,支持utf8三个字节到6个字节的情况
这个函数几乎没用,但是可以用在不支持encodeURI的浏览器下,例如ie5

//参考文档:rfc2044  http://www.ietf.org/rfc/rfc2044.txt?number=2044
function toUtf8(code)
{
    var iByte =0;
    var i = 0;
    result = "";
    while(code > 0x7f)
    {
        iByte = code % 0x40 ;
        code = (code - iByte) / 0x40 ;
        result = "%" + ( iByte | 0x80 ).toString(16).toUpperCase() + result;
        i++;
    }
   
    prefix = [0x0,0xc0,0xe0,0xf0,0xf8,0xfc];
    if (i > prefix.length)
    {
        i=5;
    }
    result = "%" + (code | prefix ).toString(16).toUpperCase() + result ;
    return result;
}

论坛徽章:
0
3 [报告]
发表于 2005-12-21 11:58 |只看该作者
楼上都很高.
我想顺便问一下,我昨天调试一个在线支付的接口,那个接口中,可以直接发送
http://www.my.com/pay.asp?name=中国人
这样的中文,你说在浏览器中会自动编码吧,问题是那是用php的header函数直接重定向的,
不知道为什么在URI中可以不编码中文

论坛徽章:
1
技术图书徽章
日期:2013-12-05 23:25:45
4 [报告]
发表于 2005-12-22 08:59 |只看该作者
原帖由 gydoesit 于 2005-12-21 11:58 发表
楼上都很高.
我想顺便问一下,我昨天调试一个在线支付的接口,那个接口中,可以直接发送
http://www.my.com/pay.asp?name=中国人
这样的中文,你说在浏览器中会自动编码吧,问题是那是用php的header函数 ...



这个还与浏览器本身有关

用FireFox的时候他都给我自动编码了,但是IE没有
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP