我使用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
如何捕获相同的编码字符串?
感谢。
答案 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)
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");
}