Устранение неполадок при кодировании в умножителе .Net http - PullRequest
5 голосов
/ 26 ноября 2008

У меня есть запрос JavaScript, поступающий в обработчик HTTP ASP.Net (2.0), который передает запрос в веб-службу Java. В этой системе специальные символы, например, с акцентом, не передаются правильно.

Е.Г.

  • Вклад человека: Düsseldorf
  • становится асинхронным запросом JavaScript к http://site/serviceproxy.ashx?q=D%FCsseldorf, который, насколько я могу судить, действителен в ISO-8859-1, а также в UTF-8. (если это не% c3% до н.э. в UTF-8)
  • HttpContext.Current.Request.QueryString.Get("q") возвращает D�sseldorf, где начинаются проблемы.
  • но HttpUtility.UrlEncode(HttpContext.Current.Request.QueryString.Get("q"), Encoding.GetEncoding("ISO-8859-1")) возвращает D%3fsseldorf (a '?')
  • и HttpUtility.UrlEncode(HttpContext.Current.Request.QueryString.Get("q"), Encoding.UTF8) возвращает D%ef%bfsseldorf

Таким образом, значение не декодируется и не перекодируется правильно для передачи в службу java.

  • Уведомление HttpContext.Current.Request.Url.Query is ?q=D%FCsseldorf&output=json&from=1&to=10
  • , в то время как HttpContext.Current.Request.QueryString.ToString() равно q=D%ufffdsseldorf&output=json&from=1&to=10

Почему это так, и как я могу сказать HttpContext соблюдать заголовки запроса, которые включают:

Content-Type=application/x-www-form-urlencoded;+charset=UTF-8

и декодируйте URL-адреса QueryString, используя кодировку UTF-8.

Добавление. Как отмечается в ответе, проблема заключается не столько в декодировании, сколько в кодировании; использование escape() в JavaScript не исключает в соответствии с UTF-8, в то время как использование encodeURIComponent() делает.

Ответы [ 2 ]

6 голосов
/ 26 ноября 2008

Я не знаю, какова кодировка символов по умолчанию, используемая вашим сервером (IIS?), Или ее можно изменить, но я могу сказать вам несколько вещей, которые могут помочь.

0xFC - это кодировка ISO-8859-1 для ü. Хотя кодовой точкой Unicode является U + 00FC, при кодировании с помощью UTF-8 это требует двух байтов и становится 0xC3 0xBC.

Если бы декодер UTF-8 увидел недопустимую последовательность байтов 0xFC, он декодировал бы ее как «заменяющий символ» Unicode, U + FFFD, и обнаружил бы, где он видел начало другой действительной последовательности байтов, в этом case 's'.

Причина, по которой вы получаете %3f, в том, что '?' является "символом замены" для латинского набора символов, аналогично & # 65533; в наборе символов Юникод.

Я полагаю, что вы видите клиентскую кодировку с ISO-8859-1, но сервер декодирует с UTF-8. Как только он попадет на сервер, ваши данные будут повреждены. Я рекомендую вам изменить клиент для использования кодировки UTF-8; он должен запрашивать http://site/serviceproxy.ashx?q=D%C3%BCsseldorf

Похоже, вы создаете эти URL из JavaScript, поэтому вам следует использовать функции encodeURI и encodeURIComponent, а не escape.

1 голос
/ 21 января 2010

У меня возникает та же проблема с универсальным обработчиком ASP.NET, когда URL-адрес вводится непосредственно в IE8. Символы передаются как char 65533, и все же у меня IE8 установлен на

[x] Send UTF-8 URLs.

В моем сценарии я отлаживаю обработчик HTTP в Visual Studio и печатаю адрес обработчика прямо в браузере:

 http://localhost/myHandler.ashx?term=xxxxxx

, а затем пошаговое выполнение кода. Клиент будет передавать URL-адреса в кодировке UTF-8, но есть ли способ отладки кода, когда IE8, работающий на компьютере разработчика, является клиентом?

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