none
在 Winform 下取得的 cookie value,內含中文,如何解碼? RRS feed

  • 問題

  • 我用網頁以 javascript 寫入 cookie

    然後用vb.net 呼叫  InternetGetCookie (wininet.dll) API 來讀取

    發現有些字符變成特殊碼,特別是中文都會這樣

    譬如

    ':' 變成 %3A

    '測試' 變成 %u6E2C%u8A66

    請問我要用什麼方式才能解碼?

    謝謝

    2007年3月25日 下午 03:09

解答

  • 需要參照 System.Web 才可使用。

    手動可以用

    arrStr = Split("%uxxx%uxxx", "%u")

    ubs = UBound(arrStr)

    Dim arrChar(ubs) As String ' 你也可以用 arrChar(ubs) As Char

    For ibs = 1 To ubs

       arrChar(ibs) = ChrW("&H" & arrStr(ibs))

    Next

    Debug.Print(Join(arrChar, ""))

    註:網頁上直接打的,程式碼未經除錯。

    2007年3月26日 上午 09:33
    版主
  • 補貼線上手冊說明:

    ms-help://MS.MSDNQTR.v80.cht/MS.MSDN.v80/MS.NETDEVFX.v20.cht/cpref12/html/T_System_Web_HttpUtility.htm

    備註

    HttpUtility 類別是由 HttpServerUtility 類別於內部使用,後者的類別之方法和屬性會透過內建 ASP.NET Server 物件來公開。此外,HttpUtility 類別也包含了編碼和解碼的公用程式方法,這些方法無法從 Server 存取。


    所以在 WinForm 下改用 HttpUtility

    2007年3月26日 下午 03:36
    版主

所有回覆

  • %u 代表用 Unicode 編碼,沒有特別註明可能是 ANSI 編碼。

    ANSI 第一碼小於 A 的,直接跟 Unicode 一起處理,大於 A 的要看完整編碼才知道。

    可以手動解,也可以引用 HttpServerUtility.UrlDecode

    2007年3月25日 下午 04:57
    版主
  • 但我在 winform 模式下

    好像沒辦法用 HttpServerUtility

    可以稍微指點一下

    手動的解法應該怎樣做嗎?

    謝謝

    2007年3月26日 上午 04:50
  • 需要參照 System.Web 才可使用。

    手動可以用

    arrStr = Split("%uxxx%uxxx", "%u")

    ubs = UBound(arrStr)

    Dim arrChar(ubs) As String ' 你也可以用 arrChar(ubs) As Char

    For ibs = 1 To ubs

       arrChar(ibs) = ChrW("&H" & arrStr(ibs))

    Next

    Debug.Print(Join(arrChar, ""))

    註:網頁上直接打的,程式碼未經除錯。

    2007年3月26日 上午 09:33
    版主
  • 1.好像沒有在webform之下,就沒有httpContext,也就無法使用 httpServerUtility

    2.原來ChrW也可以直接傳入十六進位數,我現在才知道,感謝指點, 但Microsoft.VisualBasic 命名空間下的函數,未來是否有obsolete之虞?

    3.對於cookie的編碼,%u 之後是否一定跟著4位的十六進位數, 而 % 之後(沒有u) 一定跟著2位的十六進位數

    4.我嘗試使用encoding.getChars來轉換,但是無法得到正確的字串,問題出在哪? 程式碼如下

            Dim b(1) As Byte
            b(0) = &H8A
            b(1) = &H66
            Dim c As Char() = Encoding.UTF8.GetChars(b)
            Dim s As New String(c)
            MsgBox(s)

    傳回 f   而不是 &H8A66 所代表的  '試'

    以上問題,有空的話請指點一二,謝謝!

    2007年3月26日 下午 02:45
  • 選單 專案 屬性 參考 加入 System.Web,即可將 System.Web 納入參照。

    程式碼:

    Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click

         Dim svr As New System.Web.HttpUtility

         TextBox1.Text = svr.UrlDecode("%u6E2C%u8A66")

    End Sub

    2007年3月26日 下午 03:33
    版主
  • 補貼線上手冊說明:

    ms-help://MS.MSDNQTR.v80.cht/MS.MSDN.v80/MS.NETDEVFX.v20.cht/cpref12/html/T_System_Web_HttpUtility.htm

    備註

    HttpUtility 類別是由 HttpServerUtility 類別於內部使用,後者的類別之方法和屬性會透過內建 ASP.NET Server 物件來公開。此外,HttpUtility 類別也包含了編碼和解碼的公用程式方法,這些方法無法從 Server 存取。


    所以在 WinForm 下改用 HttpUtility

    2007年3月26日 下午 03:36
    版主
  • 原來還有  HttpUtility 可用

    太感謝了

    2007年3月26日 下午 05:55