2

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

假设,我有空间value例如:aq

  • encodeURIComponent(value)返回a%20q
  • HttpUtility.UrlEncode(value)返回a+q

使用这两种方法对空间进行不同的编码。这是否是它以这种方式工作的任何原因,与“很久以前就这样写并且保持不变”不同?

另外,假设我有加号value例如:a+q

  • encodeURIComponent(value)返回a%2Bq
  • HttpUtility.UrlEncode(value)返回a%2bq

js 方法返回大写编码字符,而 c# 方法返回小写字符。

与这两种方法并行合作以使应用程序以一致的方式运行的最佳方法是什么?我应该编写替代 c# 方法来模仿 js 方法的行为吗?我想解码方法有相同的差异。是否有任何“正确”的方式与这些一起工作?

4

1 回答 1

3

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

如果您希望空格始终被编码为,您可以使用Uri.EscapeDataString 方法%20

var result = Uri.EscapeDataString("a q");
// result == "a%20q"

在大写和小写上,RFC3986 说:

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

为了保持一致性,URI 生产者和规范化者应该对所有百分比编码使用大写的十六进制数字。

var result = Uri.EscapeDataString("a+q");
// result == "a%2Bq"
于 2012-04-30T09:28:22.947 回答