我怎么能有相同的编码字符串?

时间:2012-01-12 15:09:23

标签: c# .net ruby oauth urlencode

我使用C#编写了“Central Time(US& Canada)”。

timeZone =Server.UrlEncode ("Central Time (US & Canada)");

我希望使用与ruby相同的编码字符串。

Ruby UrlEncode ==> Central%252BTime%252B%2528US%252B%252526%252BCanada%2529
.Net UrlEncode两次=> Central%252bTime%252b%28US%252b%252526%252bCanada%29
.Net UrlEncode ==> Central%2BTime%2B%28US%2B%2526%2BCanada%29

如何捕获相同的编码字符串?

感谢。

4 个答案:

答案 0 :(得分:2)

http://oauth.net/core/1.0/#encoding_parameters说 - 基本上,结果必须Central%20Time%20%28US%20%26%20Canada%29。问题中的所有示例均未与此匹配,并且所有示例都显示多个编码的症状(第一个编码步骤为Central+Time+(US+%26+Canada))。停止调用Server.UrlEncode - 如果需要,编写一个自定义函数,迭代字符并正确遵循规范。对于C#,你会使用for循环和stringbuilder - 我不知道在ruby中执行此操作的有效方法是什么。 (看起来tadman的答案在ruby中给出了正确的结果,但.NET函数[Uri.EscapeDataString最接近]不够灵活,无法指定如何处理括号,因此您必须自己编写。 )

答案 1 :(得分:1)

我解决了这个问题。

像这样:

 public string Encode(string text)
    {

        byte[] myASCIIBytes = UnicodeEncoding.Unicode.GetBytes(text);

        byte[] myUTF8Bytes = Encoding.Convert( Encoding.Unicode,UTF8Encoding.UTF8, myASCIIBytes);

        return Encoding.Default.GetString(myUTF8Bytes);
    }

protected string UrlEncodePost(string value)
    {
        StringBuilder result = new StringBuilder();

        foreach (char symbol in value)
        {
            if (unreservedChars.IndexOf(symbol) != -1)
            {
                result.Append(symbol);
            }
            else
            {
                result.Append('%' + String.Format("{0:X2}", (int)symbol));
            }
        }

        return result.ToString();
    }



   timeZone = UrlEncodePost(Encode("Central Time (US & Canada)"));

我在OAuthBase.cs文件中更新了ComputeHash函数。 =>

 private string ComputeHash(HashAlgorithm hashAlgorithm, string data) {
        if (hashAlgorithm == null) {
            throw new ArgumentNullException("hashAlgorithm");
        }

        if (string.IsNullOrEmpty(data)) {
            throw new ArgumentNullException("data");
        }

        byte[] myBytes = UnicodeEncoding.Unicode.GetBytes(data);

        byte[] myUTF8Bytes = Encoding.Convert(Encoding.Unicode, UTF8Encoding.UTF8, myBytes);

        byte[] hashBytes = hashAlgorithm.ComputeHash(myUTF8Bytes);

        return Convert.ToBase64String(hashBytes);

    }

答案 2 :(得分:0)

如果你愿意,Ruby可以在没有括号的情况下编码它。你只需要好好问一下。在这种情况下,该选项指定必须编码所有“非单词”字符(正则表达式表示法):

 URI.encode("Central Time (US & Canada)", /\W/)
 # => "Central%20Time%20%28US%20%26%20Canada%29"

我不确定为什么.Net版本会将空间编码为+,然后URI会对其进行编码,因为这似乎已经破坏了:

 URI.decode('Central%2BTime%2B%28US%2B%2526%2BCanada%29')
 # => "Central+Time+(US+%26+Canada)"

答案 3 :(得分:0)

编辑(删除了之前的错误答案)

希望工作正常。

        string s = "Central Time (US & Canada)";


        s = System.Web.HttpUtility.UrlEncode(s,System.Text.Encoding.ASCII);
        s = System.Web.HttpUtility.UrlEncode(s, System.Text.Encoding.ASCII);
        s = s.Replace("-","%2D");
        s = s.Replace("_","%5F");
        s = s.Replace("!","%21");
        s = s.Replace("*","%2A");
        s = s.Replace("(","%28");
        s = s.Replace(")","%29");
        s = System.Web.HttpUtility.UrlEncode(s, System.Text.Encoding.ASCII);

        if (s.ToLower() == "Central%252BTime%252B%2528US%252B%252526%252BCanada%2529".ToLower())
        {
            System.Diagnostics.Debug.WriteLine("Success");
        }