处理差异,在编码URI部分时使用c#和javascript方法

处理差异,在编码URI部分时使用c#和javascript方法,c#,javascript,model-view-controller,urlencode,C#,Javascript,Model View Controller,Urlencode,在我的MVC应用程序中,有时我会动态地创建查询字符串:一次来自javascript,一次来自c#服务器代码。在javascript中,我使用encodeURIComponent(value),在c#中,我使用System.Web中的HttpUtility.UrlEncode(value)方法 假设值中有空格,例如:aq: encodeURIComponent(value)返回a%20q HttpUtility.UrlEncode(值)返回a+q 使用这两种方法对空间进行不同的编码。这就是为什

在我的MVC应用程序中,有时我会动态地创建查询字符串:一次来自javascript,一次来自c#服务器代码。在javascript中,我使用
encodeURIComponent(value)
,在c#中,我使用
System.Web中的
HttpUtility.UrlEncode(value)
方法

假设
值中有空格,例如:aq

  • encodeURIComponent(value)
    返回a%20q
  • HttpUtility.UrlEncode(值)
    返回a+q
使用这两种方法对空间进行不同的编码。这就是为什么它会以这种方式工作,不同于“很久以前就这样写的,并且保持不变”的原因吗

另外,假设
值中有加号,例如:a+q

  • encodeURIComponent(value)
    返回a%2Bq
  • HttpUtility.UrlEncode(值)
    返回a%2bq
js方法返回大写编码字符,而c#one返回小写字符


与这两种方法并行协作,使应用程序以一致的方式运行的最佳方式是什么?我是否应该编写替代c#方法来模仿js方法的行为?我想解码方法也有相同的区别。是否有任何“正确”的方法处理这些问题?

中定义了百分比编码。它定义空格字符编码为
%20
。但是,查询字符串通常采用application/x-www-form-urlencoded格式,这也允许将空格编码为
+
,而不是
%20
。如果解码器希望查询字符串采用这种格式,那么编码器可以选择它喜欢的格式

如果希望空格始终编码为
%20
,则可以使用:

var result = Uri.EscapeDataString("a q");
// result == "a%20q"
在大写与小写的对比中,RFC3986表示:

大写十六进制数字“A”到“F”相当于 小写数字“a”到“f”分别为。如果两个URI 仅在百分比编码中使用十六进制数字的情况下不同 八位字节,它们是等价的

为了一致性,URI生产者和 规范化程序应使用大写十六进制数字表示所有 百分比编码


您是否需要使用otehr编码的其中一个来解码URI(例如,C代码是否需要解码JS编码的URI?)根据规范,这两种编码都是有效的。别担心,高兴吧@SteveHaigh:我正在使用querystring中的参数动态地在jquery中构建页面的各个部分。有时查询字符串是在razor视图中创建的,有时是在javascript中创建的。因为url看起来不同,我需要在客户端处理这个问题,所以基本上是的。@Richard Schneider:我没有不高兴的倾向。也要保持快乐!感谢您的全面解释。根据您的评论,我找到了相关的线程,这也解释了类似的混淆:很遗憾,Uri.EscapeDataString()没有像encodeURIComponent()那样编码“+”标记。它保持不变,而不是%2b。c#是否有与encodeURIComponent()等效的代码?
var result = Uri.EscapeDataString("a+q");
// result == "a%2Bq"