[新手上路]批处理新手入门导读[视频教程]批处理基础视频教程[视频教程]VBS基础视频教程[批处理精品]批处理版照片整理器
[批处理精品]纯批处理备份&还原驱动[批处理精品]CMD命令50条不能说的秘密[在线下载]第三方命令行工具[在线帮助]VBScript / JScript 在线参考
返回列表 发帖

[问题求助] 获取到的请求头 Content-Disposition 乱码如何解决?

  1. Set objWinHttp = CreateObject("WinHttp.WinHttpRequest.5.1")
  2. objWinHttp.Open "HEAD", "https://www.nyaa.se/?page=download&tid=613616"
  3. objWinHttp.Send
  4. MsgBox objWinHttp.GetResponseHeader("Content-Disposition")
复制代码
以上代码显示的结果是:
inline; filename="娴疯醇鐜?65.rar.torrent"


bat 的话可以用 iconv 转码,vbs 要如何解决呢?

本帖最后由 tmplinshi 于 2016-11-29 10:17 编辑

谢谢二位!

显示的结果是 "海贼�?65.rar.torrent",正确的应该是 "海贼王765.rar.torrent"。
不知道是不是因为 objWinHttp.GetResponseHeader("Content-Disposition") 返回的字符本身就丢失了数据。

TOP

回复 5# 523066680


    多谢。你这个方法好像是从文件内容中读取的文件名。如果指向的不是种子文件,而是其他的文件类型比如 exe 就无效了。

TOP

本帖最后由 tmplinshi 于 2016-11-29 11:50 编辑

@523066680 非常感谢!不过我仍然希望有 VBS 的解决方案。其实我是想在 AHK 中处理这个问题,而 VBS 代码可以直接在 AHK 中使用。

TOP

D:\Desktop>cscript /nologo test.vbs
inline; filename="娴疯醇鐜?65.rar.torrent"

D:\Desktop>cscript /nologo test.vbs | xd
000000  69 6e 6c 69 6e 65 3b 20 66 69 6c 65 6e 61 6d 65    inline; filename
000010  3d 22 e6 b5 b7 e8 b4 bc e7 8e 3f 36 35 2e 72 61    ="........?65.ra
000020  72 2e 74 6f 72 72 65 6e 74 22 0d 0a                r.torrent"..


TOP

curl 返回的是这样的:

TOP

看来对于 VBS 是无解了。谢谢各位帮忙。

TOP

本帖最后由 tmplinshi 于 2017-1-3 23:30 编辑

HttpQueryInfo function 文章中有这么一段话:
Note The HttpQueryInfoA function represents headers as ISO-8859-1 characters not ANSI characters. The HttpQueryInfoW function represents headers as ISO-8859-1 characters converted to UTF-16LE characters. As a result, it is never safe to use the HttpQueryInfoW function when the headers can contain non-ASCII characters. Instead, an application can use the MultiByteToWideChar and WideCharToMultiByte functions with a Codepage parameter set to 28591 to map between ANSI characters and UTF-16LE characters.


估计 "WinHttp.WinHttpRequest.5.1" 对象用的就是 HttpQueryInfoW 函数吧。
如果使用 HttpQueryInfoA 则可以正确转换编码。AHK 代码示例:

  1. MsgBox, % GetAllResponseHeaders("https://www.nyaa.se/?page=download&tid=613616")
  2. GetAllResponseHeaders(Url, RequestHeaders := "", NO_AUTO_REDIRECT := false, NO_COOKIES := false) {
  3. static INTERNET_OPEN_TYPE_DIRECT := 1
  4.      , INTERNET_SERVICE_HTTP := 3
  5.      , HTTP_QUERY_RAW_HEADERS_CRLF := 22
  6.      , CP_UTF8 := 65001
  7.      , Default_UserAgent := "Mozilla/5.0 (Windows NT 6.1; WOW64; Trident/7.0; rv:11.0) like Gecko"
  8. hModule := DllCall("LoadLibrary", "str", "wininet.dll", "ptr")
  9. if !hInternet := DllCall("wininet\InternetOpen", "ptr", &Default_UserAgent, "uint", INTERNET_OPEN_TYPE_DIRECT
  10. , "str", "", "str", "", "uint", 0)
  11. return
  12. ; -----------------------------------------------------------------------------------
  13. if !InStr(Url, "://")
  14. Url := "http://" Trim(Url)
  15. regex := "(?P<protocol>\w+)://((?P<user>\w+):(?P<pwd>\w+)@)?(?P<host>[\w.]+)(:(?P<port>\d+))?(?P<path>.*)"
  16. RegExMatch(Url, regex, v_)
  17. if (v_protocol = "ftp") {
  18. throw, "ftp is not supported."
  19. }
  20. if (v_port = "") {
  21. v_port := (v_protocol = "https") ? 443 : 80
  22. }
  23. ; -----------------------------------------------------------------------------------
  24. Internet_Flags := 0
  25.                 | 0x400000   ; INTERNET_FLAG_KEEP_CONNECTION
  26.                 | 0x80000000 ; INTERNET_FLAG_RELOAD
  27.                 | 0x20000000 ; INTERNET_FLAG_NO_CACHE_WRITE
  28. if (v_protocol = "https") {
  29. Internet_Flags |= 0x1000  ; INTERNET_FLAG_IGNORE_CERT_CN_INVALID
  30.                | 0x2000   ; INTERNET_FLAG_IGNORE_CERT_DATE_INVALID
  31.                | 0x800000 ; INTERNET_FLAG_SECURE ; Technically, this is redundant for https
  32. }
  33. if NO_AUTO_REDIRECT
  34. Internet_Flags |= 0x00200000 ; INTERNET_FLAG_NO_AUTO_REDIRECT
  35. if NO_COOKIES
  36. Internet_Flags |= 0x00080000 ; INTERNET_FLAG_NO_COOKIES
  37. ; -----------------------------------------------------------------------------------
  38. hConnect := DllCall("wininet\InternetConnect", "ptr", hInternet, "ptr", &v_host, "uint", v_port
  39. , "ptr", &v_user, "ptr", &v_pwd, "uint", INTERNET_SERVICE_HTTP, "uint", Internet_Flags, "uint", 0, "ptr")
  40. hRequest := DllCall("wininet\HttpOpenRequest", "ptr", hConnect, "str", "HEAD", "ptr", &v_path
  41. , "str", "HTTP/1.1", "ptr", 0, "ptr", 0, "uint", Internet_Flags, "ptr", 0, "ptr")
  42. nRet := DllCall("wininet\HttpSendRequest", "ptr", hRequest, "ptr", &RequestHeaders, "int", -1
  43. , "ptr", 0, "uint", 0)
  44. Loop, 2 {
  45. DllCall("wininet\HttpQueryInfoA", "ptr", hRequest, "uint", HTTP_QUERY_RAW_HEADERS_CRLF
  46. , "ptr", &pBuffer, "uint*", bufferLen, "uint", 0)
  47. if (A_Index = 1)
  48. VarSetCapacity(pBuffer, bufferLen, 0)
  49. }
  50. ; -----------------------------------------------------------------------------------
  51. output := StrGet(&pBuffer, "UTF-8")
  52. ; -----------------------------------------------------------------------------------
  53. DllCall("wininet\InternetCloseHandle", "ptr", hRequest)
  54. DllCall("wininet\InternetCloseHandle", "ptr", hConnect)
  55. DllCall("wininet\InternetCloseHandle", "ptr", hInternet)
  56. DllCall("FreeLibrary", "Ptr", hModule)
  57. return output
  58. }
复制代码

TOP

返回列表