读书人

表单提交中文乱码有关问题

发布时间: 2012-02-14 19:19:19 作者: rapoo

表单提交中文乱码问题
<%@ CODEPAGE=65001 %>
<% Response.Charset= "UTF-8 " %>
<HTML>
<HEAD>
<meta http-equiv= "Content-Type " content= "text/html; charset=utf-8 " />
</head>
<body>
<form action= "upload.asp " method= "post " enctype= "multipart/form-data ">
<input type= "text " name= "uname ">
<input type= "submit " name= "submit1 " value= "ok ">
</form>
</body>

upload.asp
<%@ CODEPAGE=65001 %>
<% Response.Charset= "UTF-8 " %>
<!--#include FILE= "upload.inc "-->
<HTML>
<HEAD>
<meta http-equiv= "Content-Type " content= "text/html; charset=utf-8 " />
</head>
<body>
<%
set upload=new upload_5xSoft
for each formName in upload.form
set form_str=upload.form(formName)
select case form_str.FormName
case "uname "
uname= form_str.Formvalue
end select
next
response.write uname
%>
</body>
</html>

upload.inc
就是网上常用的
<SCRIPT RUNAT=SERVER LANGUAGE=VBSCRIPT>
dim upfile_5xSoft_Stream

Class upload_5xSoft

dim Form,File

Private Sub Class_Initialize
dim iStart,iFileNameStart,iFileNameEnd,iEnd,vbEnter,iFormStart,iFormEnd,theFile
dim strDiv,mFormName,mFormValue,mFileName,mFileSize,mFilePath,iDivLen,mStr,theForm
if Request.TotalBytes <1 then Exit Sub
set Form=CreateObject( "Scripting.Dictionary ")
set File=CreateObject( "Scripting.Dictionary ")
set upfile_5xSoft_Stream=CreateObject( "Adodb.Stream ")
upfile_5xSoft_Stream.mode=3
upfile_5xSoft_Stream.type=1
upfile_5xSoft_Stream.open
upfile_5xSoft_Stream.write Request.BinaryRead(Request.TotalBytes)

vbEnter=Chr(13)&Chr(10)
iDivLen=inString(1,vbEnter)+1
strDiv=subString(1,iDivLen)
iFormStart=iDivLen
iFormEnd=inString(iformStart,strDiv)-1
while iFormStart < iFormEnd
iStart=inString(iFormStart, "name= " " ")
iEnd=inString(iStart+6, " " " ")
mFormName=subString(iStart+6,iEnd-iStart-6)
iFileNameStart=inString(iEnd+1, "filename= " " ")

if iFileNameStart> 0 and iFileNameStart <iFormEnd then
iFileNameEnd=inString(iFileNameStart+10, " " " ")
mFileName=subString(iFileNameStart+10,iFileNameEnd-iFileNameStart-10)
iStart=inString(iFileNameEnd+1,vbEnter&vbEnter)
iEnd=inString(iStart+4,vbEnter&strDiv)
if iEnd> iStart then
mFileSize=iEnd-iStart-4


else
mFileSize=0
end if

set theFile=new FileInfo
theFile.FileName=getFileName(mFileName)
theFile.FilePath=getFilePath(mFileName)
theFile.FileSize=mFileSize
theFile.FileStart=iStart+4
theFile.FormName=FormName
file.add mFormName,theFile
else
iStart=inString(iEnd+1,vbEnter&vbEnter)
iEnd=inString(iStart+4,vbEnter&strDiv)

if iEnd> iStart then
mFormValue=subString(iStart+4,iEnd-iStart-4)
else
mFormValue= " "
end if

set theForm=new FormInfo
theForm.FormName=mFormName
theForm.FormValue=mFormValue

form.Add mFormName,theForm
end if

iFormStart=iformEnd+iDivLen
iFormEnd=inString(iformStart,strDiv)-1
wend
End Sub

Private Function subString(theStart,theLen)
dim i,c,stemp
upfile_5xSoft_Stream.Position=theStart-1
stemp= " "
for i=1 to theLen
if upfile_5xSoft_Stream.EOS then Exit for
c=ascB(upfile_5xSoft_Stream.Read(1))
If c > 127 Then
if upfile_5xSoft_Stream.EOS then Exit for
stemp=stemp&Chr(AscW(ChrB(AscB(upfile_5xSoft_Stream.Read(1)))&ChrB(c)))
i=i+1
else
stemp=stemp&Chr(c)
End If
Next
subString=stemp
End function

