作者:阿里西西  文章来源:http://www.alixixi.com/  更新时间:2006-4-17

在asp中如何把中文处理成Unicode?

前些天在研究上传组件,在调试一项功能时,因为在VB里调试DLL太麻烦了,想把代码放到ASP调试,就遇到这问题了...

有什么办法呢?

第一时间想到的就是百度,哈哈。。又给百度做广告了。。。

先搜索了StrConv的相关功能和属性,最后找到了ADODB.Stream可把中文处理成Unicode,再参照资料,终于调试成功!!!!

下面附上本人调试的源代码,感兴趣的朋友不妨一试。
(示例中演示如何获取上传的文件名,表单名,文件大小及文件类型)

1、upload.html

<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN">
<HTML>
<HEAD>
<TITLE> 阿里西西--文件上传源码示例(获取上传的文件名,表单名,文件大小及文件类型)</TITLE>
</HEAD>
<BODY>
<form id="frmUpload" name="frmUpload" enctype="multipart/form-data" method="post" action="alixixi.asp">
  <input type="file" name="File" />
<input type="submit" value="提交">
</form>
<hr />
<center>
欢迎访问<a href="http://www.alixixi.com">阿里西西</a>WEB开发社区,www.alixixi.com
</center>
</BODY>
</HTML>

2、alixixi.asp

<%
vBinaryData = Request.BinaryRead(Request.TotalBytes)
'--------------------------------------------------------------

'把二进制字符串转换成普通字符串函数
Function Base2Str(binstr)
Dim lnglen
Dim tmpBin
Dim strC
Dim skipflag
Dim i
skipflag = 0
strC = ""
If Not IsNull(binstr) Then
lnglen = LenB(binstr)
For i = 1 To lnglen
If skipflag = 0 Then
tmpBin = MidB(binstr, i, 1)
If AscB(tmpBin) > 127 Then
strC = strC & Chr(AscW(MidB(binstr, i + 1, 1) & tmpBin))
skipflag = 1
Else
strC = strC & Chr(AscB(tmpBin))
End If
Else
skipflag = 0
End If
Next
End If
Base2Str = strC
End Function


'把普通字符串转成二进制字符串函数
Function Str2Base(varstr)
Dim str2bin
Dim varchar
Dim varasc
Dim varlow, varhigh
Dim i
str2bin = ""
For i = 1 To Len(varstr)
varchar = Mid(varstr, i, 1)
varasc = Asc(varchar)
If varasc < 0 Then
varasc = varasc + 65535
End If
If varasc > 255 Then
varlow = Left(Hex(Asc(varchar)), 2)
varhigh = Right(Hex(Asc(varchar)), 2)
str2bin = str2bin & ChrB("&H" & varlow) & ChrB("&H" & varhigh)
Else
str2bin = str2bin & ChrB(AscB(varchar))
End If
Next
Str2Base = str2bin
End Function

Dim i
Dim j
Dim Pos
Dim lngFormCount
Dim varFormType
Dim varHeaderValue
Dim varBoundary
Dim lngFormHeadStart
Dim lngFormHeadEnd
Dim lngOffSet
Dim lngFieldNameStart
Dim lngFieldNameEnd
Dim varFieldName
Dim lngFileNameStart
Dim lngFileNameEnd
Dim varFileName
Dim lngFileValueStart
Dim lngFileValueEnd
Dim lngFileValueLength
Dim varFileValue
Dim lngBoundaryEnd
Dim Just
Dim tmpFileName
Dim varFieldValue
Dim lngFieldValueStart
Dim lngFieldValueEnd
Dim lngFieldValueLength
Dim lngPosDot
Dim lngFieldLength
Dim strFileType
Dim tmpHeaderValue

Dim FieldValue
Dim FieldName
Dim FieldSize
Dim FileName
Dim FileType

varHeaderValue = vBinaryData

