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

C# 我怎么能有相同的编码字符串?,c#,.net,ruby,oauth,urlencode,C#,.net,Ruby,Oauth,Urlencode,我用C#对“中央时间(美国和加拿大)”进行编码 我想让ruby使用相同的编码字符串 Ruby UrlEncode==>中心%252B时间%252B%2528US%252B%252526%252B加拿大%2529 .Net UrlEncode两次=>中心%252b时间%252b%28US%252b%252526%252b加拿大%29 .Net UrlEncode==>Central%2BTime%2B%28US%2B%2526%2BCanada%29 如何捕获相同的编码字符串 谢谢。如果您愿意,R

我用C#对“中央时间(美国和加拿大)”进行编码

我想让ruby使用相同的编码字符串

Ruby UrlEncode==>
中心%252B时间%252B%2528US%252B%252526%252B加拿大%2529

.Net UrlEncode两次=>
中心%252b时间%252b%28US%252b%252526%252b加拿大%29

.Net UrlEncode==>
Central%2BTime%2B%28US%2B%2526%2BCanada%29

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


谢谢。

如果您愿意,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)"
编辑(删除以前的错误答案)

希望它能很好地工作

        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");
        }
从本质上讲,结果必须是
Central%20Time%20%28US%20%26%20Canada%29
。问题中没有一个示例与此匹配,并且所有示例都显示了多重编码的症状(第一个编码步骤是
Central+Time+(美国+%26+加拿大)
)。停止调用Server.UrlEncode,如果需要,编写一个自定义函数,该函数将迭代字符并正确遵循规范。对于C#来说,您将使用For循环和stringbuilder——我不知道在ruby中实现这一点的有效方法是什么。(看起来tadman的答案在ruby中给出了正确的结果,但是.NET函数[Uri.EscapeDataString是最接近的]不够灵活,无法指定如何处理括号,因此您必须自己编写。)

我解决了这个问题

像这样:

 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函数。 =>


看起来Ruby输出也被编码了两次。编码%2B将导致%252b。你确定你的Ruby输出是正确的吗?你是否希望保存类似时区的内容?你是否也查看了UTC。Net有一个时区类请查看MSDN参考链接,从那里我确定你可以使用基于时区的URL编码。。其实我不是。我将编码的字符串发送到服务器,并在其上运行ruby代码。但是我必须有相同的编码字符串,因为我使用oAuth,并且oAuth签名对于授权应该是相同的。对于用C#捕获相同的编码字符串有什么建议吗?@DJKRAZE我对时区没有任何问题。因为它可以是包含&%()个字符的其他字符串。@Digbyswift,如果ruby编码两次,为什么它与“.Net UrlEncode Tworth=>Central%252b时间%252b%28US%252b%252526%252b数据%29不一样?“+是因为历史原因而存在的-原始web查询格式[用于页面]使用
?a+b%20c+d
进行查询,我们现在将其写成
a“bc”d
。最终,这被简化为简单地使用+[而不是%2B]作为空格。在查询参数中,
+
应该被解释为空格字符,但是
%2B
应该被解释为文字加字符,否则就无法在参数中提供
+
。据我所知,.Net版本有问题。看起来“.Net UrlEncode”实际上被编码了两次,“.Net UrlEncode Twourd”实际上被编码了三次-请注意后者中的
%252526
。使用cgi escape:cgi::escape(“中央时间(美国和加拿大)”=>“中央+时间+%28US+%26+加拿大%29”
Central+Time++%28US++%26+Canada%29
Central%20Time%20%28US%20%26%20Canada%29
是等效的,前者使用
++
表示空间,后者使用
%20
。最后一个是非常懒惰的转义,括号保留在中。如果您编写urlencode triple,您可以看到%252526。我不能将你的代码应用到我的代码中。因为有很多文本,这将是不好的。好的,仔细看一下。根据需要,唯一不需要编码的字符是-!!*'()因此,我已将示例代码更改为匹配。可以,但由于性能原因,我无法使用替换函数。谢谢
 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)"));
 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);

    }