使用C#进行URL编码


340

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

用户登录后,我将创建一个变量,该变量将在其本地计算机上创建路径。

c:\ tempfolder \ date \用户名

问题在于某些用户名抛出“非法字符”异常。例如,如果我的用户名是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值或其他易于识别字符的值。


Answers:


191

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

UrlEncoding将按照您在此处的建议进行操作。HttpUtility如前所述,使用C#,您只需使用。

您还可以将非法字符进行正则表达式然后替换,但这变得更加复杂,因为您将必须具有某种形式的状态机(例如switch ... case)以替换正确的字符。由于UrlEncode这是预先完成的,因此非常容易。

至于Linux和Windows,有一些Linux可以接受的字符,但Windows却没有,但是我不用担心,因为可以使用解码Url字符串来返回文件夹名称UrlDecode,因此您可以往返变化。


5
这个答案现在已经过时了。阅读下面的一些答案-截至.net45,这可能是正确的解决方案:msdn.microsoft.com/en-us/library/…–
blueberryfields

1
对于FTP,可以使用Uri.EscapeDataString(fileOrFolderName)构造所有Uri部分(文件夹或文件名),以允许所有非Uri兼容字符(空格,unicode ...)。例如,要允许文件名中包含任何字符,请使用:req =(FtpWebRequest)WebRequest.Create(new Uri(path +“ /” + Uri.EscapeDataString(filename))); 使用HttpUtility.UrlEncode()用加号(+)替换空格。搜索引擎的正确行为,但文件/文件夹名称不正确。
雷诺·班塞尔

当您尝试添加js脚本时收到警告时,asp.net会阻止url中的大多数xss A potentially dangerous Request.Path value was detected from the client
学习

510

我一直在尝试.NET为URL编码提供的各种方法。下表可能会有用(作为我编写的测试应用的输出):

Unencoded UrlEncoded UrlEncodedUnicode UrlPathEncoded EscapedDataString EscapedUriString HtmlEncoded HtmlAttributeEncoded HexEscaped
A         A          A                 A              A                 A                A           A                    %41
B         B          B                 B              B                 B                B           B                    %42

a         a          a                 a              a                 a                a           a                    %61
b         b          b                 b              b                 b                b           b                    %62

0         0          0                 0              0                 0                0           0                    %30
1         1          1                 1              1                 1                1           1                    %31

[space]   +          +                 %20            %20               %20              [space]     [space]              %20
!         !          !                 !              !                 !                !           !                    %21
"         %22        %22               "              %22               %22              "      "               %22
#         %23        %23               #              %23               #                #           #                    %23
$         %24        %24               $              %24               $                $           $                    %24
%         %25        %25               %              %25               %25              %           %                    %25
&         %26        %26               &              %26               &                &       &                %26
'         %27        %27               '              '                 '                '       '                %27
(         (          (                 (              (                 (                (           (                    %28
)         )          )                 )              )                 )                )           )                    %29
*         *          *                 *              %2A               *                *           *                    %2A
+         %2b        %2b               +              %2B               +                +           +                    %2B
,         %2c        %2c               ,              %2C               ,                ,           ,                    %2C
-         -          -                 -              -                 -                -           -                    %2D
.         .          .                 .              .                 .                .           .                    %2E
/         %2f        %2f               /              %2F               /                /           /                    %2F
:         %3a        %3a               :              %3A               :                :           :                    %3A
;         %3b        %3b               ;              %3B               ;                ;           ;                    %3B
<         %3c        %3c               <              %3C               %3C              &lt;        &lt;                 %3C
=         %3d        %3d               =              %3D               =                =           =                    %3D
>         %3e        %3e               >              %3E               %3E              &gt;        >                    %3E
?         %3f        %3f               ?              %3F               ?                ?           ?                    %3F
@         %40        %40               @              %40               @                @           @                    %40
[         %5b        %5b               [              %5B               %5B              [           [                    %5B
\         %5c        %5c               \              %5C               %5C              \           \                    %5C
]         %5d        %5d               ]              %5D               %5D              ]           ]                    %5D
^         %5e        %5e               ^              %5E               %5E              ^           ^                    %5E
_         _          _                 _              _                 _                _           _                    %5F
`         %60        %60               `              %60               %60              `           `                    %60
{         %7b        %7b               {              %7B               %7B              {           {                    %7B
|         %7c        %7c               |              %7C               %7C              |           |                    %7C
}         %7d        %7d               }              %7D               %7D              }           }                    %7D
~         %7e        %7e               ~              ~                 ~                ~           ~                    %7E

