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

ASP
一个ASP版的图片浏览管理器
无组件上传图片至SQLSERVER数据库
利用Jmail.Message发送邮件
用Web页面执行客户端程序
多图片上传到指定的目录并存到数据库
dreamweaverMX通用分页代码研究
下拉菜单输入,根据输入内容自动定位
中文的无组件文件上传ASP函数
一个利用adsi得到局域网信息的asp文件
根据需要动态include不同的文件
让自定义文件下载支持断点续传
用数组实现数据记录的批量录入方法
上传的进度条 实时反映上传情况
用ASP动态生成javascript的表单验证代码
ASP 编程中20个非常有用的例子
ASP生成Word文档的又一方法
用asp解析图片地址,并将其保存。
利用ASP的文件操作实现用户管理
创建 Visual Basic COM 组件在 ASP 中使用
调试 ASP 中使用的 Visual Basic COM 组件

ASP 中的 UTF-8编码


出处:互联网   整理: 软晨网(RuanChen.com)   发布: 2009-09-13   浏览: 105 ::
收藏到网摘: 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>