当前位置: 首页 > 图文教程 > 网络编程 > ASP > UTF-8编码

ASP
构建你的网站新闻自动发布系统之三
构建你的网站新闻自动发布系统之四
如何用ASP编写网站统计系统一
如何用ASP编写网站统计系统二
如何用ASP编写网站统计系统三
如何用ASP编写网站统计系统四
ASP Error 0115的一些解决办法
ASP 3.0 新特色先睹为快(一)
ASP 3.0 新特色先睹为快(二)
ASP主件中的安全问题
一个汉字转成拼音的代码
使用w3Sockets组件实现域名查询功能
ASP中实现文件上传方法的研究
构建免受FSO组件威胁虚拟主机
用XMLHTTP做一个自己特色的Google
用asp实现的代码批量修改程序
无组件的数据库的备份与还原
用ASPJPEG组件制作图片的缩略图和加水印
解密ASP源代码
XmlHttp异步获取网站数据的例子

ASP 中的 UTF-8编码


出处:互联网   整理: 软晨网(RuanChen.com)   发布: 2009-09-13   浏览: 114 ::
收藏到网摘: n/a

参考文档:http://www.linuxforum.net/books/UTF-8-Unicode.html
代码如下:
===========================================
复制代码 代码如下:

<script language="VBScript">
'http://www.linuxforum.net/books/UTF-8-Unicode.html
Public Function UTF8EncodeChar(z)
Dim c : c=AscW(z)'取UNICODE编码
if c>0 And c<256 Then'Asc编码直接返回
UTF8EncodeChar=z
Exit Function
End If
If c<0 Then c=c + &H10000&'VBScript的Integer溢出,加上
Dim k : k=CLng(c)'备份一个编码,后面判断要用
Dim b()
Dim i : i=0
While c>&H0&'将编码按照6位一组,分组存到字节数组 b 中
ReDim Preserve b(i)
b(i)=CByte(c And &H3F&)
c=c \ &H40&
i=i+1
Wend
If UBound(b)>0 Then '如果分开的6位组不止一个,除最高一组外,全部加上二进制10000000
For i=0 To UBound(b)-1
b(i)=b(i) + &H80
Next
End If
i=UBound(b)'根据字符的UNICODE编码范围,给最高组加上前缀
If k<=CLng(&H7F&) Then
b(i) = b(i) + 0
ElseIf k<=CLng(&H7FF&) Then
b(i) = b(i) + &HC0
ElseIf k<=Clng(&HFFFF&) Then
b(i) = b(i) + &HE0
ElseIf k<=CLng(&H1FFFFF&) Then
b(i) = b(i) + &HF0
ElseIf k<=CLng(&H3FFFFFF&) Then
b(i) = b(i) + &HF8
Else
b(i) = b(i) + &HFC
End If
UTF8EncodeChar=""
For i=UBound(b) To 0 Step -1'将分组转换成URL编码
UTF8EncodeChar=UTF8EncodeChar & "%" & Right("00" & Hex(b(i)),2)
Next
Erase b
End Function
Public Function UTF8EncodeString(s)
Dim i,l,c : l=Len(s)
For i=1 To l
UTF8EncodeString=UTF8EncodeString & UTF8EncodeChar(Mid(s,i,1))
Next
End Function
MsgBox UTF8EncodeString("圪圪 eglic ")
</script>

测试方法:
http://www.google.com/search?hl=zh-CN&newwindow=1&rls=GGLG%2CGGLG%3A2006-15%2CGGLG%3Azh-CN&q=你的编码
复制代码 代码如下:

function revertUTF8(szInput)
{
var x,wch,wch1,wch2,uch="",szRet="";
for (x=0; x<szInput.length; x++)
{
if (szInput.charAt(x)=="%")
{
wch =parseInt(szInput.charAt(++x) + szInput.charAt(++x),16);
if (!wch) {break;}
if (!(wch & 0x80))
{
wch = wch;
}
else if (!(wch & 0x20))
{
x++;
wch1 = parseInt(szInput.charAt(++x) + szInput.charAt(++x),16);
wch = (wch & 0x1F)<< 6;
wch1 = wch1 & 0x3F;
wch = wch + wch1;
}
else
{
x++;
wch1 = parseInt(szInput.charAt(++x) + szInput.charAt(++x),16);
x++;
wch2 = parseInt(szInput.charAt(++x) + szInput.charAt(++x),16);
wch = (wch & 0x0F)<< 12;
wch1 = (wch1 & 0x3F)<< 6;
wch2 = (wch2 & 0x3F);
wch = wch + wch1 + wch2;
}
szRet += String.fromCharCode(wch);
}
else
{
szRet += szInput.charAt(x);
}
}
return(szRet);
}