Ā         %c4%80     %u0100            %c4%80         %C4%80            %C4%80           Ā           Ā                    [OoR]
ā         %c4%81     %u0101            %c4%81         %C4%81            %C4%81           ā           ā                    [OoR]
Ē         %c4%92     %u0112            %c4%92         %C4%92            %C4%92           Ē           Ē                    [OoR]
ē         %c4%93     %u0113            %c4%93         %C4%93            %C4%93           ē           ē                    [OoR]
Ī         %c4%aa     %u012a            %c4%aa         %C4%AA            %C4%AA           Ī           Ī                    [OoR]
ī         %c4%ab     %u012b            %c4%ab         %C4%AB            %C4%AB           ī           ī                    [OoR]
Ō         %c5%8c     %u014c            %c5%8c         %C5%8C            %C5%8C           Ō           Ō                    [OoR]
ō         %c5%8d     %u014d            %c5%8d         %C5%8D            %C5%8D           ō           ō                    [OoR]
Ū         %c5%aa     %u016a            %c5%aa         %C5%AA            %C5%AA           Ū           Ū                    [OoR]
ū         %c5%ab     %u016b            %c5%ab         %C5%AB            %C5%AB           ū           ū                    [OoR]

这些列表示的编码如下:

  • 网址编码: HttpUtility.UrlEncode

  • UrlEncodedUnicode: HttpUtility.UrlEncodeUnicode

  • UrlPathEncoded: HttpUtility.UrlPathEncode

  • EscapedDataString: Uri.EscapeDataString

  • EscapedUriString: Uri.EscapeUriString

  • HtmlEncoded: HttpUtility.HtmlEncode

  • HtmlAttributeEncoded: HttpUtility.HtmlAttributeEncode

  • 十六进制转义: Uri.HexEscape

笔记:

  1. HexEscape只能处理前255个字符。因此,它ArgumentOutOfRange为拉丁字母A扩展字符(例如Ā)引发了异常。

  2. 该表是在.NET 4.0中生成的(请参阅下面的Levi Botelho的评论,其中说.NET 4.5中的编码略有不同)。

编辑:

我添加了第二个表,其中包含.NET 4.5的编码。看到这个答案:https : //stackoverflow.com/a/21771206/216440

编辑2:

由于人们似乎喜欢这些表,所以我认为您可能喜欢生成该表的源代码,因此您可以自己玩。这是一个简单的C#控制台应用程序,可以定位.NET 4.0或4.5:

using System;
using System.Collections.Generic;
using System.Text;
// Need to add a Reference to the System.Web assembly.
using System.Web;

namespace UriEncodingDEMO2
{
    class Program
    {
        static void Main(string[] args)
        {
            EncodeStrings();

            Console.WriteLine();
            Console.WriteLine("Press any key to continue...");
            Console.Read();
        }

