如何在C#中用%20替换所有空格?


76

我想使用C#将字符串制成URL。.NET框架中必须有一些应该帮助的东西,对吗?


该问题标题与问题不匹配。要在C#中将所有空格替换为%20(标题),可以使用String.Replace(" ", "%20")。如果要构建URL,则只需将URL值放在字符串中即可:string url = "https://site/app/?q=cats"但是,如果OP谈论的是将URL作为GET参数传递为另一个URL的一部分,则这完全是另一回事,这本身与上面说的不同,将网址发送到ASP.NET(或其他任何方式)的HTML锚标记中。
没必要,

Answers:


57

我相信您正在寻找HttpServerUtility.UrlEncode

System.Web.HttpUtility.UrlEncode(string url)

8
我认为Uri.EscapeUriString()是合适的方法,如果我们必须对此有所信奉的话:)
Stoyan Dimov

20
@StoyanDimov:EscapeUriString()不会逃脱&也不是=nor ?,因此EscapeDataString()似乎是要使用的那个。
Doug S

4
有人编辑了这个问题以完全改变答案。我们不应该使用编辑来更改特定帖子的含义
palswim

24
@palswim是的,但是“已接受”的答案不能是您回复到的答案:System.Web.HttpUtility.UrlEncode将空间编码为+and而不是%20,因此此答案完全不正确。
Eregrith '16

14
错误答案-不要使用,UrlEncode因为它用+不是%20标准URI方案的空格(而不是OP专门要求的空格)代替。decodeURI并且decodeURIComponent在JavaScript中将无法正确解码。使用Uri.EscapeDataString它可以通过适当的JavaScript进行解码的编码数据和URI的良好往返用法
nothingisnecessary


48

我发现有用 System.Web.HttpUtility.UrlPathEncode(string str);

它用%20而不是+代替空格。


至少在4.0中。System.Web.HttpUtility.UrlDecode(“ a%20b”)产生“ a b”
算盘

4
它可以工作,但是不要使用它,因为它适用于浏览器。请改用Uri.EscapeUriString(STRING)。MSDN:“请勿使用;仅用于浏览器兼容性。请使用UrlEncode。” msdn.microsoft.com/en-us/library/…–
VRC

我发现它很有用,因为我只想对部分URL进行编码,但仍然可以点击。这些所做的超出了预期:System.Uri.EscapeDataString(url)和HttpContext.Current.Server.UrlEncode(url)
sobelito 2016年

2
为了成功发布到Twitter,我需要将空格编码为%20而不是+。UrlEncode(url)将空格转换为+,因此不是我所遇到问题的正确答案。
jgerman '16


16

就像对已批准的故事所评论的那样,HttpServerUtility.UrlEncode方法将空格替换为+而不是%20。请改用以下两种方法之一:Uri.EscapeUriString()Uri.EscapeDataString()

样例代码:

HttpUtility.UrlEncode("https://mywebsite.com/api/get me this file.jpg")
//"https%3a%2f%2fmywebsite.com%2fapi%2fget+me+this+file.jpg"

Uri.EscapeUriString("https://mywebsite.com/api/get me this file.jpg");
//"https://mywebsite.com/api/get%20me%20this%20file.jpg"
Uri.EscapeDataString("https://mywebsite.com/api/get me this file.jpg");
//"https%3A%2F%2Fmywebsite.com%2Fapi%2Fget%20me%20this%20file.jpg"

//When your url has a query string:
Uri.EscapeUriString("https://mywebsite.com/api/get?id=123&name=get me this file.jpg");
//"https://mywebsite.com/api/get?id=123&name=get%20me%20this%20file.jpg"
Uri.EscapeDataString("https://mywebsite.com/api/get?id=123&name=get me this file.jpg");

//"https%3A%2F%2Fmywebsite.com%2Fapi%2Fget%3Fid%3D123%26name%3Dget%20me%20this%20file.jpg"


1

我也需要这样做,几年前就发现了这个问题,但是问题的标题和文字并不完全匹配,除非我们谈论传递,否则使用Uri.EscapeDataStringor UrlEncode(请不要使用那个!)通常是没有意义的URL作为其他URL的参数。

(例如,在进行开放ID身份验证,Azure AD等时传递回调URL)

希望这是对问题的更实际的回答:我想使用C#将字符串转换为URL,.NET框架中一定有一些东西应该对吧?

是的-有两个函数有助于在C#中制作URL字符串

  • String.Format 用于格式化URL
  • Uri.EscapeDataString 用于转义URL中的任何参数

这段代码

String.Format("https://site/app/?q={0}&redirectUrl={1}", 
  Uri.EscapeDataString("search for cats"), 
  Uri.EscapeDataString("https://mysite/myapp/?state=from idp"))

产生这个结果

https://site/app/?q=search%20for%20cats&redirectUrl=https%3A%2F%2Fmysite%2Fmyapp

可以安全地将其复制并粘贴到浏览器的地址栏或srcHTMLA标记的属性中,或与一起使用curl,或编码为QR码等。


与JavaScript等效的东西"https://site/app/?q=" + encodeURIComponent("search for cats") + "&redirectUrl=" + encodeURIComponent("https://mysite/myapp/?state=from idp")会产生相同的输出。
没必要,2017年


0

以下代码将用单个%20字符替换重复空格。

例:

输入为:

Code by Hitesh             Jain

输出:

Code%20by%20Hitesh%20Jain

static void Main(string[] args)
{
    Console.WriteLine("Enter a string");
    string str = Console.ReadLine();
    string replacedStr = null;

    // This loop will repalce all repeat black space in single space
    for (int i = 0; i < str.Length - 1; i++)
    {
        if (!(Convert.ToString(str[i]) == " " &&
            Convert.ToString(str[i + 1]) == " "))
        {
            replacedStr = replacedStr + str[i];
        }
    }
    replacedStr = replacedStr + str[str.Length-1]; // Append last character
    replacedStr = replacedStr.Replace(" ", "%20");
    Console.WriteLine(replacedStr);
    Console.ReadLine();
}

-3

HttpServerUtility.HtmlEncode

从文档中:

String TestString = "This is a <Test String>.";
String EncodedString = Server.HtmlEncode(TestString);

但这实际上是编码HTML,而不是URL。而是使用UrlEncode(TestString)


3
OP正在询问有关URL编码的问题;不是HTML编码。
蓝精灵”地铁

不,这是针对HTML编码,而不是URL编码(顾名思义...)
Thomas Levesque 2009年

是的,您是对的,使用UrlEncode()编码url-仅用于编码html实体
George Mauer
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.