爲測試用Adodb.Stream中文轉碼,寫了個函數
Function Encode()
dim ax,stm
ax=chrb(233)&chrb(152)&chrb(191)
Set stm = server.CreateObject("Adodb.Stream")
stm.mode = 3
stm.Type = 1
stm.Open
stm.Write ax
stm.Position = 0
stm.Type = 2
stm.charset = "utf-8"
Encode = stm.readtext
stm.close
Set stm=nothing
End Function
結果:ADODB.Stream 錯誤 '800a0bb9' 參數類型不正確,或不在可以接受的範圍之內,或與其他參數衝突。
原來是變量類型錯誤,輸入的變量必須是單字節數組,上面的 AX成了字符串了,故出錯。
excel裏面簡單更改後正確:
Sub Encode()
Dim ax() As Byte, stm, Encodex
ReDim ax(2)
ax(0) = 233
ax(1) = 152
ax(2) = 191
Set stm = CreateObject("Adodb.Stream")
stm.Mode = 3
stm.Type = 1
stm.Open
'//stm.LoadFromFile filePath
stm.Write ax
stm.Position = 0
stm.Type = 2
stm.Charset = "utf-8"
Encodex = stm.ReadText
stm.Close
Set stm = Nothing
End Sub
另外一段會造成這個錯誤的代碼如下:
FormSize=Request.TotalBytes
FormData=Request.BinaryRead(FormSize)
CLStr=ChrB(13)&ChrB(10)
DataStart=InStrB(FormData,CLStr&CLStr)+4 '4是兩對回車換行符的長度
DivStr=LeftB(FormData,InStrB(FormData,CLStr)-1)
DataSize=InStrB(DataStart+1,FormData,DivStr)-DataStart-2
FormData=MidB(FormData,DataStart,DataSize) 'midb這個處理出來的二進制流串根本不能用於ADODB.Stream .Write提交
set str=server.CreateObject("ADODB.Stream") 'str爲源數據流
str.Mode=3 '設置打開模式,3爲可讀可寫
str.Type=1 '設置數據類型,1爲二進制數據
str.Open
str.Write FormData '這裏必然報錯
上面的這個代碼想當然的使用MIDB來處理二進制流,殊不知,MIDB返回的已經不再是二進制流,而是變成了單個長字符串,所以根本不能這樣用,被這段代碼害了一個晚上。。。。。
ADODB.Stream .Write '的輸入參數在ASP裏面正確的做法是 .copyto write_stream,second_enter-first_enter-3, 利用 .copyto直接截取字節流