        public static void EncodeStrings()
        {
            string stringToEncode = "ABCD" + "abcd"
            + "0123" + " !\"#$%&'()*+,-./:;<=>?@[\\]^_`{|}~" + "ĀāĒēĪīŌōŪū";

            // Need to set the console encoding to display non-ASCII characters correctly (eg the 
            //  Latin A-Extended characters such as ĀāĒē...).
            Console.OutputEncoding = Encoding.UTF8;

            // Will also need to set the console font (in the console Properties dialog) to a font 
            //  that displays the extended character set correctly.
            // The following fonts all display the extended characters correctly:
            //  Consolas
            //  DejaVu Sana Mono
            //  Lucida Console

            // Also, in the console Properties, set the Screen Buffer Size and the Window Size 
            //  Width properties to at least 140 characters, to display the full width of the 
            //  table that is generated.

            Dictionary<string, Func<string, string>> columnDetails =
                new Dictionary<string, Func<string, string>>();
            columnDetails.Add("Unencoded", (unencodedString => unencodedString));
            columnDetails.Add("UrlEncoded",
                (unencodedString => HttpUtility.UrlEncode(unencodedString)));
            columnDetails.Add("UrlEncodedUnicode",
                (unencodedString => HttpUtility.UrlEncodeUnicode(unencodedString)));
            columnDetails.Add("UrlPathEncoded",
                (unencodedString => HttpUtility.UrlPathEncode(unencodedString)));
            columnDetails.Add("EscapedDataString",
                (unencodedString => Uri.EscapeDataString(unencodedString)));
            columnDetails.Add("EscapedUriString",
                (unencodedString => Uri.EscapeUriString(unencodedString)));
            columnDetails.Add("HtmlEncoded",
                (unencodedString => HttpUtility.HtmlEncode(unencodedString)));
            columnDetails.Add("HtmlAttributeEncoded",
                (unencodedString => HttpUtility.HtmlAttributeEncode(unencodedString)));
            columnDetails.Add("HexEscaped",
                (unencodedString
                    =>
                    {
                        // Uri.HexEscape can only handle the first 255 characters so for the 
                        //  Latin A-Extended characters, such as A, it will throw an 
                        //  ArgumentOutOfRange exception.                       
                        try
                        {
                            return Uri.HexEscape(unencodedString.ToCharArray()[0]);
                        }
                        catch
                        {
                            return "[OoR]";
                        }
                    }));

            char[] charactersToEncode = stringToEncode.ToCharArray();
            string[] stringCharactersToEncode = Array.ConvertAll<char, string>(charactersToEncode,
                (character => character.ToString()));
            DisplayCharacterTable<string>(stringCharactersToEncode, columnDetails);
        }

        private static void DisplayCharacterTable<TUnencoded>(TUnencoded[] unencodedArray,
            Dictionary<string, Func<TUnencoded, string>> mappings)
        {
            foreach (string key in mappings.Keys)
            {
                Console.Write(key.Replace(" ", "[space]") + " ");
            }
            Console.WriteLine();

            foreach (TUnencoded unencodedObject in unencodedArray)
            {
                string stringCharToEncode = unencodedObject.ToString();
                foreach (string columnHeader in mappings.Keys)
                {
                    int columnWidth = columnHeader.Length + 1;
                    Func<TUnencoded, string> encoder = mappings[columnHeader];
                    string encodedString = encoder(unencodedObject);

                    // ASSUMPTION: Column header will always be wider than encoded string.
                    Console.Write(encodedString.Replace(" ", "[space]").PadRight(columnWidth));
                }
                Console.WriteLine();
            }
        }
    }
}

2
这是一个了不起的答案。原来我想使用Uri.EscapeDataString而不包含System.Web。感谢这张桌子。
Seravy 2012年

7
请注意,这不再是100%准确的。在.NET 4和.NET 4.5之间,某些功能已稍有更改。请参阅stackoverflow.com/q/20003106/1068266
Levi Botelho 2014年

2
@Levi:感谢大家的注意。我在.NET 4.5的表中添加了第二个答案。我已经编辑了原始答案以链接到第二张表。
西蒙·图西

请注意,.NET文档说不要使用。仅用于浏览器兼容性。使用UrlEncode。,但是该方法会编码许多其他不需要的字符。最接近的是Uri.EscapeUriString,但是请注意,它不支持null参数。
安德鲁(Andrew)

1
我忘了提,我在上面的评论是针对的UrlPathEncode。因此基本上替换UrlPathEncodeUri.EscapeUriString
安德鲁(Andrew)

278

您应该只对可能无效的用户名或URL的其他部分进行编码。编码URL的URL可能会导致问题,因为这样的事情:

string url = HttpUtility.UrlEncode("http://www.google.com/search?q=Example");

会屈服

http%3a%2f%2fwww.google.com%2fsearch%3fq%3d示例

这显然不能很好地工作。相反,您应该仅在查询字符串中对键/值对的值进行编码,如下所示:

string url = "http://www.google.com/search?q=" + HttpUtility.UrlEncode("Example");

希望有帮助。另外,如teedyay所述,您仍然需要确保删除了非法的文件名字符,否则文件系统将不喜欢该路径。


33
使用HttpUtility.UrlPathEncode方法应该可以避免您在此处描述的问题。
vipirtti

12
@DJ Pirtu:的确,UrlPathEncode不会在路径中进行那些不需要的更改,但是在之后,它也不会进行任何编码?(因为它假定查询字符串已被编码)。在丹·赫伯特(Dan Herbert)的示例中,看起来他假装的Example是需要编码的文本,因此HttpUtility.UrlPathEncode("http://www.google.com/search?q=Example");无法正常工作。尝试使用?q=Ex&ple(所需结果为?q=Ex%26ple)。由于(1)UrlPathEncode在之后没有触摸任何东西?,以及(2)UrlPathEncode &无论如何都不编码,因此无法使用。
Tim Goodman 2010年

1
参见此处:connect.microsoft.com/VisualStudio/feedback/details/551839/… 我应该补充一点,当然UrlPathEncode不编码是一件好事&,因为您需要用它来分隔查询字符串参数。但是有时候您也需要编码的“&”号。
Tim Goodman 2010年

10
HttpUtility是WebUtility的最新版本,可节省一些时间:)
Wiseman

189

更好的方法是使用

Uri.EscapeUriString

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


1
完全同意,因为对于使用System.Net但不使用System.Web的应用程序而言,“客户端配置文件”通常就足够了;-)
hfrmobile 2012年

6
OP正在谈论检查它与文件系统的兼容性,因此这将行不通。Windows不允许的字符集是'[“ /”,“ \\”,“ <”,“>”,“:”,“ \”“,” |“,”?“,” *“]”,但其中许多不要使用EscapedUriString进行编码(请参见下表-感谢该表@Simon Tewsi)...“在其本地计算机上创建路径” -OP UrlEncoded可以解决几乎所有问题,但不能解决原始输入中存在“%”或“%3f”的问题,因为“解码”现在将不同于原始输入
m1m1k 2013年

6
只是为了清楚:这个答案是文件系统的工作
m1m1k

1
此外,从.NET Framework 4.5开始,客户端配置文件已停产,仅完整的可再发行软件包可用。
2013年

29
stackoverflow.com/a/34189188/3436164使用Uri.EscapeDataStringUri.EscapeUriString阅读此评论,对我有所帮助。
ykadaru

181

.NET Framework 4.5.NET Standard 1.0开始,您应该使用.NET FrameworkWebUtility.UrlEncode。相对替代品的优势:

  1. 它是.NET Framework 4.5 + 、. NET Core 1.0 + 、. NET Standard 1.0 +,UWP 10.0+以及所有Xamarin平台的一部分。HttpUtility,虽然可以在早期的.NET Framework(.NET Framework 1.1+)中使用,但在以后的其他平台(.NET Core 2.0 + 、. NET Standard 2.0+)中可用,并且在UWP中仍然不可用(请参阅相关问题)。

  2. 在.NET Framework中,它驻留在中System.dll,因此与.NET Framework不同,它不需要任何其他引用HttpUtility

  3. URL不同,它正确地转义了URL的字符Uri.EscapeUriString(请参见drweb86的答案的注释)。

  4. 它对字符串的长度没有任何限制,与Uri.EscapeDataString(参见相关的问题),所以它可以用于POST请求,例如。


我喜欢它使用“ +”代替空格的%20进行编码的方式..但是,这个仍然不能从URL中删除“,并为我提供了无效的URL ...哦,好吧。 “”“,”“)
皮奥特·库拉

84

Levi Botelho评论说,以前生成的编码表对于.NET 4.5不再准确,因为在.NET 4.0和4.5之间,编码略有变化。因此,我为.NET 4.5重新生成了表:

Unencoded UrlEncoded UrlEncodedUnicode UrlPathEncoded WebUtilityUrlEncoded EscapedDataString EscapedUriString HtmlEncoded HtmlAttributeEncoded WebUtilityHtmlEncoded HexEscaped
A         A          A                 A              A                    A                 A                A           A                    A                     %41
B         B          B                 B              B                    B                 B                B           B                    B                     %42

a         a          a                 a              a                    a                 a                a           a                    a                     %61
b         b          b                 b              b                    b                 b                b           b                    b                     %62

0         0          0                 0              0                    0                 0                0           0                    0                     %30
1         1          1                 1              1                    1                 1                1           1                    1                     %31

