Кодирование URL с использованием C # - PullRequest
297 голосов
/ 22 февраля 2009

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

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

C: \ TempFolder \ дата \ имя пользователя

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

Ответы [ 13 ]

1 голос
/ 09 февраля 2013

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

0 голосов
/ 30 января 2019

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

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

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

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

Uri.EscapeDataString

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

0 голосов
/ 01 марта 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);
        }
    }
}
...