У меня есть приложение, которое отправляет запрос 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 или любое другое значение, которое легко идентифицирует символ.
Ответы:
Изменить: Обратите внимание, что этот ответ устарел. Смотрите ответ Сергея Кучука ниже для лучшего решения
UrlEncoding сделает то, что вы предлагаете здесь. С C # вы просто используете
HttpUtility
, как уже упоминалось.Вы также можете переопределить недопустимые символы и затем заменить, но это становится гораздо более сложным, так как вам потребуется некоторая форма конечного автомата (например, switch ... case) для замены правильными символами. Так как
UrlEncode
делает это заранее, это довольно легко.Что касается Linux и Windows, в Linux есть некоторые символы, которые не подходят для Windows, но я не стал бы беспокоиться об этом, поскольку имя папки можно вернуть, расшифровав строку Url, используя
UrlDecode
, чтобы вы могли использовать меняется.источник
A potentially dangerous Request.Path value was detected from the client
.Я экспериментировал с различными методами .NET для кодирования URL. Возможно, следующая таблица будет полезна (как вывод из тестового приложения, которое я написал):
Столбцы представляют кодировки следующим образом:
UrlEncoded:
HttpUtility.UrlEncode
UrlEncodedUnicode:
HttpUtility.UrlEncodeUnicode
UrlPathEncoded:
HttpUtility.UrlPathEncode
EscapedDataString:
Uri.EscapeDataString
EscapedUriString:
Uri.EscapeUriString
HtmlEncoded:
HttpUtility.HtmlEncode
HtmlAttributeEncoded:
HttpUtility.HtmlAttributeEncode
HexEscaped:
Uri.HexEscape
НОТЫ:
HexEscape
может обрабатывать только первые 255 символов. Поэтому он генерируетArgumentOutOfRange
исключение для латинских символов A-Extended (например, Ā).Эта таблица была сгенерирована в .NET 4.0 (см. Комментарий Леви Ботелхо ниже, в котором говорится, что кодировка в .NET 4.5 немного отличается).
РЕДАКТИРОВАТЬ:
Я добавил вторую таблицу с кодировками для .NET 4.5. Смотрите этот ответ: https://stackoverflow.com/a/21771206/216440
РЕДАКТИРОВАТЬ 2:
Поскольку люди, похоже, ценят эти таблицы, я подумал, что вам может понравиться исходный код, который генерирует таблицу, поэтому вы можете поиграть с самим собой. Это простое консольное приложение C #, которое может быть нацелено на .NET 4.0 или 4.5:
источник
Uri.EscapeUriString
, но остерегайтесь, он не поддерживаетnull
аргумент.UrlPathEncode
. Так что в основном заменитьUrlPathEncode
наUri.EscapeUriString
.Вы должны кодировать только имя пользователя или другую часть URL, которая может быть недействительной. URL кодирование URL может привести к проблемам, так как что-то вроде этого:
Даст
Это явно не сработает. Вместо этого вы должны кодировать ТОЛЬКО значение пары ключ / значение в строке запроса, например:
Надеюсь, это поможет. Кроме того , как teedyay упоминалось, вы все равно должны убедиться , что недопустимые символы имени файла удаляются или иначе файловая система не будет как путь.
источник
?
(поскольку предполагается, что строка запроса уже закодирована). В примере Дэна Герберта, похоже, он притворяетсяExample
, что текст требует кодировки, поэтомуHttpUtility.UrlPathEncode("http://www.google.com/search?q=Example");
не будет работать. Попробуйте это с?q=Ex&ple
(где желаемый результат?q=Ex%26ple
). Это не будет работать, потому что (1) UrlPathEncode ничего не трогает после?
, и (2) UrlPathEncode все равно не кодирует&
.&
, потому что это необходимо для разделения параметров строки запроса. Но бывают случаи, когда вам нужны закодированные амперсанды.Лучше использовать
Uri.EscapeUriString
не ссылаться на полный профиль .net 4.
источник
Uri.EscapeDataString
НЕUri.EscapeUriString
Прочитайте этот комментарий, он мне помог.Начиная с .NET Framework 4.5 и .NET Standard 1.0 вы должны использовать
WebUtility.UrlEncode
. Преимущества перед альтернативами:Он является частью .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 (см. связанный вопрос ).В .NET Framework он находится
System.dll
, поэтому не требует никаких дополнительных ссылок, в отличие отHttpUtility
.Это отличие от правильно экранирует символы для URL
Uri.EscapeUriString
(см. Комментарии к ответу drweb86 ).Он не имеет никаких ограничений на длину строки , в отличие от
Uri.EscapeDataString
(см. Связанный вопрос ), поэтому его можно использовать, например, для запросов POST.источник
Леви Ботельхо прокомментировал, что таблица кодировок, которая была сгенерирована ранее, больше не является точной для .NET 4.5, так как кодировки немного изменились между .NET 4.0 и 4.5. Итак, я восстановил таблицу для .NET 4.5:
Столбцы представляют кодировки следующим образом:
HttpUtility.UrlEncode
HttpUtility.UrlEncodeUnicode
HttpUtility.UrlPathEncode
WebUtility.UrlEncode
Uri.EscapeDataString
Uri.EscapeUriString
HttpUtility.HtmlEncode
HttpUtility.HtmlAttributeEncode
WebUtility.HtmlEncode
Uri.HexEscape
НОТЫ:
HexEscape может обрабатывать только первые 255 символов. Поэтому он генерирует исключение ArgumentOutOfRange для латинских символов A-Extended (например, Ā).
Эта таблица была сгенерирована в .NET 4.5 (см. Ответ https://stackoverflow.com/a/11236038/216440 для кодировок, относящихся к .NET 4.0 и ниже).
РЕДАКТИРОВАТЬ:
источник
(Net4.0) ? %3f................................
(Net4.5) ? %3f ..................................
Url-кодирование легко в .NET. Использование:
Если это будет расшифровано для получения имени папки, вам все равно нужно будет исключить символы, которые нельзя использовать в именах папок (*,?, / И т. Д.)
источник
Если вы не видите System.Web, измените настройки своего проекта. Целевой платформой должна быть «.NET Framework 4» вместо «.NET Framework 4 Client Profile»
источник
Реализация .NET
UrlEncode
не соответствует RFC 3986.Некоторые символы не закодированы, но должны быть. Эти
!()*
символы перечислены в разделе RFC, 2.2 в качестве зарезервированных символов , которые должны быть закодированы еще .NET не может закодировать эти символы.Некоторые символы закодированы, но не должны быть. Эти
.-_
символы не перечислены в разделе RFC, 2.2 как зарезервированный символ , который не должен быть закодирован еще .NET ошибочно кодирует эти символы.В RFC указано, что для обеспечения согласованности реализации следует использовать HEXDIG в верхнем регистре, где .NET создает HEXDIG в нижнем регистре.
источник
Я думаю, что люди здесь отвлеклись на сообщение UrlEncode. URLEncoding не является то, что вам нужно - вы хотите кодировать вещи, которые не будут работать в качестве имени файла в целевой системе.
Предполагая, что вам нужна некоторая универсальность - не стесняйтесь находить недопустимые символы в нескольких системах (MacOS, Windows, Linux и Unix), объединяйте их, чтобы сформировать набор символов для экранирования.
Что касается побега, HexEscape должен быть в порядке (замена символов на% XX). Преобразуйте каждый символ в байты UTF-8 и закодируйте все> 128, если вы хотите поддерживать системы, которые не поддерживают Unicode. Но есть и другие способы, такие как использование обратной косой черты "\" или HTML-кодировка "" ". Вы можете создать свой собственный. Все, что нужно сделать системе, это« закодировать »несовместимый символ. Указанные выше системы позволяют вам воссоздать оригинальное имя - но что-то вроде замены плохих символов пробелами тоже работает.
На той же касательной, что и выше, используется только один
- Он кодирует все, что нужно для OAuth, он не кодирует вещи, которые OAuth запрещает кодирование, и кодирует пространство как% 20, а не + (также в спецификации OATH). См .: RFC 3986. AFAIK, это последняя спецификация URI.
источник
Я написал метод C #, который URL-кодирует ВСЕ символы:
источник
В идеале это должно происходить в классе с именем «FileNaming» или, может быть, просто переименовать Encode в «FileNameEncode». Примечание: они не предназначены для обработки полных путей, только для имен папок и / или файлов. В идеале вы должны сначала разделить ("/") свой полный путь, а затем проверить фрагменты. И, очевидно, вместо объединения вы можете просто добавить символ «%» в список символов, недопустимых в Windows, но я думаю, что таким образом он более полезен / удобочитаем / фактичен. Decode () точно такой же, но переключает Replace (Uri.HexEscape (s [0]), s) «экранированный» с символом.
Спасибо @ simon-tewsi за очень полезную таблицу выше!
источник
Path.GetInvalidFileNameChars()
В дополнение к ответу @Dan Herbert, вы, как правило, должны кодировать только значения.
Split имеет параметр params Split ('&', '='); выражение сначала разделяется на & затем '=', поэтому нечетные элементы - это все значения, которые нужно закодировать, как показано ниже
источник