首页 > 学技术 > 技术网文 > Web开发 > 正文

[保留] [代码] URI之中的UTF8转换到GB2312的代码


来源 chinaunix.net 酷勤网整理

[代码] URI之中的UTF8转换到GB2312的代码

    
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN">

<HTML>
<HEAD>
<TITLE> chineseFromUtf8Url </TITLE>
<META NAME="Generator" CONTENT="EditPlus">
<META NAME="Author" CONTENT="">
<META NAME="Keywords" CONTENT="">
<META NAME="Description" CONTENT="">
</HEAD>

<BODY>
<script type="text/javascript" language="javascript">  
 function  chineseFromUtf8Url(strUtf8)
{  
var  bstr  =  "";  
var  nOffset  =  0; //  processing  point  on  strUtf8  
 
if(  strUtf8  ===  ""  )  
{
return  "";  
}
 
strUtf8  =  strUtf8.toLowerCase();  
nOffset  =  strUtf8.indexOf("%e");  
if(  nOffset  ==  -1  )  
{
return  strUtf8;  
}
 
while(  nOffset  !=  -1  )  
{  
bstr  +=  strUtf8.substr(0,  nOffset);  
strUtf8  =  strUtf8.substr(nOffset,  strUtf8.length  -  nOffset);  
if(  strUtf8  === "" ||  strUtf8.length  <  9  )  //  bad  string  
{
return  bstr; 
}
 
bstr  +=  utf8CodeToChineseChar(strUtf8.substr(0,  9));  
strUtf8  =  strUtf8.substr(9,  strUtf8.length  -  9);  
nOffset  =  strUtf8.indexOf("%e");  
}  
 
return  bstr  +  strUtf8;  
}  
 
function  unicodeFromUtf8(strUtf8)
{  
var  bstr  =  "";  
var  nTotalChars  =  strUtf8.length; //  total  chars  to  be  processed.  
var  nOffset  =  0; //  processing  point  on  strUtf8  
var  nRemainingBytes  =  nTotalChars; //  how  many  bytes  left  to  be  converted  
var  nOutputPosition  =  0;  
var  iCode,  iCode1,  iCode2; //  the  value  of  the  unicode.  
 
while  (nOffset  <  nTotalChars)  
{  
iCode  =  strUtf8.charCodeAt(nOffset);  
if  ((iCode  &  0x80)  ===  0) //  1  byte.  
{  
if  (  nRemainingBytes  <  1  ) //  not  enough  data  
{
break;  
}
 
bstr  +=  String.fromCharCode(iCode  &  0x7F);  
nOffset  ++;  
nRemainingBytes  -=  1;  
}  
else  if  ((iCode  &  0xE0)  ==  0xC0) //  2  bytes  
{  
iCode1  = strUtf8.charCodeAt(nOffset  +  1);  
if  (  nRemainingBytes  <  2 || //  not  enough  data  
 (iCode1  &  0xC0)  !=  0x80  ) //  invalid  pattern  
{  
break;  
}  
 
bstr  +=  String.fromCharCode(((iCode  &  0x3F)  <<  6) |  (  iCode1  &  0x3F));  
nOffset  +=  2;  
nRemainingBytes  -=  2;  
}  
else  if  ((iCode  &  0xF0)  ==  0xE0) //  3  bytes  
{  
iCode1  = strUtf8.charCodeAt(nOffset  +  1);  
iCode2  = strUtf8.charCodeAt(nOffset  +  2);  
if  (  nRemainingBytes  <  3 || //  not  enough  data  
 (iCode1  &  0xC0)  !=  0x80 || //  invalid  pattern  
 (iCode2  &  0xC0)  !=  0x80  )  
{  
break;  
}  
 
bstr  +=  String.fromCharCode(((iCode  &  0x0F)  <<  12) |
((iCode1  &  0x3F)  << 6) |  
(iCode2  &  0x3F));  
nOffset  +=  3;  
nRemainingBytes  -=  3;  
}  
else //  4  or  more  bytes  --  unsupported  
{
break;  
}
}  
 
if  (nRemainingBytes  !==  0)  
{  
//  bad  UTF8  string.  
return  "";  
}  
 
return  bstr;  
}  
 
function  utf8CodeToChineseChar(strUtf8)  
{  
var  iCode,  iCode1,  iCode2;  
iCode  =  parseInt("0x"  +  strUtf8.substr(1,  2),0);  
iCode1  =  parseInt("0x"  +  strUtf8.substr(4,  2),0);  
iCode2  =  parseInt("0x"  +  strUtf8.substr(7,  2),0);  
 
return  String.fromCharCode(((iCode  &  0x0F)  <<  12) |
((iCode1  &  0x3F)  << 6) |  
(iCode2  &  0x3F));  
}  
alert(chineseFromUtf8Url("%E6%B5%8B%E8%AF%95"));  
</script>
</BODY>
</HTML>




 dulao5 回复于:2005-12-21 08:38:52

我也贴段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;
}


 gydoesit 回复于:2005-12-21 11:58:01

楼上都很高.
我想顺便问一下,我昨天调试一个在线支付的接口,那个接口中,可以直接发送
http://www.my.com/pay.asp?name=中国人
这样的中文,你说在浏览器中会自动编码吧,问题是那是用php的header函数直接重定向的,
不知道为什么在URI中可以不编码中文


 HonestQiao 回复于:2005-12-22 08:59:25

引用:原帖由 gydoesit 于 2005-12-21 11:58 发表
楼上都很高.
我想顺便问一下,我昨天调试一个在线支付的接口,那个接口中,可以直接发送
http://www.my.com/pay.asp?name=中国人
这样的中文,你说在浏览器中会自动编码吧,问题是那是用php的header函数 ... 




这个还与浏览器本身有关

用FireFox的时候他都给我自动编码了,但是IE没有




原文链接:http://bbs.chinaunix.net/viewthread.php?tid=672939
转载请注明作者名及原文出处



收藏本页到: