C# 我怎么能有相同的编码字符串?
我用C#对“中央时间(美国和加拿大)”进行编码 我想让ruby使用相同的编码字符串 Ruby UrlEncode==>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
中心%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);
}