lngBoundaryEnd = InStrB(1, varHeaderValue, Str2Base(vbCrLf)) + 1
varBoundary = LeftB(varHeaderValue, lngBoundaryEnd)
'//把中文处理成Unicode//在VB中使用StrConv(vBinaryData, vbUnicode)//
Set tStream = Server.CreateObject ("ADODB.Stream")
Set oUpFileStream = Server.CreateObject ("ADODB.Stream")
oUpFileStream.Type = 1
oUpFileStream.Mode = 3
oUpFileStream.Open
oUpFileStream.Write vBinaryData
oUpFileStream.Position = 0
RequestBinDate = oUpFileStream.Read
iFormEnd = oUpFileStream.Size
bCrLf = ChrB (13) & ChrB (10)
sSpace = MidB (RequestBinDate,1, InStrB (1,RequestBinDate,bCrLf)-1)
iStart = LenB(sSpace)
iFormStart = iStart+2
iInfoEnd = InStrB (iFormStart,RequestBinDate,bCrLf & bCrLf)+3
tStream.Type = 1
tStream.Mode = 3
tStream.Open
oUpFileStream.Position = iFormStart
oUpFileStream.CopyTo tStream,iInfoEnd-iFormStart
tStream.Position = 0
tStream.Type = 2
tStream.CharSet = "gb2312"
sInfo = tStream.ReadText
'//把中文处理成Unicode//在VB中使用StrConv(vBinaryData, vbUnicode)//
tmpHeaderValue = sInfo
lngFormCount = Len(tmpHeaderValue) - Len(Replace(tmpHeaderValue, "; name=", Mid("; name=", 2)))
lngFieldCount = lngFormCount
lngOffSet = lngBoundaryEnd
lngFieldNameStart = InStrB(lngOffSet, varHeaderValue, Str2Base("; name=") & ChrB(34))
lngFieldNameEnd = InStrB(lngFieldNameStart + LenB(Str2Base("; name=") & ChrB(34)), varHeaderValue, ChrB(34)) + LenB(ChrB(34))
varFieldName = Base2Str(MidB(varHeaderValue, lngFieldNameStart, lngFieldNameEnd - lngFieldNameStart))
varFieldName = Replace(varFieldName, "; name=", vbNullString)
varFieldName = Replace(varFieldName, Chr(34), vbNullString)
tmpFileName = MidB(varHeaderValue, lngFieldNameEnd, 15)

lngFileNameStart = InStrB(lngFieldNameEnd, varHeaderValue, Str2Base("filename=" & Chr(34)))
lngFileNameEnd = InStrB(lngFileNameStart + LenB(Str2Base("filename=" & Chr(34))), varHeaderValue, ChrB(34))
varFileName = Base2Str(MidB(varHeaderValue, lngFileNameStart, lngFileNameEnd - lngFileNameStart))
varFileName = Replace(varFileName, "filename=", vbNullString)
varFileName = Replace(varFileName, Chr(34), vbNullString)

For Pos = Len(varFileName) To 1 Step -1
If Mid(varFileName, Pos, 1) = "\" Or Mid(varFileName, Pos, 1) = ":" Then
varFileName = Trim(Mid(varFileName, Pos + 1, Len(varFileName) - Pos))
FileName = CStr(varFileName)
Exit For
End If
Next

lngPosDot = InStrRev(CStr(varFileName), ".")
lngFieldLength = Len(CStr(varFileName))
strFileType = Right(CStr(varFileName), lngFieldLength - lngPosDot)

lngFileValueStart = InStrB(lngFileNameEnd, varHeaderValue, Str2Base(vbCrLf & vbCrLf)) + 4
lngFileValueEnd = InStrB(lngFileValueStart, varHeaderValue, LeftB(varBoundary, lngBoundaryEnd - 2)) - 2
lngFileValueLength = lngFileValueEnd - lngFileValueStart
varFileValue = MidB(varHeaderValue, lngFileValueStart, lngFileValueLength)
FieldName = CStr(varFieldName)
FieldSize = CLng(lngFileValueLength)
FieldValue = varFileValue
FileType = CStr(strFileType)
lngOffSet = lngFileValueEnd + lngBoundaryEnd - 2

Response.write "<br>文件名是:" & varFileName
Response.write "<br>表单名是:" & FieldName
Response.write "<br>大小是:" & FieldSize
Response.write "<br>文件类型是:" & FileType
'以下是文件内容,可进行相应处理,写入数据库或生成文件写入服务器
'Response.write "<br>内容是:" & FieldValue
Set tStream = Nothing
%>

为了方便网友调试,附上源码。

本站下载:ASP上传程序源码简单示例

 

 

网友评论
相关搜索
阿里西西Baidu.com搜索