2012年3月29日

URL Encode

一般系統會將URL encode後儲存, 取用時亦會相對配合decode以顯示.. 但今天碰到的需求是, 後台儲存要encode、維護顯示要decode, 這當然沒問題, 不過要做到讓前台撈出來用時不管de不de都要可以直接用, 因此研究了一下..

以字串"https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhB7m2_3i70DISomiwJHr-CiXlYUX9BJWL9l4-m-_zTAJifvZLMEu8KVeD4QwIE8_3TvI5QDaeJhPMjqYToJpjgirGQK_dOldeURjXiKOPLZQrJG39Oz53uH3NJjBFkHO6lmgQAPeH-4Pk/s144/20120329011031鬧鐘.png"為例
  1. Server.UrlEncode & HttpUtility.UrlEncode

  2. .Server.UrlEncode
    https%3a%2f%2flh4.googleusercontent.com%2f-eyLRgiEYUpk%2fT3OuH_Jlw1I%2fAAAAAAAAXw4%2fxkbNM4Fl0kc%2fs144%2f20120329011031%e9%ac%a7%e9%90%98.png
    用系統預設格式編, 不de不能用

    .HttpUtility.UrlEncode
    https%3a%2f%2flh4.googleusercontent.com%2f-eyLRgiEYUpk%2fT3OuH_Jlw1I%2fAAAAAAAAXw4%2fxkbNM4Fl0kc%2fs144%2f20120329011031%e9%ac%a7%e9%90%98.png
    預設用UTF8編, 不de不能用

  3. 常見的HttpUtility.UrlPathEncode

  4. .HttpUtility.UrlPathEncode
    https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhB7m2_3i70DISomiwJHr-CiXlYUX9BJWL9l4-m-_zTAJifvZLMEu8KVeD4QwIE8_3TvI5QDaeJhPMjqYToJpjgirGQK_dOldeURjXiKOPLZQrJG39Oz53uH3NJjBFkHO6lmgQAPeH-4Pk/s144/20120329011031%E9%AC%A7%E9%90%98.png
    只對Path編, 且正常字元不會被編掉, MSDN說 ?、&、/、space等可能會在某些瀏覽器中被截斷或毀損的文字會編掉, 不de也可用, 似乎很ok
    但#和%不會被編掉, URL裡有這些字元會掛點, #代表錨點, %是URLEncode的escape字元, (譬如C類語言的escape字元是\),
    其實+也不會被編掉, 不過URL裡"大致"沒有問題(但在query部分會代表空白字元)

  5. JS的escape

  6. .escape
    https%3Ahttps://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhB7m2_3i70DISomiwJHr-CiXlYUX9BJWL9l4-m-_zTAJifvZLMEu8KVeD4QwIE8_3TvI5QDaeJhPMjqYToJpjgirGQK_dOldeURjXiKOPLZQrJG39Oz53uH3NJjBFkHO6lmgQAPeH-4Pk/s144/20120329011031%25u9B27%25u9418.png
    不曉得哪發明來的, W3C說 Note: The escape() function should not be used to encode URIs. Use the encodeURI() function instead.

  7. Uri.EscapeUriString & JS encodeURI

  8. .Uri.EscapeUriString
    https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhB7m2_3i70DISomiwJHr-CiXlYUX9BJWL9l4-m-_zTAJifvZLMEu8KVeD4QwIE8_3TvI5QDaeJhPMjqYToJpjgirGQK_dOldeURjXiKOPLZQrJG39Oz53uH3NJjBFkHO6lmgQAPeH-4Pk/s144/20120329011031%E9%AC%A7%E9%90%98.png

    .encodeURI (de回來用decodeURI)
    https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhB7m2_3i70DISomiwJHr-CiXlYUX9BJWL9l4-m-_zTAJifvZLMEu8KVeD4QwIE8_3TvI5QDaeJhPMjqYToJpjgirGQK_dOldeURjXiKOPLZQrJG39Oz53uH3NJjBFkHO6lmgQAPeH-4Pk/s144/20120329011031%E9%AC%A7%E9%90%98.png
    W3C說 This function encodes special characters, except: , / ? : @ & = + $ # (Use encodeURIComponent() to encode these characters).
    Tip: Use the decodeURI() function to decode an encoded URI.

    兩者可配合, 不de也可用, 只對Path編

  9. Uri.EscapeDataString & JS encodeURIComponent

  10. .Uri.EscapeDataString
    https%3A%2F%2Flh4.googleusercontent.com%2F-eyLRgiEYUpk%2FT3OuH_Jlw1I%2FAAAAAAAAXw4%2FxkbNM4Fl0kc%2Fs144%2F20120329011031%E9%AC%A7%E9%90%98.png

    .encodeURIComponent (de回來用decodeURIComponent)
    https%3A%2F%2Flh4.googleusercontent.com%2F-eyLRgiEYUpk%2FT3OuH_Jlw1I%2FAAAAAAAAXw4%2FxkbNM4Fl0kc%2Fs144%2F20120329011031%E9%AC%A7%E9%90%98.png
    W3C說 This function encodes special characters. In addition, it encodes the following characters: , / ? : @ & = + $ #
    Tip: Use the decodeURIComponent() function to decode an encoded URI component.

    兩者可配合, 不de不能用

reference:
http://www.shaoqun.com/a/ASP.NET%E4%B8%ADUrlEncode%E5%BA%94%E8%AF%A5%E7%94%A8Uri.EscapeDataString%28%29.aspx
http://www.cnblogs.com/artwl/archive/2012/03/07/2382848.html

沒有留言: