Кодирование URL с использованием C #

У меня есть приложение, которое отправляет запрос POST в программное обеспечение форума VB и вводит кого-то в систему (без установки файлов cookie или чего-то еще).

Как только пользователь вошел в систему, я создаю переменную, которая создает путь на его локальном компьютере.

c: \ tempfolder \ date \ имя пользователя

Проблема в том, что некоторые имена пользователей выдают исключение «Illegal chars». Например, если бы мое имя пользователя было 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 или любое другое значение, которое может легко идентифицировать символ.


person masfenix    schedule 22.02.2009    source источник
comment
Включите это, чтобы сделать имена папок безопасными для файловой системы: http://stackoverflow.com/questions/333175/is-there-a-way-of-making-strings-file-path-safe-in-c   -  person missaghi    schedule 23.02.2009


Ответы (13)


Изменить: обратите внимание, что этот ответ теперь устарел. См. ответ Сергея Кучука ниже для лучшего исправления.

UrlEncoding сделает то, что вы здесь предлагаете. В C # вы просто используете HttpUtility, как уже упоминалось.

Вы также можете использовать Regex для недопустимых символов, а затем заменить их, но это становится намного сложнее, поскольку вам понадобится некоторая форма конечного автомата (например, switch ... case) для замены правильными символами. Поскольку UrlEncode делает это заранее, это довольно просто.

Что касается Linux по сравнению с окнами, есть некоторые символы, которые приемлемы в Linux, но которых нет в Windows, но я бы не стал беспокоиться об этом, поскольку имя папки может быть возвращено путем декодирования строки URL-адреса с помощью UrlDecode, поэтому вы можете туда и обратно перемены.

person Gregory A Beamer    schedule 22.02.2009
comment
этот ответ сейчас устарел. прочтите несколько ответов ниже - для .net45 это может быть правильное решение: msdn.microsoft.com/en-us/library/ - person blueberryfields; 07.01.2015
comment
Для FTP каждая часть Uri (имя папки или файла) может быть создана с использованием Uri.EscapeDataString (fileOrFolderName), разрешая все символы, не совместимые с Uri (пробелы, юникод ...). Например, чтобы разрешить любой символ в имени файла, используйте: req = (FtpWebRequest) WebRequest.Create (новый Uri (путь + / + Uri.EscapeDataString (имя файла))); Используя HttpUtility.UrlEncode (), замените пробелы знаком плюса (+). Правильное поведение для поисковых систем, но неправильное для имен файлов / папок. - person Renaud Bancel; 17.02.2015
comment
asp.net блокирует большую часть xss в url-адресе, так как вы получаете предупреждение, когда пытаетесь добавить js-скрипт A potentially dangerous Request.Path value was detected from the client. - person Learning; 02.09.2018

Я экспериментировал с различными методами, которые .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]

Столбцы представляют следующие кодировки:

  • UrlEncoded: HttpUtility.UrlEncode

  • UrlEncodedUnicode: HttpUtility.UrlEncodeUnicode

  • UrlPathEncoded: HttpUtility.UrlPathEncode

  • EscapedDataString: Uri.EscapeDataString

  • EscapedUriString: Uri.EscapeUriString

  • HtmlEncoded: HttpUtility.HtmlEncode

  • HtmlAttributeEncoded: HttpUtility.HtmlAttributeEncode

  • HexEscaped: Uri.HexEscape

ПРИМЕЧАНИЯ:

  1. HexEscape может обрабатывать только первые 255 символов. Следовательно, для латинских символов A-Extended (например, Ā) выдается исключение ArgumentOutOfRange.

  2. Эта таблица была создана в .NET 4.0 (см. Комментарий Леви Ботельо ниже, в котором говорится, что кодировка в .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();
            }
        }
    }
}

Нажмите здесь, чтобы запустить код на dotnetfiddle.net

person Simon Tewsi    schedule 27.06.2012
comment
Это фантастический ответ. Оказывается, я хотел использовать Uri.EscapeDataString, а не включать System.Web. Спасибо за этот стол. - person Seravy; 10.12.2012
comment
Обратите внимание, что это уже не на 100% точно. Некоторые функции немного изменились между .NET 4 и .NET 4.5. См. stackoverflow.com/q/20003106/1068266. - person Levi Botelho; 09.01.2014
comment
@Levi: Спасибо за внимание. Я добавил второй ответ в таблицу для .NET 4.5. Я отредактировал исходный ответ, указав ссылку на вторую таблицу. - person Simon Tewsi; 19.02.2014
comment
Обратите внимание, что в документации .NET сказано: Не использовать; предназначен только для совместимости с браузером. Используйте UrlEncode., но этот метод кодирует множество других нежелательных символов. Ближайший - Uri.EscapeUriString, но будьте осторожны, он не поддерживает аргумент null. - person Andrew; 24.01.2018
comment
Забыл упомянуть, мой комментарий выше для UrlPathEncode. Так что замените UrlPathEncode на Uri.EscapeUriString. - person Andrew; 21.03.2018
comment
Лучший ответ, с которым я столкнулся! - person Zaki Mohammed; 17.04.2020
comment
Остерегайтесь: этот ответ вводит в заблуждение. Некоторые из этих методов экранирования экранируют разные символы в зависимости от их контекста в строке. Некоторые из них довольно опасны, если вы не полностью понимаете их ограничения. Если вы вставляете что-то в палку uri на Uri.EscapeDataString (не EscapeUriString!), Если вы не уверены, что знаете, что делаете. - person Eamon Nerbonne; 10.06.2020
comment
Есть ли какие-либо изменения в .NET Core 3+ и .NET 5? - person Joke Huang; 19.05.2021

