ExcelHome技术论坛

 找回密码
 免费注册

QQ登录

只需一步,快速开始

快捷登录

搜索
EH技术汇-专业的职场技能充电站 妙哉!函数段子手趣味讲函数 Excel服务器-会Excel,做管理系统 效率神器,一键搞定繁琐工作
HR薪酬管理数字化实战 Excel 2021函数公式学习大典 Excel数据透视表实战秘技 打造核心竞争力的职场宝典
让更多数据处理,一键完成 数据工作者的案头书 免费直播课集锦 ExcelHome出品 - VBA代码宝免费下载
用ChatGPT与VBA一键搞定Excel WPS表格从入门到精通 Excel VBA经典代码实践指南
查看: 5686|回复: 2

[分享] 关于网页捕获,post的数据为中文的处理

[复制链接]

TA的精华主题

TA的得分主题

发表于 2013-11-29 16:42 | 显示全部楼层 |阅读模式
例如我post会计师事务所名称的值,这个肯定是中文的。网站是:http://cmis.cicpa.org.cn/cicpa2_web/public/query0/1/00.shtml

11.jpg
先看代码: (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) =93695065001     '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)    '汉字转GBKGB2312编码,为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-8GBK的区别了,简单就是说他们的编码方式不一样,GBK基于ascode码,所以上个函数为了转换用了ASChex函数,而UTF-8基于Unicode码,UTF第一个字母是U就可以看出来。具体请看这个链接http://www.haogongju.net/art/525973,写的很容易理解。
3、有的人说可以设置WinHttp.WinHttpRequestoption2)属性值,但是这种方法我试了一下怎么也不行,不知道为什么。其中option2)中的2WinHttpRequestOption_URLCodePage的值,也就是设置URLCode的编码方式为指定的编码方式。其对应关系如下:
  Option(2)= 93695065001     'GB2312/BIG5/UTF-8
这里的设置Option(2)=65001还不等同于设置charset=UTF-8,出错的原因可能是对WinHttpRequestOption_URLCodePage理解出错了。

TA的精华主题

TA的得分主题

发表于 2013-11-29 19:07 | 显示全部楼层
http://msdn.microsoft.com/en-us/library/aa384108.aspx

WinHttpRequestOption_URLCodePage

    Sets or retrieves a VARIANT that identifies the code page for the URL string. The default value is the UTF-8 code page. The code page is used to convert the Unicode URL string, passed in the Open method, to a single-byte string representation.

TA的精华主题

TA的得分主题

发表于 2016-1-10 03:08 | 显示全部楼层
我的理解是   
'    Set X1 = CreateObject("WinHttp.WinHttpRequest.5.1")     '中文顯示不正常  需中文轉換
'    Set X1 = CreateObject("Microsoft.XMLHTTP")                  '不需中文轉換  中文顯示正常

我自己試過  提供你參考
您需要登录后才可以回帖 登录 | 免费注册

本版积分规则

手机版|关于我们|联系我们|ExcelHome

GMT+8, 2024-11-18 14:51 , Processed in 0.042109 second(s), 10 queries , Gzip On, MemCache On.

Powered by Discuz! X3.4

© 1999-2023 Wooffice Inc.

沪公网安备 31011702000001号 沪ICP备11019229号-2

本论坛言论纯属发表者个人意见,任何违反国家相关法律的言论,本站将协助国家相关部门追究发言者责任!     本站特聘法律顾问:李志群律师

快速回复 返回顶部 返回列表