用 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

解决方案 »

  1.   

    刚才俺用笨办法,直接数了一下,果然是的:
    ----------------------------------------
    俺觉得有可能是chunk-size中,中文字符算的是两个;而用mid函数去截的时候,一个中文字符就只算的一个,所以就截多了。
    ----------------------------------------
    第一个chunk里有多少个中文,后面就会多截多少个字符 :)那就可以解决了。俺打算在解chunk函数里一个字符一个字符检查过去,仔细计算size。谁有更好的招请提出来。
      

  2.   

    ChrB 函数能否扎进来用一用呢?
      

  3.   

    哦,俺数错了,去掉了双字节的还是多,size 可能是UTF-8长度。有些汉字不止两个字节的说
      

  4.   

    两个办法:1、用下面办法,先转换,取长度,再还原
    strTempBuffer = strTempBuffer & strconv(MidB(strconv(strMessage,vbfromunicode), lngPosA + CRLF_LENGHT, intOctetsToRead),vbUnicode)2、用
    Dim a() as string
    a=Split(strMessage,vbcrlf)
    进行分割,数组偶元素为Size,奇元素为Data
      

  5.   

    http://community.csdn.net/Expert/topic/3635/3635192.xml?temp=.7378504
      

  6.   

    Function MidMbcsStoE(str As String, start As Integer, length As Integer) As String
       MidMbcsStoE = StrConv(MidB(StrConv(str, vbFromUnicode), start, length), vbUnicode)
    End Function