Вы должны кодировать только имя пользователя или другую часть URL-адреса, которая может быть недействительной. URL-кодирование URL-адреса может привести к проблемам, поскольку что-то вроде этого:

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

Будет давать

http% 3a% 2f% 2fwww.google.com% 2fsearch% 3fq% 3dExample

Очевидно, это не сработает. Вместо этого вы должны кодировать ТОЛЬКО значение пары ключ / значение в строке запроса, например:

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

Надеюсь, это поможет. Кроме того, как упоминалось в teedyay, вам все равно необходимо убедиться, что незаконный файл -name символы удаляются, иначе файловой системе не понравится путь.

person Dan Herbert    schedule 22.02.2009
comment
Использование метода HttpUtility.UrlPathEncode должно предотвратить проблему, которую вы здесь описываете. - person vipirtti; 09.03.2009
comment
@DJ Pirtu: Верно, что UrlPathEncode не будет вносить эти нежелательные изменения в путь, однако он также не будет ничего кодировать после ? (поскольку предполагается, что строка запроса уже закодирована). В примере Дэна Герберта похоже, что он притворяется, что Example - это текст, требующий кодирования, поэтому HttpUtility.UrlPathEncode("http://www.google.com/search?q=Example"); не сработает. Попробуйте это с ?q=Ex&ple (где желаемый результат - ?q=Ex%26ple). Это не сработает, потому что (1) UrlPathEncode ничего не касается после ? и (2) UrlPathEncode все равно не кодирует &. - person Tim Goodman; 29.11.2010
comment
См. Здесь: connect.microsoft.com / VisualStudio / feedback / details / 551839 / Я должен добавить, что, конечно, хорошо, что UrlPathEncode не кодирует &, потому что это необходимо для разграничения параметров строки запроса. Но бывают случаи, когда вам также нужны закодированные амперсанды. - person Tim Goodman; 29.11.2010
comment
HttpUtility заменяется WebUtility в последних версиях, сэкономьте время :) - person Wiseman; 11.04.2014

Лучше использовать

Uri.EscapeUriString

не ссылаться на полный профиль .net 4.

person Siarhei Kuchuk    schedule 15.09.2011
comment
Полностью согласен, поскольку часто профиля клиента достаточно для приложений, использующих System.Net, но не использующих System.Web ;-) - person hfrmobile; 07.09.2012
comment
OP говорит о проверке совместимости файловой системы, так что это не сработает. Запрещенный набор символов Windows - '[/, \\, ‹,›,:, \, |,?, *]', Но многие из них не кодируются с помощью EscapedUriString (см. Таблицу ниже - спасибо за эту таблицу @Simon Tewsi ) ... создает путь на своем локальном компьютере -OP UrlEncoded решает почти все проблемы, но не решает проблему с% или% 3f, находящимися на исходном входе, поскольку декодирование теперь будет отличаться от исходного. - person m1m1k; 07.02.2013
comment
просто чтобы прояснить: ЭТОТ ответ НЕ РАБОТАЕТ для файловых систем - person m1m1k; 07.02.2013
comment
Кроме того, начиная с .NET Framework 4.5, профиль клиента был прекращен, и доступен только полный распространяемый пакет. - person twomm; 19.02.2013
comment
stackoverflow.com/a/34189188/3436164 Используйте Uri.EscapeDataString НЕ Uri.EscapeUriString Прочтите этот комментарий, он мне помог. - person ykadaru; 13.03.2017

Начиная с .NET Framework 4.5 и .NET Standard 1.0, следует использовать _ 1_. Преимущества перед альтернативами:

  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, поэтому не требует дополнительных ссылок, в отличие от HttpUtility.

  3. Он правильно экранирует символы для URL-адресов, в отличие от Uri.EscapeUriString (см. комментарии к ответу drweb86).

  4. Он не имеет ограничений на длину строки, в отличие от Uri.EscapeDataString (см. связанный с этим вопрос), поэтому его можно использовать, например, для запросов POST.

