如何在C#中对字符串进行URL编码

15

如何在C#中使用URL(RFC 1738)标准对字符串进行编码?

以下在线工具可将字符串转换为此标准:http://www.freeformatter.com/url-encoder.html

我想要转换的字符串示例是test(brackets),编码后的字符串应该如下:

test%28brackets%29

可能是使用C#进行URL编码的重复问题。 - dey.shin
3个回答

26

抱歉,它不起作用。尝试了这个字符串 str = "test(brackets)"; str = Uri.EscapeDataString(str); - rumi
奇怪。当我尝试使用“string result = Uri.EscapeDataString("test(brackets)");”时,结果是“test%28brackets%29”。在您的系统上EscapeDataString后str的值是多少? - Thomas Hetzer
字符串保持不变。它不会改变。 - rumi
7
Uri.EscapeDataString 的行为在 .NET 4.5 中有所改变,现在包括 RFC 3986 字符。 - Dirk
@Dirk:谢谢你的信息。确实,我正在针对.NET 4.5进行开发。 - Thomas Hetzer
尝试将项目属性从4.0更改为4.5,但不起作用,新的4.5 Web应用程序可以工作。有点奇怪。 - Lei Yang

9
根据RFC 1738
Thus, only alphanumerics, the special characters "$-_.+!*'(),", and
reserved characters used for their reserved purposes may be used
unencoded within a URL.

无论是 HttpUtility.UrlEncode 还是 WebUtility.UrlEncode 都不会对这些字符进行编码,因为标准规定括号 () 可以不编码使用。

我不知道你提供的 URL Encoder / Decoder 为什么会对它们进行编码,因为它也将它们列为可以在 URL 中使用的字符之一。


我正在通过HTTP调用第三方API,并在参数中传递一个UTF-8 URL编码的字符串。我的API客户端是使用asp.net C#编写的,而API主机可能是使用Java编写的。当字符串参数中存在括号()等字符时,UTF-8编码器不会对它们进行编码,而API主机会将它们编码为%28和%29,并且我会收到错误的响应。有什么建议可以解决这个问题吗? - rumi
该API在文档中有以下参考链接:http://docs.oracle.com/javase/1.5.0/docs/api/java/net/URLEncoder.html - rumi
你可以尝试查看这个链接:https://dev59.com/nHRA5IYBdhLWcg3wvQhh - Dirk

0

Uri.EscapeDataString 会使用 Uri 标准来转换字符串,但这并不符合 RFC 1738 标准。

RFC 1738 是一个旧的 URL 标准。
我使用 FormUrlEncodedContent 来完成它:

data = new List<KeyValuePair<string, string>>();
data.Add(new KeyValuePair<string, string>("key", "value"));

var payloadBody = await new FormUrlEncodedContent(data).ReadAsStringAsync();

如果您不需要编码的URL body,那么您可能需要在键/值上进行一些技巧操作,例如让值为空。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接