Private Function inString(theStart,varStr)
dim i,j,bt,theLen,str
InString=0
Str=toByte(varStr)
theLen=LenB(Str)
for i=theStart to upfile_5xSoft_Stream.Size-theLen
if i> upfile_5xSoft_Stream.size then exit Function
upfile_5xSoft_Stream.Position=i-1
if AscB(upfile_5xSoft_Stream.Read(1))=AscB(midB(Str,1)) then
InString=i
for j=2 to theLen
if upfile_5xSoft_Stream.EOS then
inString=0
Exit for
end if
if AscB(upfile_5xSoft_Stream.Read(1)) <> AscB(MidB(Str,j,1)) then
InString=0
Exit For
end if
next
if InString <> 0 then Exit Function
end if


next
End Function

Private Sub Class_Terminate
form.RemoveAll
file.RemoveAll
set form=nothing
set file=nothing
upfile_5xSoft_Stream.close
set upfile_5xSoft_Stream=nothing
End Sub


Private function GetFilePath(FullPath)
If FullPath <> " " Then
GetFilePath = left(FullPath,InStrRev(FullPath, "\ "))
Else
GetFilePath = " "
End If
End function

Private function GetFileName(FullPath)
If FullPath <> " " Then
GetFileName = mid(FullPath,InStrRev(FullPath, "\ ")+1)
Else
GetFileName = " "
End If
End function

Private function toByte(Str)
dim i,iCode,c,iLow,iHigh
toByte= " "
For i=1 To Len(Str)
c=mid(Str,i,1)
iCode =Asc(c)
If iCode <0 Then iCode = iCode + 65535
If iCode> 255 Then
iLow = Left(Hex(Asc(c)),2)
iHigh =Right(Hex(Asc(c)),2)
toByte = toByte & chrB( "&H "&iLow) & chrB( "&H "&iHigh)
Else
toByte = toByte & chrB(AscB(c))
End If
Next
End function
End Class


Class FileInfo
dim FormName,FileName,FilePath,FileSize,FileStart
Private Sub Class_Initialize
FileName = " "
FilePath = " "
FileSize = 0
FileStart= 0
FormName = " "
End Sub

Public function SaveAs(FullPath)
dim dr,ErrorChar,i
SaveAs=1
if trim(fullpath)= " " or FileSize=0 or FileStart=0 or FileName= " " then exit function
if FileStart=0 or right(fullpath,1)= "/ " then exit function
set dr=CreateObject( "Adodb.Stream ")
dr.Mode=3
dr.Type=1
dr.Open
upfile_5xSoft_Stream.position=FileStart-1
upfile_5xSoft_Stream.copyto dr,FileSize


dr.SaveToFile FullPath,2
dr.Close
set dr=nothing
SaveAs=0
end function
End Class


Class FormInfo
dim FormName,FormValue
Private Sub Class_Initialize
FormName = " "
FormValue = " "
End Sub
End Class


</SCRIPT>
因为要传好几张图片,所以用的流的方式,如果不用流的方式就没问题
只要uname是中文字符,就会出错,请大家帮帮忙啊

[解决办法]
用记事本打开另存为
然后选择UTF-8编码
设置Adodb.Stream对象的Charset = "utf-8 "

[解决办法]
dim upfile_5xSoft_Stream
Class upload_5xSoft
dim Form,File,Version
Private Sub Class_Initialize
dim iStart,iFileNameStart,iFileNameEnd,iEnd,vbEnter,iFormStart,iFormEnd,theFile
dim strDiv,mFormName,mFormValue,mFileName,mFileSize,mFilePath,iDivLen,mStr,FormName
Version= " "
if Request.TotalBytes <1 then Exit Sub
set Form=CreateObject( "Scripting.Dictionary ")
set File=CreateObject( "Scripting.Dictionary ")
set upfile_5xSoft_Stream=CreateObject( "Adodb.Stream ")
upfile_5xSoft_Stream.mode=3
upfile_5xSoft_Stream.type=1
upfile_5xSoft_Stream.open
upfile_5xSoft_Stream.write Request.BinaryRead(Request.TotalBytes)

