Как я могу иметь такую ​​же закодированную строку? - PullRequest
2 голосов
/ 12 января 2012

Я кодировал «Центральное время (США и Канада)» с помощью C #.

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 ]

2 голосов
/ 13 января 2012

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.(Похоже, что ответ Тэдмана дает правильный результат в ruby, но функции .NET [Uri.EscapeDataString ближе всего] недостаточно гибкие, чтобы указывать, как обрабатывать скобки, поэтому вам придется написать свои собственные.)

1 голос
/ 16 января 2012

Я решил проблему.

следующим образом:

 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)"));

И я обновил функцию ComputeHash в файле OAuthBase.cs.=>

 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);

    }
0 голосов
/ 12 января 2012

РЕДАКТИРОВАТЬ (удален предыдущий неправильный ответ)

Надеюсь, должно работать нормально.

        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");
        }
0 голосов
/ 12 января 2012

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)"
...