function u2utf8($c)
{
/*for($i=0;$i<count($c);$i++)*/
$str="";
if ($c < 0x80) {
$str.=$c;
}
else if ($c < 0x800) {
$str.=chr(0xC0 | $c>>6);
$str.=chr(0x80 | $c & 0x3F);
}
else if ($c < 0x10000) {
$str.=chr(0xE0 | $c>>12);
$str.=chr(0x80 | $c>>6 & 0x3F);
$str.=chr(0x80 | $c & 0x3F);
}
else if ($c < 0x200000) {
$str.=chr(0xF0 | $c>>18);
$str.=chr(0x80 | $c>>12 & 0x3F);
$str.=chr(0x80 | $c>>6 & 0x3F);
$str.=chr(0x80 | $c & 0x3F);
}
return $str;
}


复制代码 代码如下:

'UTF8 URLEncode
Public Function URLEncodeUTF8(ByVal s)
Dim i, k
Dim sl
Dim c
Dim uni
Dim tp, h1, h2, h3
sl = Len(s)
tp = ""
k = 0
For i = 1 To sl
c = Mid(s, i, 1)
uni = AscW(c)
If uni < 0 Then uni = uni + 65536
If uni < 128 Then
tp = tp & Chr(c)
k = k + 1
ElseIf uni < 2048 Then
k = k + 2
h2 = "%" & Hex(&H80 XOr (uni And &H3F))
uni = uni \ (2^6)
h1 = "%" & Hex(&HC0 XOr (uni And &H1F))
tp = tp & h1 & h2
Else
h3 = "%" & Hex(&H80 XOr (uni And &H3F))
uni = uni \ (2^6)
h2 = "%" & Hex(&H80 XOr (uni And &H3F))
uni = uni \ (2^6)
h1 = "%" & Hex(&HE0 XOr (uni And &H0F))
tp = tp & h1 & h2 & h3
End If
Next
URLEncodeUTF8 = tp
End Function
'A-Fa-f0-9 Byte
Public Function isxdigit(c)
isxdigit = CBool((c>=48 And c<=57) Or (c>=65 And c<=70) Or (c>=97 And c<=102))
End Function
Public Function isascii(c)
isascii = CBool(c>0 And c<128)
End Function
'判断是否是UTF8字节
Public Function IsUTF8Body(ByVal u)
IsUTF8Body = CBool(u>=&H80 And u<=&HBF)
End Function
'判断有几个UTF8字节
Private Function UTF8Byte(ByVal u)
If u > &H00 And u <= &H7F Then
UTF8Byte = 1
ElseIf u >= &HC0 And u <= &HDF Then
UTF8Byte = 2
ElseIf u >= &HE0 And u <= &HEF Then
UTF8Byte = 3
ElseIf u >= &HF0 And u <= &HF7 Then
UTF8Byte = 4
ElseIf u >= &HF8 And u <= &HFB Then
UTF8Byte = 5
ElseIf u >= &HFC And u <= &HFD Then
UTF8Byte = 6
Else
UTF8Byte = 0
End If
End Function
'判断三个连续字节是不是UTF8字符
Private Function UTF8Test(ByVal u1, ByVal u2, ByVal u3)
UTF8Test = False
If CBool(u1>=&HC0 And u1<=&HFD) Then
UTF8Test = CBool(IsUTF8Body(u2) And IsUTF8Body(u3))
End If
End Function
Private Function ishex(s)
ishex = False
If Len(s)<2 Then Exit Function
If isxdigit(Asc(Mid(s, 1, 1)))=False Then Exit Function
If isxdigit(Asc(Mid(s, 2, 1)))=False Then Exit Function
ishex = True
End Function
Private Function isescape(s)
isescape = False
If Len(s)<5 Then Exit Function
If UCase(Mid(s, 1, 1)) <> "U" Then Exit Function
If isxdigit(Asc(Mid(s, 2, 1)))=False Then Exit Function
If isxdigit(Asc(Mid(s, 3, 1)))=False Then Exit Function
If isxdigit(Asc(Mid(s, 4, 1)))=False Then Exit Function
If isxdigit(Asc(Mid(s, 5, 1)))=False Then Exit Function
isescape = True
End Function
Private Function AscX(s)
AscX = CInt("&H" & Mid(s, 1, 2))
End Function
'URLDecode 完全版
'支持Server.URLEncode,UTF8 URLEncode,Escape 加密的字符串
Public Function URLDecode(s)
Dim tp
Dim i
Dim tl
Dim pp
Dim a, b, c
Dim h
URLDecode = ""
tp = Split(Replace(s, "+", " "), "%")
tl = UBound(tp)
If tl = -1 Then Exit Function
pp = tp(0)
For i = 1 To tl
If isescape(tp(i)) Then
pp = pp & ChrW("&H" & Mid(tp(i), 2, 4)) & Mid(tp(i), 6)
ElseIf ishex(tp(i))=False Then
pp = pp & tp(i)
Else
a = AscX(tp(i))
If isascii(a)=False And Len(tp(i))=2 Then
If (i+1)>tl Then Exit For
b = AscX(tp(i+1))
If (i+2)>tl Then
pp = pp & Chr(a*2^8 Or b) & Mid(tp(i+1), 3)
i = i + 1
Else
c = AscX(tp(i+2))
If UTF8Byte(a)=3 And UTF8Test(a,b,c)=True Then
h = (a And &H0F) * 2 ^12 Or (b And &H3F) * 2 ^ 6 Or (c And &H3F)
If h<0 Then h = h + 65536
pp = pp & ChrW(h) & Mid(tp(i+2), 3)
i = i + 2
Else
pp = pp & Chr(a*2^8 Or b) & Mid(tp(i+1), 3)
i = i + 1
End If
End If
ElseIf isascii(a)=False Then
pp = pp & tp(i)
Else
pp = pp & Chr(a) & Mid(tp(i), 3)
End If
End If
Next
URLDecode = pp
End Function