person Athari    schedule 03.06.2013
comment
Мне нравится, как он кодирует, используя + вместо% 20 для пробелов .. но этот по-прежнему не удаляется из URL-адреса и дает мне недопустимый URL-адрес ... да ладно ... просто нужно будет заменить (,) - person Piotr Kula; 15.05.2017

Леви Ботельо прокомментировал, что таблица кодировок, которая была сгенерирована ранее, больше не является точной для .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]

Столбцы представляют следующие кодировки:

  • UrlEncoded: HttpUtility.UrlEncode
  • UrlEncodedUnicode: HttpUtility.UrlEncodeUnicode
  • UrlPathEncoded: HttpUtility.UrlPathEncode
  • WebUtilityUrlEncoded: WebUtility.UrlEncode
  • EscapedDataString: Uri.EscapeDataString
  • EscapedUriString: Uri.EscapeUriString
  • HtmlEncoded: HttpUtility.HtmlEncode
  • HtmlAttributeEncoded: HttpUtility.HtmlAttributeEncode
  • WebUtilityHtmlЗакодировано: WebUtility.HtmlEncode
  • HexEscaped: Uri.HexEscape

ПРИМЕЧАНИЯ:

  1. HexEscape может обрабатывать только первые 255 символов. Поэтому он вызывает исключение ArgumentOutOfRange для латинских символов A-Extended (например, Ā).

  2. Эта таблица была создана в .NET 4.5 (см. Ответ https://stackoverflow.com/a/11236038/216440 для кодировки, относящиеся к .NET 4.0 и ниже).

РЕДАКТИРОВАТЬ:

  1. В результате ответа Discord я добавил новые методы WebUtility UrlEncode и HtmlEncode, которые были представлены в .NET 4.5.
person Simon Tewsi    schedule 14.02.2014
comment
Нет, не пользовательский UrlPathEncode - даже MSDN говорит, что его нельзя использовать. Он был создан для устранения проблемы с netscape 2 msdn.microsoft.com/en-us/library/ - person Jeff; 21.03.2014
comment
Является ли Server.URLEncode еще одним вариантом этой темы? Создает ли он другой результат? - person ALEXintlsos; 18.11.2015
comment
@ALEX: в ASP.NET объект Server является экземпляром HttpServerUtility. Используя декомпилятор dotPeek, я взглянул на HttpServerUtility.UrlEncode. Он просто вызывает HttpUtility.UrlEncode, поэтому выходные данные двух методов будут идентичными. - person Simon Tewsi; 19.11.2015
comment
Похоже, что даже с таким изобилием методов кодирования, все они по-прежнему довольно сильно терпят неудачу для всего, что выше Latin-1, например → или ☠. (UrlEncodedUnicode кажется, что он, по крайней мере, пытается поддерживать Unicode, но устарел / отсутствует.) - person brianary; 15.12.2015
comment
Саймон, ты можешь просто интегрировать этот ответ в принятый ответ? было бы хорошо иметь это в одном ответе. вы можете интегрировать его и сделать заголовок h1 внизу этого ответа или объединить в одну таблицу и отметить разные строки, например: (Net4.0) ? %3f................................ (Net4.5) ? %3f .................................. - person T.Todua; 18.09.2017
comment
К сожалению, URL-адрес мне нужен _1 _- ›_ 2_, = -› %3D, [space] - ›%20. но я не хочу переходить на 4.0 - person Trương Quốc Khánh; 14.09.2020

Кодирование URL-адресов в .NET выполняется просто. Использовать:

System.Web.HttpUtility.UrlEncode(string url)

Если это будет декодировано для получения имени папки, вам все равно придется исключить символы, которые нельзя использовать в именах папок (*,?, / И т. Д.)

person teedyay    schedule 22.02.2009
comment
Кодирует ли он каждый символ, не входящий в алфавит? - person masfenix; 22.02.2009
comment
Кодирование URL-адреса преобразует символы, которые не разрешены в URL-адресе, в эквиваленты символьных сущностей. Список небезопасных символов: blooberry.com/indexdot/html/topics/urlencoding.htm - person Ian Robinson; 22.02.2009
comment
Ссылка MSDN на HttpUtility.UrlEncode: msdn.microsoft.com/en-us/library /4fkewx0t.aspx - person Ian Robinson; 22.02.2009
comment
Хорошая практика - включить в свой ответ полную часть System.Web ..., это сэкономит много людей немного времени :) спасибо - person Liam; 24.04.2009
comment
Это опасно: нужно кодировать не весь символ url, а только значения параметров строки запроса. Предлагаемый вами способ также закодирует &, который необходим для создания нескольких параметров в строке запроса. Суть в том, чтобы при необходимости закодировать каждое значение параметров. - person Marco Staffoli; 21.01.2013

