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

本文关键字:方法 JavaScript 分时 URI 编码 处理 | 更新日期: 2023-09-27 18:32:36

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

假设我在value中有空间,例如:一个q

  • 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 方法行为吗?我想解码方法有相同的区别。有没有"正确"的工作方式?

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

百分比编码以RFC3986定义。它定义了空格字符编码为 %20 。但是,查询字符串通常采用 application/x-www-form-urlencoding 格式,这也允许将空格编码为 + 而不是 %20 。如果解码器需要此格式的查询字符串,则编码器可以选择它喜欢的任何格式。

如果您希望

空格始终编码为%20,则可以使用 Uri.EscapeDataString 方法:

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"