[space]   +          +                 %20            +                    %20               %20              [space]     [space]              [space]               %20
!         !          !                 !              !                    %21               !                !           !                    !                     %21
"         %22        %22               "              %22                  %22               %22              &quot;      &quot;               &quot;                %22
#         %23        %23               #              %23                  %23               #                #           #                    #                     %23
$         %24        %24               $              %24                  %24               $                $           $                    $                     %24
%         %25        %25               %              %25                  %25               %25              %           %                    %                     %25
&         %26        %26               &              %26                  %26               &                &amp;       &amp;                &amp;                 %26
'         %27        %27               '              %27                  %27               '                &#39;       &#39;                &#39;                 %27
(         (          (                 (              (                    %28               (                (           (                    (                     %28
)         )          )                 )              )                    %29               )                )           )                    )                     %29
*         *          *                 *              *                    %2A               *                *           *                    *                     %2A
+         %2b        %2b               +              %2B                  %2B               +                +           +                    +                     %2B
,         %2c        %2c               ,              %2C                  %2C               ,                ,           ,                    ,                     %2C
-         -          -                 -              -                    -                 -                -           -                    -                     %2D
.         .          .                 .              .                    .                 .                .           .                    .                     %2E
/         %2f        %2f               /              %2F                  %2F               /                /           /                    /                     %2F
:         %3a        %3a               :              %3A                  %3A               :                :           :                    :                     %3A
;         %3b        %3b               ;              %3B                  %3B               ;                ;           ;                    ;                     %3B
<         %3c        %3c               <              %3C                  %3C               %3C              &lt;        &lt;                 &lt;                  %3C
=         %3d        %3d               =              %3D                  %3D               =                =           =                    =                     %3D
>         %3e        %3e               >              %3E                  %3E               %3E              &gt;        >                    &gt;                  %3E
?         %3f        %3f               ?              %3F                  %3F               ?                ?           ?                    ?                     %3F
@         %40        %40               @              %40                  %40               @                @           @                    @                     %40
[         %5b        %5b               [              %5B                  %5B               [                [           [                    [                     %5B
\         %5c        %5c               \              %5C                  %5C               %5C              \           \                    \                     %5C
]         %5d        %5d               ]              %5D                  %5D               ]                ]           ]                    ]                     %5D
^         %5e        %5e               ^              %5E                  %5E               %5E              ^           ^                    ^                     %5E
_         _          _                 _              _                    _                 _                _           _                    _                     %5F
`         %60        %60               `              %60                  %60               %60              `           `                    `                     %60
{         %7b        %7b               {              %7B                  %7B               %7B              {           {                    {                     %7B
|         %7c        %7c               |              %7C                  %7C               %7C              |           |                    |                     %7C
}         %7d        %7d               }              %7D                  %7D               %7D              }           }                    }                     %7D
~         %7e        %7e               ~              %7E                  ~                 ~                ~           ~                    ~                     %7E

Ā         %c4%80     %u0100            %c4%80         %C4%80               %C4%80            %C4%80           Ā           Ā                    Ā                     [OoR]
ā         %c4%81     %u0101            %c4%81         %C4%81               %C4%81            %C4%81           ā           ā                    ā                     [OoR]
Ē         %c4%92     %u0112            %c4%92         %C4%92               %C4%92            %C4%92           Ē           Ē                    Ē                     [OoR]
ē         %c4%93     %u0113            %c4%93         %C4%93               %C4%93            %C4%93           ē           ē                    ē                     [OoR]
Ī         %c4%aa     %u012a            %c4%aa         %C4%AA               %C4%AA            %C4%AA           Ī           Ī                    Ī                     [OoR]
ī         %c4%ab     %u012b            %c4%ab         %C4%AB               %C4%AB            %C4%AB           ī           ī                    ī                     [OoR]
Ō         %c5%8c     %u014c            %c5%8c         %C5%8C               %C5%8C            %C5%8C           Ō           Ō                    Ō                     [OoR]
ō         %c5%8d     %u014d            %c5%8d         %C5%8D               %C5%8D            %C5%8D           ō           ō                    ō                     [OoR]
Ū         %c5%aa     %u016a            %c5%aa         %C5%AA               %C5%AA            %C5%AA           Ū           Ū                    Ū                     [OoR]
ū         %c5%ab     %u016b            %c5%ab         %C5%AB               %C5%AB            %C5%AB           ū           ū                    ū                     [OoR]

这些列表示的编码如下:

  • 网址编码: HttpUtility.UrlEncode
  • UrlEncodedUnicode: HttpUtility.UrlEncodeUnicode
  • UrlPathEncoded: HttpUtility.UrlPathEncode
  • WebUtilityUrl编码: WebUtility.UrlEncode
  • EscapedDataString: Uri.EscapeDataString
  • EscapedUriString: Uri.EscapeUriString
  • HtmlEncoded: HttpUtility.HtmlEncode
  • HtmlAttributeEncoded: HttpUtility.HtmlAttributeEncode
  • WebUtilityHtml编码: WebUtility.HtmlEncode
  • 十六进制转义: Uri.HexEscape

笔记:

  1. HexEscape只能处理前255个字符。因此,它为拉丁A扩展字符(例如Ā)抛出ArgumentOutOfRange异常。

  2. 该表是在.NET 4.5中生成的(有关与.NET 4.0及更低版本相关的编码,请参见答案https://stackoverflow.com/a/11236038/216440)。

编辑:

  1. 作为Discord回答的结果,我添加了新的WebUtility UrlEncode和HtmlEncode方法,这些方法在.NET 4.5中引入。

2
不是没有用户UrlPathEncode-甚至MSDN都说它不被使用。它是为修复Netscape 2msdn.microsoft.com/en-us/library/…
Jeff

Server.URLEncode是这个主题的又一个变体吗?它会产生任何不同的输出吗?
ALEXintlsos

2
@ALEX:在ASP.NET中,Server对象是HttpServerUtility的实例。使用dotPeek反编译器,我看了看HttpServerUtility.UrlEncode。它仅调用HttpUtility.UrlEncode,因此这两个方法的输出将相同。
西蒙·图西

看起来,即使编码方法过多,但对于拉丁文1以上的任何语言(例如→或☠),它们都仍然会失败。(UrlEncodedUnicode似乎至少尝试支持Unicode,但已弃用/遗漏了。)
brianary 2015年

西蒙,您能将此答案整合到已接受的答案中吗?只需一个答案就可以了。您可以将其集成并在该答案的底部添加h1标题,或集成到一张表中并标记不同的行,例如: (Net4.0) ? %3f................................ (Net4.5) ? %3f ..................................
T.Todua

60

在.NET中,URL编码很容易。采用:

System.Web.HttpUtility.UrlEncode(string url)

如果将其解码以获取文件夹名称,则仍需要排除不能在文件夹名称中使用的字符(*,?,/等)。


它会编码不是字母一部分的每个字符吗?
masfenix

1
URL编码将URL中不允许的字符转换为等效的字符实体。不安全字符列表:blooberry.com/indexdot/html/topics/urlencoding.htm
Ian Robinson,2009年

HttpUtility.UrlEncode上的MSDN链接:msdn.microsoft.com/en-us/library/4fkewx0t.aspx
Ian Robinson,2009年

11
将完整的System.Web ...部分放入您的答案中是一个好习惯,它可以节省很多人的时间:)谢谢
Liam

3
这很危险:并非必须对url的所有字符进行编码,而仅对querystring参数的值进行编码。您建议的方式还将对在查询字符串中创建多个参数所需的&进行编码。如果需要,可以采用这种方式对每个参数值进行编码
Marco Staffoli 2013年

12

如果看不到System.Web,请更改项目设置。目标框架应该是“ .NET Framework 4”,而不是“ .NET Framework 4 Client Profile”


1
在我看来,开发人员应该了解“ .NET配置文件”,并且他们应该根据自己的目的使用正确的配置文件!仅添加完整的配置文件以获取(例如System.Web)而不真正知道为什么要添加完整的配置文件并不是很聪明。仅在需要时才客户端应用程序使用“客户端配置文件”,并使用完整的配置文件(例如,WinForms或WPF客户端应使用客户端配置文件而不是完整的配置文件)!例如,我看不出在客户端应用程序中使用HttpServerUtility的原因^^ ...如果需要这样做,则该应用程序的设计有问题!
hfrmobile 2012年

4
真?从来没有需要客户端应用程序来构造URL吗?您以谋生为目的做什么-清洁工作?
sproketboy

@hfrmobile:不。概要文件模型完全错误(该模型仅存在一次,在下一个版本中被放弃)。从一开始就很明显。现在对您来说明显吗?首先考虑一下,不要接受msft试图卖给您的一切; P
abatishchev 2014年

抱歉,但我从未说过客户端永远不必构建/使用URL。只要使用.NET 4.0,用户就应该关心它。简而言之:在将HttpServerUtility添加到客户端之前,开发人员应该三思。还有其他/更好的方法,只需以139票查看答案,或“因为.NET Framework 4.5以来,您可以使用WebUtility.UrlEncode。首先,它位于System.dll中,因此不需要任何其他引用。”。
hfrmobile 2014年

9

的.NET实现UrlEncode不符合RFC 3986。

  1. 有些字符未编码,但应该编码。这些!()*字符在RFC的2.2节中作为必须保留的字符列出,但.NET无法对这些字符进行编码。

  2. 有些字符已编码,但不应编码。的.-_字符未在RFC的2.2节为不应被尚未.NET编码错误地编码这些字符保留字符列出。

  3. RFC规定,为了保持一致,实现应使用大写的HEXDIG,而.NET会生成小写的HEXDIG。


4

我认为这里的人被UrlEncode消息所困扰。URLEncoding 不是您想要的-您想要对无法在目标系统上用作文件名的内容进行编码。

假设您需要一些通用性-可以随时在多个系统(MacOS,Windows,Linux和Unix)上找到非法字符,将它们结合起来以形成一组字符以进行转义。

至于转义,最好使用HexEscape(用%XX替换字符)。如果要支持不执行unicode的系统,请将每个字符转换为UTF-8字节并编码> 128的所有内容。但是还有其他方法,例如使用反斜杠“ \”或HTML编码“””。您可以创建自己的系统。所有系统所要做的就是“编码”不兼容的字符。上述系统允许您重新创建原始名称-但也可以用空格替换不良字符。

在与上述相同的切线上,唯一可以使用的是

Uri.EscapeDataString

-它对OAuth所需的所有内容进行编码,不对OAuth禁止编码的内容进行编码,并且将空间编码为%20而不是+(在OATH规范中也是如此),请参见:RFC 3986。最新的URI规范。


3

我编写了一个C#方法,对所有符号进行网址编码:

    /// <summary>
    /// !#$345Hf} → %21%23%24%33%34%35%48%66%7D
    /// </summary>
    public static string UrlEncodeExtended( string value )
    {
        char[] chars = value.ToCharArray();
        StringBuilder encodedValue = new StringBuilder();
        foreach (char c in chars)
        {
            encodedValue.Append( "%" + ( (int)c ).ToString( "X2" ) );
        }
        return encodedValue.ToString();
    }

1

理想情况下,将它们放在名为“ FileNaming”的类中,或者只是将Encode重命名为“ FileNameEncode”。注意:这些文件并非旨在处理完整路径,而仅用于处理文件夹和/或文件名。理想情况下,您将首先拆分(“ /”)您的完整路径,然后检查各个部分。很明显,您可以将“%”字符添加到Windows不允许的字符列表中,而不用使用联合,但是我认为这种方式更有用/更易于理解。Decode()完全相同,但是使用字符切换了“转义”的Replace(Uri.HexEscape(s [0]),s)。

public static List<string> urlEncodedCharacters = new List<string>
{
  "/", "\\", "<", ">", ":", "\"", "|", "?", "%" //and others, but not *
};
//Since this is a superset of urlEncodedCharacters, we won't be able to only use UrlEncode() - instead we'll use HexEncode
public static List<string> specialCharactersNotAllowedInWindows = new List<string>
{
  "/", "\\", "<", ">", ":", "\"", "|", "?", "*" //windows dissallowed character set
};

    public static string Encode(string fileName)
    {
        //CheckForFullPath(fileName); // optional: make sure it's not a path?
        List<string> charactersToChange = new List<string>(specialCharactersNotAllowedInWindows);
        charactersToChange.AddRange(urlEncodedCharacters.
            Where(x => !urlEncodedCharacters.Union(specialCharactersNotAllowedInWindows).Contains(x)));   // add any non duplicates (%)

        charactersToChange.ForEach(s => fileName = fileName.Replace(s, Uri.HexEscape(s[0])));   // "?" => "%3f"

        return fileName;
    }

感谢@ simon-tewsi提供了上面非常有用的表!


也有用: Path.GetInvalidFileNameChars()
m1m1k 2013年

是。这是一种实现方法:foreach(System.IO.Path.GetInvalidFileNameChars()中的char c){filename = filename.Replace(c,'_'); }
netfed

0

除了@Dan Herbert的答案之外,您通常应该只编码值。

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);
        }
    }
}
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.