Кодировка .NET Uri RFC 2396 vs RFC 3986
во-первых, некоторые факты... В рамках интеграции с сторонним поставщиком у меня есть веб-приложение C# .Net, которое получает URL-адрес с кучей информации в строке запроса. Этот URL-адрес подписан хэшем MD5 и общим секретным ключом. В принципе, я вытаскиваю строку запроса, удаляю их хэш, выполняю свой собственный хэш на оставшейся строке запроса и удостоверяюсь, что мой соответствует тому, который был предоставлен.
я извлекаю Uri в следующем путь...
Uri uriFromVendor = new Uri(Request.Url.ToString());
string queryFromVendor = uriFromVendor.Query.Substring(1); //Substring to remove question mark
моя проблема возникает из строк запроса, которые содержат специальные символы, такие как umlaut (ü). Поставщик вычисляет свой хэш на основе представления RFC 2396, которое является %FC
. Мое приложение C# .Net вычисляет его хэш на основе представления RFC 3986, которое является %C3%BC
. Излишне говорить, что наши хеши не совпадают, и я бросаю свои ошибки.
странно,документация для класса Uri в .Net говорит, что он должен следовать RFC 2396, если в противном случае не установлено значение RFC 3986, но у меня нет записи в моем web.config
файл, который, как они говорят, требуется для этого поведения.
как заставить конструктор Uri использовать соглашение RFC 2396?
в противном случае, есть ли простой способ преобразовать пары октетов RFC 3986 в октеты RFC 2396?
3 ответов
ничего общего с вашим вопросом, но почему вы создаете новый Uri здесь? Вы можете просто сделать
string queryFromVendor = Request.Url.Query.Substring(1)
; – atticae
+1 для atticae! Я вернулся, чтобы попытаться удалить посторонний Uri, который я создавал, и внезапно строка имела кодировку umlaut как UTF-8 вместо UTF-16.
сначала я не думал, что это сработает. Где-то вдоль линии я попытался получить url-адрес, используя Request.QueryString
, но это заставляло умлаут проходить как %ufffd
который является символом�. Чтобы взглянуть на вещи свежим взглядом, я попробовал предложение Аттики, и оно сработало.
Я уверен, что ответ имеет отношение к что-то я читаю здесь.
C# использует UTF-16 во всех своих строках, с инструментами для кодирования, когда дело доходит до работы с потоками и файлами, которые приводят нас...
ASP.NET использует UTF-8 по умолчанию, и трудно думать о времени, когда это не хорошо выбор...
мои проблемы вытекают отсюда...
Uri uriFromVendor = new Uri(Request.Url.ToString());
взяв Request.Url
uri и создание другого uri, он кодировался как стандарт C# UTF-16. Используя исходный uri, он остался в стандарте .Net UTF-8.
спасибо всем за помощь.
Я интересно, если это немного отвлекающий маневр:
Я говорю это, потому что FC-это представление UTF16 u с umlaut; C2BC-это представление UTF8.
интересно, если один из системы.Текст.Методы кодирования для преобразования исходных данных в обычную строку .Net могут помочь.
этот вопрос тоже может представлять интерес:кодировать и декодировать URLs rfc2396
Я не знаю о стандартной кодировке для конструкторов Uri, но если все остальное не удается, вы всегда можете декодировать URL-адрес самостоятельно и кодировать его в любой кодировке.
на HttpUtility-Class есть UrlDecode()
и UrlEncode()
метод, который позволяет указать