我有一个应用程序,发送一个POST请求到VB论坛软件,并登录某人(没有设置cookie或任何东西)。

一旦用户登录,我就创建一个变量,在他们的本地机器上创建一个路径。

c: \用户tempfolder枣\

问题是一些用户名抛出“非法字符”异常。例如,如果我的用户名是mas|fenix,它会抛出一个异常。

Path.Combine( _      
  Environment.GetFolderPath(System.Environment.SpecialFolder.CommonApplicationData), _
  DateTime.Now.ToString("ddMMyyhhmm") + "-" + form1.username)

我不想从字符串中删除它,但是通过FTP在服务器上创建了一个具有其用户名的文件夹。这就引出了我的第二个问题。如果我在服务器上创建一个文件夹,我可以留下“非法字符”吗?我问这个问题是因为服务器是基于Linux的,我不确定Linux是否接受它。

编辑:似乎URL编码不是我想要的..这就是我想做的:

old username = mas|fenix
new username = mas%xxfenix

其中%xx是ASCII值或任何其他容易识别字符的值。


当前回答

除了@丹·赫伯特的回答, 我们应该对一般的值进行编码。

Split有参数Split('&','=');表达式首先被&分割,然后是'=',因此奇数元素都是要编码的值,如下所示。

public static void EncodeQueryString(ref string queryString)
{
    var array=queryString.Split('&','=');
    for (int i = 0; i < array.Length; i++) {
        string part=array[i];
        if(i%2==1)
        {               
            part=System.Web.HttpUtility.UrlEncode(array[i]);
            queryString=queryString.Replace(array[i],part);
        }
    }
}

其他回答

对于。net核心用户,使用这个

Microsoft.AspNetCore.Http.Extensions.UriHelper.Encode(Uri uri)

更好的方法是使用

Uri。EscapeUriString

不引用。net 4的完整配置文件。

(更新)

根据OP的要求,推荐的API应该是

Uri。EscapeDataString

(谢谢@ykadaru)

如果你看不见系统。Web,更改项目设置。目标框架应该是。NET Framework 4“代替”。NET Framework 4客户端配置文件

编辑:注意,这个答案现在已经过时了。请参阅下面Siarhei Kuchuk的答案以获得更好的解决方案

UrlEncoding会做你在这里建议的事情。对于c#,您只需使用HttpUtility,如前所述。

您还可以Regex非法字符,然后进行替换,但这变得更加复杂,因为您必须有某种形式的状态机(switch…用正确的字符替换。由于UrlEncode预先完成了这个操作,所以相当简单。

至于Linux和windows,有一些字符在Linux中是可以接受的,但在windows中是不可以接受的,但我并不担心这一点,因为文件夹名可以通过解码Url字符串返回,使用UrlDecode,因此您可以往返更改。

从。net Framework 4.5和。net Standard 1.0开始,你应该使用WebUtility.UrlEncode。相对于其他选择的优势:

It is part of .NET Framework 4.5+, .NET Core 1.0+, .NET Standard 1.0+, UWP 10.0+ and all Xamarin platforms as well. HttpUtility, while being available in .NET Framework earlier (.NET Framework 1.1+), becomes available on other platforms much later (.NET Core 2.0+, .NET Standard 2.0+) and it still unavailable in UWP (see related question). In .NET Framework, it resides in System.dll, so it does not require any additional references, unlike HttpUtility. It properly escapes characters for URLs, unlike Uri.EscapeUriString (see comments to drweb86's answer). It does not have any limits on the length of the string, unlike Uri.EscapeDataString (see related question), so it can be used for POST requests, for example.