Какая правильная кодировка для строк запроса?

Я пытаюсь отправить запрос по URL-адресу типа "http://mysite.dk/tværs?test=æ" из приложения asp.net, и у меня возникают проблемы с получением querystring для правильного кодирования. Или, возможно, строка запроса закодирована правильно, служба, к которой я подключаюсь, просто не понимает ее правильно.

Я попытался отправить запрос с помощью разных браузеров и записал, как они кодируют запрос с помощью Wireshark, и получил следующие результаты:

Firefox: http://mysite.dk/tv%C3%A6rs?test=%E6
Ie8:     http://mysite.dk/tv%C3%A6rs?test=\xe6
Curl:    http://mysite.dk/tv\xe6rs?test=\xe6

И Firefox, и IE, и Curl получают правильные результаты от службы. Обратите внимание, что они по-разному кодируют датский специальный символ «æ» в строке запроса.

Когда я отправляю запрос из моего приложения asp.net с помощью HttpWebRequest, URL-адрес кодируется следующим образом:

http://mysite.dk/tv%C3%A6rs?test=%C3%A6

Он кодирует строку запроса так же, как и часть пути в URL-адресе. Удаленная служба не понимает эту кодировку, поэтому я не получаю правильного ответа.

Для записи, «æ» (U + 00E6) - это% E6 в ISO-LATIN-1 и% C3% A6 в UTF-8.

Я мог бы изменить удаленную службу, чтобы она принимала строку запроса в кодировке UTF-8, но тогда служба перестала бы работать в браузерах, и меня это не особо интересует.Есть ли способ указать .NET, что он не должен кодировать строки запроса с помощью UTF-8?

Я создаю веб-запрос следующим образом:

var req = WebRequest.Create("http://mysite.dk/tværs?test=æ") as HttpWebRequest;

Но проблема, похоже, исходит из System.Uri, который явно используется внутри WebRequest.Create:

var uri = new Uri("http://mysite.dk/tværs?test=æ");
// now uri.AbsolutePath == "http://mysite.dk/tv%C3%A6rs?test=%C3%A6"
8
задан AHM 12 May 2011 в 15:18
поделиться