472 votes

Le Codage d'URL à l'aide de C#

J'ai une application que j'ai développée pour un ami. Il envoie une requête POST vers le forum VB logiciel et les journaux de quelqu'un (avec la configuration des cookies ou quoi que ce soit).

Une fois que l'utilisateur est connecté, j'ai créer une variable qui crée un chemin d'accès sur leur ordinateur local.

c:\tempfolder\date\username

Le problème est que certains noms d'utilisateurs sont à jeter "Illégal chars" l'exception". Par exemple, si mon nom d'utilisateur a été mas|fenix il lancerait une exception..

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

Je ne veux pas l'enlever de la chaîne, mais un dossier avec leur nom d'utilisateur est créé par FTP sur un serveur. Ce qui les amène à ma deuxième question. Si je crée un dossier sur le serveur puis-je quitter "les caractères"? Je ne demander ce parce que le serveur est basé sur Linux, et je ne sais pas si Linux accepte ou non..

EDIT: Il semble que les encoder n'est PAS ce que je veux.. Voici ce que je veux faire:

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

Où %xx est la valeur ASCII ou toute autre valeur qui pourrait facilement s'identifier au personnage.

750voto

Simon Tewsi Points 2785

J'ai fait des expériences avec les différentes méthodes .NET fournir pour l'encodage de l'URL. Peut-être le tableau ci-dessous seront utiles (comme la sortie d'une application de test que j'ai écrit):

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
C         C          C                 C              C                 C                C           C                    %43
D         D          D                 D              D                 D                D           D                    %44

a         a          a                 a              a                 a                a           a                    %61
b         b          b                 b              b                 b                b           b                    %62
c         c          c                 c              c                 c                c           c                    %63
d         d          d                 d              d                 d                d           d                    %64

0         0          0                 0              0                 0                0           0                    %30
1         1          1                 1              1                 1                1           1                    %31
2         2          2                 2              2                 2                2           2                    %32
3         3          3                 3              3                 3                3           3                    %33

[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
+         %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]

Les colonnes représentent les encodages comme suit:

UrlEncoded: HttpUtility.UrlEncode

UrlEncodedUnicode: HttpUtility.UrlEncodeUnicode

UrlPathEncoded: HttpUtility.UrlPathEncode

EscapedDataString: Uri.EscapeDataString

EscapedUriString: Uri.EscapeUriString

HtmlEncoded: HttpUtility.HtmlEncode

HtmlAttributeEncoded: HttpUtility.HtmlAttributeEncode

HexEscaped: Uri.HexEscape

NOTES:

  1. HexEscape ne peut gérer que les 255 premiers caractères. Par conséquent, il jette un ArgumentOutOfRange exception de l'amérique latine-des caractères Étendus (par exemple Ā).

  2. Ce tableau a été généré .NET 4.0 (voir Lévi Botelho de commentaire ci-dessous qui dit que le codage .NET 4.5, est légèrement différente).

EDIT:

J'ai ajouté une deuxième table avec les codages .NET 4.5. Voir cette réponse: http://stackoverflow.com/a/21771206/216440

EDIT 2:

Puisque les gens semblent apprécier ces tables, j'ai pensé que vous aimeriez le code source qui génère la table, de sorte que vous pouvez jouer autour de vous. C'est une simple application console C#, qui peuvent cibler .NET 4.0 ou 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();
            }
        }
    }
}

335voto

Dan Herbert Points 38336

Vous devez encoder le nom d'utilisateur ou une autre partie de l'URL qui pourrait être nulle. Le codage d'URL une URL peut conduire à des problèmes depuis quelque chose comme ceci:

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

Rendement

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

Ce n'est évidemment pas d'aller travailler. Au lieu de cela, vous devez encoder UNIQUEMENT la valeur de la paire clé/valeur dans la chaîne de requête, comme ceci:

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

J'espère que ça aide. Aussi, comme teedyay mentionné, vous aurez toujours besoin pour s'assurer illégal de nom de fichier caractères sont retirés ou le système de fichiers n'aime pas le chemin.

234voto

drweb86 Points 1340

Meilleure façon est d'utiliser

Uri.EscapeUriString

pas de référence le Profil Complet de .net 4.

210voto

Athari Points 7821

Depuis .NET Framework 4.5 , vous pouvez utiliser WebUtility.UrlEncode.

Tout d'abord, il réside en System.dll, de sorte qu'il ne nécessite pas d'autres références.

Deuxièmement, elle correctement échappe les caractères pour les Url, contrairement à Uri.EscapeUriString (voir les commentaires relatifs à drweb86 de réponse).

Troisièmement, il n'a pas de limites sur la longueur de la chaîne, contrairement à Uri.EscapeDataString (voir la question connexe), de sorte qu'il peut être utilisé pour les requêtes POST, par exemple.

Quatrièmement, il est disponible sur WinRT, contrairement à HttpUtility (voir la question connexe).

209voto

Gregory A Beamer Points 10975

Encodage à faire ce que vous suggérez ici. Avec C#, il vous suffit d'utiliser HttpUtility, comme indiqué.

Vous pouvez également Regex les caractères illégaux et puis le remplacer, mais cela devient beaucoup plus complexe, car vous devrez avoir une certaine forme de machine d'état (interrupteur..., par exemple) pour les remplacer par les caractères corrects. Depuis UrlEncode cela jusqu'à l'avant, il est plutôt facile.

Comme pour Linux contre windows, il y a certains personnages qui sont acceptables dans Linux qui ne sont pas dans Windows, mais je ne serais pas s'inquiéter à ce sujet, que le nom du dossier peut être renvoyé par le décodage de la chaîne d'Url, en utilisant UrlDecode, de sorte que vous pouvez aller-retour les modifications.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X