Если вы не видите System.Web, измените настройки проекта. Целевая платформа должна быть «.NET Framework 4» вместо «.NET Framework 4 Client Profile».

person useful    schedule 20.03.2011
comment
На мой взгляд, разработчики должны знать о профилях .NET и использовать правильный для своих целей! Просто добавить полный профиль, чтобы получить (например, System.Web), не зная, зачем они добавляют полный профиль, не очень умно. Используйте профиль клиента для своих клиентских приложений и полный профиль только при необходимости (например, клиент WinForms или WPF должен использовать профиль клиента, а не полный профиль)! например Я не вижу причин использовать HttpServerUtility в клиентском приложении ^^ ... если это необходимо, значит, что-то не так с дизайном приложения! - person hfrmobile; 26.10.2012
comment
Действительно? Вы когда-нибудь не видите необходимости в клиентском приложении для создания URL-адреса? Чем вы зарабатываете на жизнь - уборщицей? - person sproketboy; 27.03.2013
comment
@hfrmobile: нет. Все не так с профильной моделью (которая существовала всего один раз и от которой отказались в следующей версии). И это было очевидно с самого начала. Для вас это сейчас очевидно? Сначала подумайте, не принимайте все «как есть», что MSFT пытается вам продать; P - person abatishchev; 19.01.2014
comment
Извините, но я никогда не говорил, что клиенту никогда не нужно создавать / использовать URL. Пока используется .NET 4.0, пользователь должен об этом заботиться. Короче говоря: разработчики должны дважды подумать, прежде чем добавлять HttpServerUtility к клиенту. Есть другие / лучшие способы, просто посмотрите ответ с 139 голосами или Начиная с .NET Framework 4.5, вы можете использовать WebUtility.UrlEncode. Во-первых, он находится в System.dll, поэтому не требует дополнительных ссылок. - person hfrmobile; 20.01.2014

Реализация UrlEncode в .NET не соответствует RFC 3986.

  1. Некоторые символы не закодированы, но должны быть. Символы !()* перечислены в разделе 2.2 RFC как зарезервированные символы, которые необходимо кодировать, но .NET не может кодировать эти символы.

  2. Некоторые символы закодированы, но не должны. Символы .-_ не указаны в разделе 2.2 RFC как зарезервированные символы, которые не должны кодироваться, однако .NET ошибочно кодирует эти символы.

  3. RFC указывает, что для обеспечения согласованности реализации должны использовать HEXDIG в верхнем регистре, а .NET создает HEXDIG в нижнем регистре.

person Charlie    schedule 21.05.2013

Я думаю, что люди здесь отвлеклись на сообщение UrlEncode. URLEncoding - это не то, что вы хотите - вы хотите кодировать материал, который не будет работать как имя файла в целевой системе.

Предполагая, что вам нужна некоторая общность - не стесняйтесь находить недопустимые символы в нескольких системах (MacOS, Windows, Linux и Unix), объединяйте их, чтобы сформировать набор символов, которые нужно убрать.

Что касается экранирования, HexEscape подойдет (замена символов на% XX). Преобразуйте каждый символ в байты UTF-8 и закодируйте все> 128, если вы хотите поддерживать системы, которые не поддерживают Unicode. Но есть и другие способы, такие как обратная косая черта "\" или кодировка HTML "". Вы можете создать свой собственный. Все, что нужно сделать любой системе, - это «закодировать» несовместимый символ. Вышеупомянутые системы позволяют воссоздать исходное имя, но также работает что-то вроде замены плохих символов пробелами.

По той же касательной, что и выше, можно использовать только

Uri.EscapeDataString

- Он кодирует все, что необходимо для OAuth, он не кодирует то, что OAuth запрещает кодирование, и кодирует пространство как% 20, а не + (также в спецификации OATH) См .: RFC 3986. AFAIK, это последняя спецификация URI.

person Gerard ONeill    schedule 29.01.2019

Я написал метод C #, который кодирует ВСЕ символы в URL:

    /// <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();
    }
person Sergey    schedule 02.11.2017

В идеале они должны входить в класс под названием «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 за очень полезную таблицу выше!

person m1m1k    schedule 08.02.2013
comment
также полезно: Path.GetInvalidFileNameChars() - person m1m1k; 09.02.2013
comment
да. Вот один из способов сделать это: foreach (char c в System.IO.Path.GetInvalidFileNameChars ()) {filename = filename.Replace (c, '_'); } - person netfed; 25.06.2013

В дополнение к ответу @Dan Herbert, вы должны кодировать только значения в целом.

Split имеет параметр params 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);
        }
    }
}
person Davut Gürbüz    schedule 01.03.2013