Проблема с кодировкой URL - HttpWebRequest не работает, Firefox работает - PullRequest
2 голосов
/ 15 ноября 2009

Я пытаюсь вызвать веб-сервис отдыха, предоставляемый системой lims (в основном, база данных химической лаборатории + интерфейс). Он работал великолепно, пока не появились некоторые символы> ascii (в частности, символы с обхватами, умлаутами и т. Д.)

При вызове веб-службы с передачей значения у меня есть следующий аргумент:

&componentValue=àèïõû

HttpWebRequest, без предварительного экранирования ИЛИ с вызовом Uri.EscapeDataString () для значения, дает:

à èïõû

Firefox, с тем же веб-сайтом, который был передан в HttpWebRequest, дает правильное значение:

àèïõû

Теперь для самого побега: Uri.EscapeDataString (), по-видимому, экранирует "символы" как:

%C3%A0%C3%A8%C3%AF%C3%B5%C3%BB

Firefox экранируется от «аиы» как:

%E0%E8%EF%F5%FB

Поскольку последний работает, я, конечно, предпочел бы использовать его в качестве метода побега, но я действительно не знаю, с чего начать. Я нашел много информации о различных методах обработки кодов в ответных данных, но не по запросу.

Ответы [ 2 ]

3 голосов
/ 15 ноября 2009

С MSDN :

Метод Uri.EscapeDataString

[...] Все символы Юникода преобразуются в формат UTF-8 перед экранированием.

Итак, вы видите кодированную версию UTF-8 àèïõû.

В отличие от Uri.EscapeDataString , HttpUtility.UrlEncode позволяет явно указывать кодировку:

HttpUtility.UrlEncode("àèïõû", Encoding.GetEncoding("latin1"));

Кроме того, вы можете написать свою собственную версию; например:

string.Concat(Encoding
   .GetEncoding("latin1")
   .GetBytes("àèïõû")
   .Select(x => "%" + x.ToString("x2"))
   .ToArray());

Оба результата "%e0%e8%ef%f5%fb".

Возможно, лучшим решением было бы принять строки запроса в кодировке UTF-8 в веб-сервисе.

0 голосов
/ 15 ноября 2009

Похоже, что Uri.HexEscape() будет делать то, что вы хотите, но только один символ за раз. Я бы включил вашу собственную экранирующую функцию и надеялся, что ваша кодовая страница всегда будет той же кодовой страницей, которую использует веб-сервис, поскольку похоже, что веб-сервис не поддерживает Юникод.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...