例如我post会计师事务所名称的值,这个肯定是中文的。网站是:http://cmis.cicpa.org.cn/cicpa2_web/public/query0/1/00.shtml
先看代码: (send数据中的“offName=”就是我需要post的中文数据) Private Sub Form_Load() Dimxml As New WinHttp.WinHttpRequest ‘需要引用winhttp,你也可以createobject Dimres As String Dimname1 as string name1 = "韶关" With xml .Open "post","http://cmis.cicpa.org.cn/cicpa2_web/OfficeIndexAction.do", False .SetRequestHeader "Referer","http://cmis.cicpa.org.cn/cicpa2_web/public/query2/1/00.shtml" .SetRequestHeader "Content-Type","application/x-www-form-urlencoded;charset=UTF-8" .SetRequestHeader "Host", "cmis.cicpa.org.cn" ' .Option(2) = 65001 'Option(2) =936或950或65001 'GB2312/BIG5/UTF-8 xml.Send"method=indexQuery&queryType=1&isStock=00&ascGuid=00&offName="& name1 res = .ResponseText End With IfInStr(1, res, "韶关") <> 0 Then MsgBox "yes" EndIf Set xml = Nothing End Sub 上面是一个典型的post数据查询,其网页是gbk编码的(查看源代码可知道),这时name1这个post数据就要ULR转码,原则上转为GBK格式的,这里有几种方法: 1、 设置请求头的charset格式,例如如下: SetRequestHeader "Content-Type","application/x-www-form-urlencoded;charset=UTF-8"这一句就是告诉服务器我的数据是UTF-8编码的,你自己看着办吧,一般服务器都能够识别的。而实际上你post的数据会自动转为UTF-8编码方式,所以你不要再把name1的汉字转为UTF-8格式,这种方法最简单。 另外,如果你把charset=UTF-8改为charset=GBK或者其他不是默认的编码,这个方法就不行了,可能就是因为你实际上post的是默认的UTF-8格式,而你却告诉服务器编码是GBK,这当然会乱码。这种方法是强制转换为UTF-8的格式而不是按照网页要求的GBK格式,最后你要告诉服务器你这样做了;其实你如果用浏览器查询的话,浏览器会自动判断格式,转为服务器要求的GBK格式。 2、先将你的需要post的汉字转为GBK格式的字符串(例如%B1%B1),然后赋值给name1 post出去(实际上你用fiddler捕获就会发现post数据就是这样的格式)。这就需要一个函数去转换,这里网上找到一个函数: Function URLEncodePlus(strURL) '汉字转GBK、GB2312编码,为ulrcode ;strURL即为要转换的中文字符 'ANSI编码,空格处理成+号 Dim i Dim tempStr For i = 1 To Len(strURL) If Asc(Mid(strURL, i, 1)) < 0 Then tempStr = "%" & Right(CStr(Hex(Asc(Mid(strURL, i, 1)))),2) tempStr = "%" & Left(CStr(Hex(Asc(Mid(strURL, i, 1)))),Len(CStr(Hex(Asc(Mid(strURL, i, 1))))) - 2) & tempStr URLEncodePlus = URLEncodePlus & tempStr ElseIf (Asc(Mid(strURL, i, 1)) >= 65 And Asc(Mid(strURL, i, 1)) <=90) Or _ (Asc(Mid(strURL, i, 1)) >= 97 And Asc(Mid(strURL, i, 1)) <= 122)Or _ (Asc(Mid(strURL, i, 1)) >= 48 And Asc(Mid(strURL, i, 1)) <= 57)Then URLEncodePlus = URLEncodePlus & Mid(strURL, i, 1) Else tempStr = Mid(strURL, i, 1) Select Case tempStr Case ".", "-", "~", "_" '如果发现网站有其他不需要编码的字符,放在这里 URLEncodePlus = URLEncodePlus& tempStr Case " " URLEncodePlus = URLEncodePlus& "+" Case Else URLEncodePlus = URLEncodePlus& "%" & Hex(Asc(tempStr)) End Select End If Next End Function 上面的函数就是将中文字符转为GBK格式的ulrcode(就是如%B1%B1格式)。需要注意的是这个函数不是万能的,假如人家网页是UTF-8格式的(也就是说post的数据是UTF-8格式的),你post的数据就会乱码,返回也会出错。这就要理解UTF-8和GBK的区别了,简单就是说他们的编码方式不一样,GBK基于ascode码,所以上个函数为了转换用了ASC,hex函数,而UTF-8基于Unicode码,UTF第一个字母是U就可以看出来。具体请看这个链接http://www.haogongju.net/art/525973,写的很容易理解。 3、有的人说可以设置WinHttp.WinHttpRequest的option(2)属性值,但是这种方法我试了一下怎么也不行,不知道为什么。其中option(2)中的2是WinHttpRequestOption_URLCodePage的值,也就是设置URLCode的编码方式为指定的编码方式。其对应关系如下: Option(2)= 936或950或65001 'GB2312/BIG5/UTF-8 这里的设置Option(2)=65001还不等同于设置charset=UTF-8,出错的原因可能是对WinHttpRequestOption_URLCodePage理解出错了。 |