[代码] 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没有
|