URLEncodeUTF8只写了多字节的加密,没有写ascii字节的,其实也没必要写这个,有个Server.URLEncode可以用,改成js版本的倒还有用武之地
js的版本,里面有个现成的函数
<script language=javascript>
alert(encodeURI("圪圪 eglic "))
</script>
看上边有人说看不懂,我来解释下吧。梅子的第一个函数是把多字节unicode编码转成我们通常正常的编码,在JS中如果偷懒,decodeURI也可实现这个功能。不过,看到这个具体是怎么实现的,感觉好爽,回家研究去啦。
复制代码 代码如下:

<script language=javascript>
function revertUTF8(szInput)
{
var x,wch,wch1,wch2,uch="",szRet="";
for (x=0; x<szInput.length; x++)
{
if (szInput.charAt(x)=="%")
{
wch =parseInt(szInput.charAt(++x) + szInput.charAt(++x),16);
if (!wch) {break;}
if (!(wch & 0x80))
{
wch = wch;
}
else if (!(wch & 0x20))
{
x++;
wch1 = parseInt(szInput.charAt(++x) + szInput.charAt(++x),16);
wch = (wch & 0x1F)<< 6;
wch1 = wch1 & 0x3F;
wch = wch + wch1;
}
else
{
x++;
wch1 = parseInt(szInput.charAt(++x) + szInput.charAt(++x),16);
x++;
wch2 = parseInt(szInput.charAt(++x) + szInput.charAt(++x),16);
wch = (wch & 0x0F)<< 12;
wch1 = (wch1 & 0x3F)<< 6;
wch2 = (wch2 & 0x3F);
wch = wch + wch1 + wch2;
}
szRet += String.fromCharCode(wch);
}
else
{
szRet += szInput.charAt(x);
}
}
return(szRet);
}
alert(revertUTF8("%E5%9C%AA%E5%9C%AA%20eglic%20 "))
alert(decodeURI("%E5%9C%AA%E5%9C%AA%20eglic%20 "))
</script>