問題
如上圖所示,阿里雲的PercentEncode 轉換! 為 %21
PercentEncode 源碼為:
package com.aliyuncs.auth; import java.io.UnsupportedEncodingException; import java.net.URLEncoder; public class AcsURLEncoder { public final static String URL_ENCODING = "UTF-8"; public static String encode(String value) throws UnsupportedEncodingException { return URLEncoder.encode(value, URL_ENCODING); } public static String percentEncode(String value) throws UnsupportedEncodingException{ return value != null ? URLEncoder.encode(value, URL_ENCODING).replace("+", "%20") .replace("*", "%2A").replace("%7E", "~") : null; } }
查找問題
第三方工具
上圖表明的確沒有轉義!(感嘆號)
C#中的URLEncode轉義
C#中URLEncode,C#中有兩種URLEncode,WebUlitity 和 HttpUlitity
[TestFixture] public class TestUlities { [Test] public void Test() { var url = @"http://img05.taobaocdn.com/bao/uploaded/TB2BVKlfFXXXXarXXXXXXXXXXXX_!!111708970-0-saturn_solar.jpg"; var webUrlEncode = WebUtility.UrlEncode(url); var httpUrlEncode = HttpUtility.UrlEncode(url); } }
發現都沒有轉義!(感嘆號)
WHY
In general URIs as defined by RFC 3986 (see Section 2: Characters) may contain any of the following characters:
ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789-._~:/?#[]@!$&'()*+,;=`.
Any other character needs to be encoded with the percent-encoding (
%
hh
). Each part of the URI has further restrictions about what characters need to be represented by an percent-encoded word.
解決
使用以下代碼URLEncode 來進行URLEncode
public class AliUrlEncodeHelper { public static string Encode(string str) { return !string.IsNullOrEmpty(str) ? WebUtility.UrlEncode(str).Replace("+", "%20") .Replace("*", "%2A") .Replace("%7E", "~") .Replace("!", "%21") .Replace("'","%27") .Replace("(", "%28") .Replace(")", "%29") :str; } }
結論
阿里的URLEncode 有點過時,或者說自定義的,需要我們特殊處理。
附:阿里簽名規則
參考
Which characters make a URL invalid?
Les codes hexas et unicode des caractères usuels, par Nicolas Hoffmann