用 winsock 下载网页完毕,没有问题。得到的是一个字符串,去掉header部分,也没有问题。现在剩下的是怎么在这个字符串里把chunk的界标去掉。这个字符串的形式就如下面chunk-size
CRLF
chunk-body
CRLF
chunk-size
CRLF
chunk-body
CRLF
...用了vbip.com上的一个例子函数
DecodeChunkedMessage(strMessage As String) As String
发觉问题就出在用chunked-size给出的大小去截取字符的时候,第一个chunk就不对劲,截来的字符总是包括了第2个chunk里的东西。就是说,给出的chunk-size大于chunk的实际长度。俺想了许久,不知道chunk-size到底是指字符串长度还是指字节数。试过把字符串转成字节来截取也不对劲,短了许多。俺觉得有可能是chunk-size中,中文字符算的是两个或者更多一点(当unicode时);而用mid函数去截的时候,一个中文字符就只算的一个,所以就截多了。但是试了很久都没有解决。请问解决办法?用 http://www.vbip.com/winsock/winsock_http_06_01.asp 上的例子程序
http://www.vbip.com/winsock/files/wsc_http_reader_06.zip
去访问
http://5ifood.web12.bootchina.com/food/bbs/viewforum.php?f=1
可以重现我碰到的情况。附录:解chunk函数
Private Function DecodeChunkedMessage(strMessage As String) As String
'
'This is a scheme of chunked message
'<CHUNK SIZE><CRLF><DATA CHUNK><CRLF><CHUNK SIZE><CRLF><DATA CHUNK>...<0 CHUNK SIZE>
'
Dim lngPosA As Long
Dim lngPosB As Long
Dim intOctetsToRead As Integer
Dim strTempBuffer As String
'
Const CRLF_LENGHT = 2
'
lngPosA = InStr(1, strMessage, vbCrLf)
intOctetsToRead = Val("&H" & Left(strMessage, lngPosA - 1))
'
Do Until intOctetsToRead = 0
strTempBuffer = strTempBuffer & Mid(strMessage, lngPosA + CRLF_LENGHT, intOctetsToRead)
lngPosB = lngPosA + CRLF_LENGHT + intOctetsToRead + CRLF_LENGHT
lngPosA = InStr(lngPosB, strMessage, vbCrLf)
intOctetsToRead = Val("&H" & Mid(strMessage, lngPosB, lngPosA - lngPosB))
Loop
'
DecodeChunkedMessage = strTempBuffer
'
End Function
CRLF
chunk-body
CRLF
chunk-size
CRLF
chunk-body
CRLF
...用了vbip.com上的一个例子函数
DecodeChunkedMessage(strMessage As String) As String
发觉问题就出在用chunked-size给出的大小去截取字符的时候,第一个chunk就不对劲,截来的字符总是包括了第2个chunk里的东西。就是说,给出的chunk-size大于chunk的实际长度。俺想了许久,不知道chunk-size到底是指字符串长度还是指字节数。试过把字符串转成字节来截取也不对劲,短了许多。俺觉得有可能是chunk-size中,中文字符算的是两个或者更多一点(当unicode时);而用mid函数去截的时候,一个中文字符就只算的一个,所以就截多了。但是试了很久都没有解决。请问解决办法?用 http://www.vbip.com/winsock/winsock_http_06_01.asp 上的例子程序
http://www.vbip.com/winsock/files/wsc_http_reader_06.zip
去访问
http://5ifood.web12.bootchina.com/food/bbs/viewforum.php?f=1
可以重现我碰到的情况。附录:解chunk函数
Private Function DecodeChunkedMessage(strMessage As String) As String
'
'This is a scheme of chunked message
'<CHUNK SIZE><CRLF><DATA CHUNK><CRLF><CHUNK SIZE><CRLF><DATA CHUNK>...<0 CHUNK SIZE>
'
Dim lngPosA As Long
Dim lngPosB As Long
Dim intOctetsToRead As Integer
Dim strTempBuffer As String
'
Const CRLF_LENGHT = 2
'
lngPosA = InStr(1, strMessage, vbCrLf)
intOctetsToRead = Val("&H" & Left(strMessage, lngPosA - 1))
'
Do Until intOctetsToRead = 0
strTempBuffer = strTempBuffer & Mid(strMessage, lngPosA + CRLF_LENGHT, intOctetsToRead)
lngPosB = lngPosA + CRLF_LENGHT + intOctetsToRead + CRLF_LENGHT
lngPosA = InStr(lngPosB, strMessage, vbCrLf)
intOctetsToRead = Val("&H" & Mid(strMessage, lngPosB, lngPosA - lngPosB))
Loop
'
DecodeChunkedMessage = strTempBuffer
'
End Function
解决方案 »
- 请问在日文操作系统 和日文VB6中开发的程序如何在中文环境下正常运行而没有乱码.
- 重金求购一个VB的控件!!!毕业设计!
- 那位高手可以改变datagrid控件指定行的高度?其他控件可以做到吗?
- 关于文件写入的小问题
- 关于程序的优先级,可以让自己的程序取得较高的优先级吗?各位大哥帮帮小弟了,谢谢!
- Microsoft.Jet.OLEDB.3.51"与"Microsoft.Jet.OLEDB.4.0如何判断
- 字符串处理,后续改进。
- (加分!)如何实现按下IE上的链连时运行指定的程序。就好像NetAnts一样,按下ZIP就调用NetAnts...
- 这样的效果如何实现?
- 送分题,你要不要?
- FTP(IIS虚拟目录)的烦恼问题,跪求解决方法
- 入门问题
----------------------------------------
俺觉得有可能是chunk-size中,中文字符算的是两个;而用mid函数去截的时候,一个中文字符就只算的一个,所以就截多了。
----------------------------------------
第一个chunk里有多少个中文,后面就会多截多少个字符 :)那就可以解决了。俺打算在解chunk函数里一个字符一个字符检查过去,仔细计算size。谁有更好的招请提出来。
strTempBuffer = strTempBuffer & strconv(MidB(strconv(strMessage,vbfromunicode), lngPosA + CRLF_LENGHT, intOctetsToRead),vbUnicode)2、用
Dim a() as string
a=Split(strMessage,vbcrlf)
进行分割,数组偶元素为Size,奇元素为Data
MidMbcsStoE = StrConv(MidB(StrConv(str, vbFromUnicode), start, length), vbUnicode)
End Function