468 Stimmen

URL-Kodierung mit C#

Ich habe eine Anwendung, die eine POST-Anfrage an die VB-Forensoftware sendet und jemanden anmeldet (ohne Cookies oder ähnliches zu setzen).

Sobald der Benutzer angemeldet ist, erstelle ich eine Variable, die einen Pfad auf seinem lokalen Rechner erstellt.

c: \tempfolder\date\username

Das Problem ist, dass einige Benutzernamen eine "Illegal chars"-Ausnahme auslösen. Zum Beispiel, wenn mein Benutzername war mas|fenix würde es eine Ausnahme auslösen.

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

Ich möchte sie nicht aus dem String entfernen, aber ein Ordner mit ihrem Benutzernamen wird per FTP auf einem Server erstellt. Und das führt zu meiner zweiten Frage. Wenn ich einen Ordner auf dem Server erstelle, kann ich dann die "illegalen Zeichen" drin lassen? Ich frage das nur, weil der Server auf Linux basiert und ich mir nicht sicher bin, ob Linux das akzeptiert oder nicht.

EDIT: Es scheint, dass die URL-Kodierung nicht das ist, was ich will Hier ist, was ich tun möchte:

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

Dabei ist %xx der ASCII-Wert oder ein anderer Wert, mit dem das Zeichen leicht identifiziert werden kann.

5voto

Sergey Punkte 775

Ich habe eine C#-Methode geschrieben, die ALLE Symbole url-kodiert:

    /// <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();
    }

1voto

m1m1k Punkte 1298

Idealerweise würden diese in einer Klasse namens "FileNaming" gehen oder vielleicht einfach umbenennen Encode zu "FileNameEncode". Hinweis: Diese Klassen sind nicht dafür ausgelegt, vollständige Pfade zu verarbeiten, sondern nur die Ordner- und/oder Dateinamen. Idealerweise würde man zuerst den vollständigen Pfad aufteilen("/") und dann die Teile überprüfen. Und natürlich könnte man anstelle einer Vereinigung auch einfach das "%"-Zeichen in die Liste der in Windows nicht erlaubten Zeichen aufnehmen, aber ich denke, dass es auf diese Weise hilfreicher/lesbarer/faktischer ist. Decode() ist genau dasselbe, ersetzt aber Replace(Uri.HexEscape(s[0]), s) durch das Zeichen "escaped".

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

Danke @simon-tewsi für die sehr nützliche Tabelle oben!

0voto

Davut Gürbüz Punkte 5082

Ergänzend zu @Dan Herberts Antwort, Sie sollten generell nur die Werte kodieren.

Split hat den Parameter Split('&','='); der Ausdruck wird zuerst durch & und dann durch '=' aufgespalten, so dass alle ungeraden Elemente zu kodierende Werte sind (siehe unten).

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

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X