vbEnter=Chr(13)&Chr(10)
iDivLen=inString(1,vbEnter)+1
strDiv=subString(1,iDivLen)
iFormStart=iDivLen
iFormEnd=inString(iformStart,strDiv)-1
while iFormStart < iFormEnd
iStart=inString(iFormStart, "name= " " ")
iEnd=inString(iStart+6, " " " ")
mFormName=subString(iStart+6,iEnd-iStart-6)
iFileNameStart=inString(iEnd+1, "filename= " " ")
if iFileNameStart> 0 and iFileNameStart <iFormEnd then
iFileNameEnd=inString(iFileNameStart+10, " " " ")
mFileName=subString(iFileNameStart+10,iFileNameEnd-iFileNameStart-10)
iStart=inString(iFileNameEnd+1,vbEnter&vbEnter)
iEnd=inString(iStart+4,vbEnter&strDiv)
if iEnd> iStart then
mFileSize=iEnd-iStart-4
else
mFileSize=0
end if
set theFile=new FileInfo
theFile.FileName=getFileName(mFileName)
theFile.FilePath=getFilePath(mFileName)
theFile.FileSize=mFileSize
theFile.FileStart=iStart+4
theFile.FormName=FormName
file.add Lcase(mFormName),theFile
else
iStart=inString(iEnd+1,vbEnter&vbEnter)
iEnd=inString(iStart+4,vbEnter&strDiv)

if iEnd> iStart then
mFormValue=subString(iStart+4,iEnd-iStart-4)
else
mFormValue= " "
end if
form.Add Lcase(mFormName),mFormValue
end if

iFormStart=iformEnd+iDivLen
iFormEnd=inString(iformStart,strDiv)-1
wend
End Sub

Private Function subString(theStart,theLen)
dim i,c,stemp
upfile_5xSoft_Stream.Position=theStart-1
if theLen> 0 then subString=BytesToBstr(upfile_5xSoft_Stream.Read(theLen), "utf-8 ") else subString= " "
End function

Function BytesToBstr(strBody,CodeBase)
dim objStream
set objStream = Server.CreateObject( "Adodb.Stream ")


objStream.Type = 1
objStream.Mode =3
objStream.Open
objStream.Write strBody
objStream.Position = 0
objStream.Type = 2
objStream.Charset = CodeBase
BytesToBstr = objStream.ReadText
objStream.Close
set objStream = nothing
End Function

Private Function inString(theStart,varStr)
dim i,j,bt,theLen,str
InString=0
Str=toByte(varStr)
theLen=LenB(Str)
for i=theStart to upfile_5xSoft_Stream.Size-theLen
if i> upfile_5xSoft_Stream.size then exit Function
upfile_5xSoft_Stream.Position=i-1
if AscB(upfile_5xSoft_Stream.Read(1))=AscB(midB(Str,1)) then
InString=i
for j=2 to theLen
if upfile_5xSoft_Stream.EOS then
inString=0
Exit for
end if
if AscB(upfile_5xSoft_Stream.Read(1)) <> AscB(MidB(Str,j,1)) then
InString=0
Exit For
end if
next
if InString <> 0 then Exit Function
end if
next
End Function

Private Sub Class_Terminate
form.RemoveAll
file.RemoveAll
set form=nothing
set file=nothing
upfile_5xSoft_Stream.close
set upfile_5xSoft_Stream=nothing
End Sub


Private function GetFilePath(FullPath)
If FullPath <> " " Then
GetFilePath = left(FullPath,InStrRev(FullPath, "\ "))
Else
GetFilePath = " "
End If
End function

Private function GetFileName(FullPath)
If FullPath <> " " Then
GetFileName = mid(FullPath,InStrRev(FullPath, "\ ")+1)
Else
GetFileName = " "
End If
End function

Private function toByte(Str)
dim i,iCode,c,iLow,iHigh
toByte= " "
For i=1 To Len(Str)
c=mid(Str,i,1)
iCode =Asc(c)
If iCode <0 Then iCode = iCode + 65535
If iCode> 255 Then
iLow = Left(Hex(Asc(c)),2)
iHigh =Right(Hex(Asc(c)),2)
toByte = toByte & chrB( "&H "&iLow) & chrB( "&H "&iHigh)
Else
toByte = toByte & chrB(AscB(c))
End If
Next
End function

End Class


Class FileInfo
dim FormName,FileName,FilePath,FileSize,FileStart
Private Sub Class_Initialize
FileName = " "
FilePath = " "
FileSize = 0
FileStart= 0
FormName = " "
End Sub

Public function SaveAs(FullPath)
dim dr,ErrorChar,i
SaveAs=1
if trim(fullpath)= " " or FileSize=0 or FileStart=0 or FileName= " " then exit function
if FileStart=0 or right(fullpath,1)= "/ " then exit function
set dr=CreateObject( "Adodb.Stream ")
dr.Mode=3
dr.Type=1
dr.Open
upfile_5xSoft_Stream.position=FileStart-1
upfile_5xSoft_Stream.copyto dr,FileSize
dr.SaveToFile FullPath,2
dr.Close
set dr=nothing
SaveAs=0
end function
End Class

读书人网 >ASP

热点推荐