J’ai une application qui envoie une requête POST au logiciel de forum VB et connecte quelqu’un (sans définir de cookies ou autre).
Une fois que l’utilisateur est connecté, je crée une variable qui crée un chemin sur son ordinateur local.
c: \ tempfolder \ date \ nom d’utilisateur
Le problème est que certains noms d’utilisateur génèrent une exception de “caractères illégaux”. Par exemple, si mon nom d’utilisateur était mas|fenix
cela créerait une exception.
Path.Combine( _ Environment.GetFolderPath(System.Environment.SpecialFolder.CommonApplicationData), _ DateTime.Now.ToSsortingng("ddMMyyhhmm") + "-" + form1.username)
Je ne veux pas le supprimer de la chaîne, mais un dossier avec leur nom d’utilisateur est créé via FTP sur un serveur. Et cela mène à ma deuxième question. Si je crée un dossier sur le serveur, puis-je laisser les “caractères illégaux” dans? Je ne le demande que parce que le serveur est basé sur Linux, et je ne suis pas sûr que Linux l’accepte ou non.
EDIT: Il semble que le codage URL ne soit 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 permettant d’identifier facilement le caractère.
Edit: Notez que cette réponse est maintenant obsolète. Voir la réponse de Siarhei Kuchuk ci-dessous pour une meilleure solution
UrlEncoding fera ce que vous proposez ici. Avec C #, vous utilisez simplement HttpUtility
, comme mentionné.
Vous pouvez également regex les caractères illégaux, puis les remplacer, mais cela devient beaucoup plus complexe, car vous devrez avoir une forme de machine à états (switch … case, par exemple) pour remplacer par les caractères corrects. Comme UrlEncode
fait à l’avance, c’est plutôt facile.
En ce qui concerne Linux et Windows, certains caractères sont acceptables sous Linux, mais je ne m’en préoccuperais pas, car le nom du dossier peut être renvoyé en décodant la chaîne d’URL, en utilisant UrlDecode
. les changements.
J’ai expérimenté avec les différentes méthodes que .NET fournit pour le codage d’URL. Le tableau suivant sera peut-être utile (en tant que sortie d’une application de test que j’ai écrite):
Unencoded UrlEncoded UrlEncodedUnicode UrlPathEncoded EscapedDataSsortingng EscapedUriSsortingng HtmlEncoded HtmlAtsortingbuteEncoded HexEscaped AAAAAAAA %41 BBBBBBBB %42 aaaaaaaa %61 bbbbbbbb %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 < < %3C = %3d %3d = %3D = = = %3D > %3e %3e > %3E %3E > > %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 codages comme suit:
UrlEncoded: HttpUtility.UrlEncode
UrlEncodedUnicode: HttpUtility.UrlEncodeUnicode
UrlPathEncoded: HttpUtility.UrlPathEncode
EscapedDataSsortingng: Uri.EscapeDataSsortingng
Uri.EscapeUriSsortingng
: Uri.EscapeUriSsortingng
HtmlEncoded: HttpUtility.HtmlEncode
HtmlAtsortingbuteEncoded: HttpUtility.HtmlAtsortingbuteEncode
HexEscaped: Uri.HexEscape
REMARQUES:
HexEscape
ne peut gérer que les 255 premiers caractères. Par conséquent, il génère une exception ArgumentOutOfRange
pour les caractères Latin A-Extended (par exemple).
Cette table a été générée dans .NET 4.0 (voir le commentaire de Levi Botelho ci-dessous qui indique que l’encodage dans .NET 4.5 est légèrement différent).
MODIFIER:
J’ai ajouté une deuxième table avec les encodages pour .NET 4.5. Voir cette réponse: https://stackoverflow.com/a/21771206/216440
EDIT 2:
Puisque les gens semblent apprécier ces tableaux, j’ai pensé que vous aimeriez peut-être que le code source qui génère la table vous permette de vous amuser. C’est une application console C # simple, capable de 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(ssortingng[] args) { EncodeSsortingngs(); Console.WriteLine(); Console.WriteLine("Press any key to continue..."); Console.Read(); } public static void EncodeSsortingngs() { ssortingng ssortingngToEncode = "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> columnDetails = new Dictionary>(); columnDetails.Add("Unencoded", (unencodedSsortingng => unencodedSsortingng)); columnDetails.Add("UrlEncoded", (unencodedSsortingng => HttpUtility.UrlEncode(unencodedSsortingng))); columnDetails.Add("UrlEncodedUnicode", (unencodedSsortingng => HttpUtility.UrlEncodeUnicode(unencodedSsortingng))); columnDetails.Add("UrlPathEncoded", (unencodedSsortingng => HttpUtility.UrlPathEncode(unencodedSsortingng))); columnDetails.Add("EscapedDataSsortingng", (unencodedSsortingng => Uri.EscapeDataSsortingng(unencodedSsortingng))); columnDetails.Add("EscapedUriSsortingng", (unencodedSsortingng => Uri.EscapeUriSsortingng(unencodedSsortingng))); columnDetails.Add("HtmlEncoded", (unencodedSsortingng => HttpUtility.HtmlEncode(unencodedSsortingng))); columnDetails.Add("HtmlAtsortingbuteEncoded", (unencodedSsortingng => HttpUtility.HtmlAtsortingbuteEncode(unencodedSsortingng))); columnDetails.Add("HexEscaped", (unencodedSsortingng => { // 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(unencodedSsortingng.ToCharArray()[0]); } catch { return "[OoR]"; } })); char[] charactersToEncode = ssortingngToEncode.ToCharArray(); ssortingng[] ssortingngCharactersToEncode = Array.ConvertAll(charactersToEncode, (character => character.ToSsortingng())); DisplayCharacterTable(ssortingngCharactersToEncode, columnDetails); } private static void DisplayCharacterTable(TUnencoded[] unencodedArray, Dictionary> mappings) { foreach (ssortingng key in mappings.Keys) { Console.Write(key.Replace(" ", "[space]") + " "); } Console.WriteLine(); foreach (TUnencoded unencodedObject in unencodedArray) { ssortingng ssortingngCharToEncode = unencodedObject.ToSsortingng(); foreach (ssortingng columnHeader in mappings.Keys) { int columnWidth = columnHeader.Length + 1; Func encoder = mappings[columnHeader]; ssortingng encodedSsortingng = encoder(unencodedObject); // ASSUMPTION: Column header will always be wider than encoded ssortingng. Console.Write(encodedSsortingng.Replace(" ", "[space]").PadRight(columnWidth)); } Console.WriteLine(); } } } }
Vous devez encoder uniquement le nom d’utilisateur ou toute autre partie de l’URL qui pourrait être invalide. L’URL encodant une URL peut entraîner des problèmes car quelque chose comme ceci:
ssortingng url = HttpUtility.UrlEncode("http://www.google.com/search?q=Example");
Va céder
http% 3a% 2f% 2fwww.google.com% 2fsearch% 3fq% 3dExample
Cela ne va évidemment pas bien fonctionner. Au lieu de cela, vous devez coder UNIQUEMENT la valeur de la paire clé / valeur dans la chaîne de requête, comme ceci:
ssortingng url = "http://www.google.com/search?q=" + HttpUtility.UrlEncode("Example");
J’espère que ça aide. De plus, comme mentionné précédemment, vous devrez toujours vous assurer que les caractères de noms de fichiers illégaux sont supprimés ou que le système de fichiers n’aimera pas le chemin.
Depuis .NET Framework 4.5, vous pouvez utiliser WebUtility.UrlEncode
.
Tout d’abord, il réside dans System.dll
, il ne nécessite donc aucune référence supplémentaire.
Deuxièmement, il échappe correctement aux caractères pour les URL , contrairement à Uri.EscapeUriSsortingng
(voir les commentaires sur la réponse de drweb86).
Troisièmement, la longueur de la chaîne n’est pas limitée , contrairement à Uri.EscapeDataSsortingng
(voir la question associée ). Par exemple, elle peut être utilisée pour les requêtes POST.
Quasortingèmement, il est disponible sur WinRT , contrairement à HttpUtility
(voir la question associée ).
Le meilleur moyen est d’utiliser
Uri.EscapeUriSsortingng
pour ne pas référencer le profil complet de .net 4.
Levi Botelho a commenté que la table des encodages précédemment générée n’est plus précise pour .NET 4.5, puisque les encodages ont légèrement changé entre .NET 4.0 et 4.5. J’ai donc régénéré la table pour .NET 4.5:
Unencoded UrlEncoded UrlEncodedUnicode UrlPathEncoded WebUtilityUrlEncoded EscapedDataSsortingng EscapedUriSsortingng HtmlEncoded HtmlAtsortingbuteEncoded WebUtilityHtmlEncoded HexEscaped AAAAAAAAAA %41 BBBBBBBBBB %42 aaaaaaaaaa %61 bbbbbbbbbb %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 " " " %22 # %23 %23 # %23 %23 # # # # %23 $ %24 %24 $ %24 %24 $ $ $ $ %24 % %25 %25 % %25 %25 %25 % % % %25 & %26 %26 & %26 %26 & & & & %26 ' %27 %27 ' %27 %27 ' ' ' ' %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 < < < %3C = %3d %3d = %3D %3D = = = = %3D > %3e %3e > %3E %3E %3E > > > %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]
Les colonnes représentent les codages comme suit:
HttpUtility.UrlEncode
HttpUtility.UrlEncodeUnicode
HttpUtility.UrlPathEncode
WebUtility.UrlEncode
Uri.EscapeDataSsortingng
Uri.EscapeUriSsortingng
: Uri.EscapeUriSsortingng
HttpUtility.HtmlEncode
HttpUtility.HtmlAtsortingbuteEncode
WebUtility.HtmlEncode
Uri.HexEscape
REMARQUES:
HexEscape ne peut gérer que les 255 premiers caractères. Par conséquent, il génère une exception ArgumentOutOfRange pour les caractères Latin A-Extended (par exemple).
Ce tableau a été généré dans .NET 4.5 (voir la réponse https://stackoverflow.com/a/11236038/216440 pour les encodages relatifs à .NET 4.0 et versions ultérieures).
MODIFIER:
L’encodage URL est facile dans .NET. Utilisation:
System.Web.HttpUtility.UrlEncode(ssortingng url)
Si cela est décodé pour obtenir le nom du dossier, vous devrez toujours exclure les caractères qui ne peuvent pas être utilisés dans les noms de dossiers (*,?, /, Etc.)
Si vous ne pouvez pas voir System.Web, modifiez les parameters de votre projet. Le framework cible doit être “.NET Framework 4” au lieu de “.NET Framework 4 Client Profile”
L’implémentation .NET de UrlEncode
n’est pas conforme à RFC 3986.
Certains caractères ne sont pas encodés mais devraient l’être. Les caractères !()*
Sont répertoriés dans la section 2.2 de la RFC sous la forme d’un caractère réservé devant être encodé .NET ne parvient pas à encoder ces caractères.
Certains caractères sont encodés mais ne devraient pas l’être. Les caractères .-_
Ne sont pas répertoriés dans la section 2.2 de la RFC comme un caractère réservé qui ne doit pas être codé .NET encode à tort ces caractères.
La RFC spécifie que pour être cohérentes, les implémentations doivent utiliser les majuscules HEXDIG, où .NET produit des HEXDIG minuscules.
Idéalement, ceux-ci iraient dans une classe appelée “FileNaming” ou simplement renommer Encode en “FileNameEncode”. Remarque: ils ne sont pas conçus pour gérer les chemins d’access complets, mais uniquement les noms de dossier et / ou de fichier. Idéalement, vous devez d’abord diviser (“/”) votre chemin complet, puis vérifier les pièces. Et évidemment, au lieu d’une union, vous pouvez simplement append le caractère “%” à la liste des caractères non autorisés dans Windows, mais je pense que c’est plus utile / lisible / factuel de cette manière. Decode () est exactement le même mais change le Replace (Uri.HexEscape (s [0]), s) “échappé” avec le caractère.
public static List urlEncodedCharacters = new List { "/", "\\", "<", ">", ":", "\"", "|", "?", "%" //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 specialCharactersNotAllowedInWindows = new List { "/", "\\", "<", ">", ":", "\"", "|", "?", "*" //windows dissallowed character set }; public static ssortingng Encode(ssortingng fileName) { //CheckForFullPath(fileName); // optional: make sure it's not a path? List charactersToChange = new List (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; }
Merci @ simon-tewsi pour la table très utile ci-dessus!
J’ai écrit une méthode C # qui encode tous les symboles:
/// /// !#$345Hf} → %21%23%24%33%34%35%48%66%7D /// public static ssortingng UrlEncodeExtended( ssortingng value ) { char[] chars = value.ToCharArray(); SsortingngBuilder encodedValue = new SsortingngBuilder(); foreach (char c in chars) { encodedValue.Append( "%" + ( (int)c ).ToSsortingng( "X2" ) ); } return encodedValue.ToSsortingng(); }
En plus de la réponse de @Dan Herbert, vous devez encoder uniquement les valeurs en général.
Split a le paramètre params Split (‘&’, ‘=’); expression d’abord divisée par & then ‘=’ donc les éléments impairs sont toutes les valeurs à encoder indiquées ci-dessous.
public static void EncodeQuerySsortingng(ref ssortingng querySsortingng) { var array=querySsortingng.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); } } }