Проблема такая — надо обратиться к скрипту и передать ему параметр, содержащий русские символы.
Типа так http://.../abc.php?tovar=Название%20товара
Если отправлять так:
скрип дает ошибку (нет товара) из-за того, что страка запроса кодируется (%f0%e4...).
Попробовал так, чтобы избежать кодирования:
Uri url1 = new Uri(url, true);
HttpWebRequest req = (HttpWebRequest)HttpWebRequest.Create(url1);
Правда, компилятор ругается — такой метод Url устарел.
Все равно не работает. На контрольном прокси видно, что все русские символы в запросе
превратились в знаки вопроса (http://.../abc.php?tovar=??????%20?????).
Что можно посоветовать?
Я знаю, русские символы в запросе — это жестокое нарушение стандартов,
но он нас серверная сторона не зависит.
Здравствуйте, wmlab2001, Вы писали:
W>Я знаю, русские символы в запросе — это жестокое нарушение стандартов,
Жестокое нарушение стандартов — это нелатиница в имени домена.
Правильно (по всем стандартам) передаётся как раз в первом варианте. Скрипт (или движок) должен раскодировать приходящие к нему параметры и знать в какой они кодировке (обычно UTF-8).
W>но он нас серверная сторона не зависит.
Здравствуйте, SeLarin, Вы писали:
SL>Здравствуйте, wmlab2001, Вы писали:
W>>Я знаю, русские символы в запросе — это жестокое нарушение стандартов, SL>Жестокое нарушение стандартов — это нелатиница в имени домена.
SL>Правильно (по всем стандартам) передаётся как раз в первом варианте. Скрипт (или движок) должен раскодировать приходящие к нему параметры и знать в какой они кодировке (обычно UTF-8).
W>>но он нас серверная сторона не зависит.
К сожалению, Ваш совет неприменим. Переделать скрипт, принимающий аргумент, мы не можем. Надо передать ему данные "как есть". Браузер с этим прекрасно справляется, значит есть способ.
Здравствуйте, wmlab2001, Вы писали:
W>К сожалению, Ваш совет неприменим. Переделать скрипт, принимающий аргумент, мы не можем. Надо передать ему данные "как есть". Браузер с этим прекрасно справляется, значит есть способ.
Кто мешает посмотреть в сниффере (Wireshark, например), как браузер передаёт данные?
Здравствуйте, wmlab2001, Вы писали:
W>К сожалению, Ваш совет неприменим. Переделать скрипт, принимающий аргумент, мы не можем. Надо передать ему данные "как есть". Браузер с этим прекрасно справляется, значит есть способ.
Браузер наверняка передаёт (а скрипт принимает) UTF-8. А вы в какой кодировке передаёте? Неужели Win1251? Вы думаете это должно работать?
Здравствуйте, SeLarin, Вы писали:
SL>Здравствуйте, wmlab2001, Вы писали:
W>>К сожалению, Ваш совет неприменим. Переделать скрипт, принимающий аргумент, мы не можем. Надо передать ему данные "как есть". Браузер с этим прекрасно справляется, значит есть способ. SL>Браузер наверняка передаёт (а скрипт принимает) UTF-8. А вы в какой кодировке передаёте? Неужели Win1251? Вы думаете это должно работать?
Нет. Проверил на контрольном прокси. И браузер и automation-приложение (на C++) передает строку в 1251. В этим случае все работает.
Более точно сформулированный вопрос: как средствами .NET сделать запрос на интернет-ресурс, передав в качестве URL, например буфер byte[] bufurl.
Мли — может, стоит копать в сторону Globalization? Чтобы Uri, содержащий правильный (некодированный) запрос, не превращал русские символы в '?'.
Здравствуйте, wmlab2001, Вы писали:
W>Здравствуйте, SeLarin, Вы писали:
SL>>Здравствуйте, wmlab2001, Вы писали:
W>>>К сожалению, Ваш совет неприменим. Переделать скрипт, принимающий аргумент, мы не можем. Надо передать ему данные "как есть". Браузер с этим прекрасно справляется, значит есть способ. SL>>Браузер наверняка передаёт (а скрипт принимает) UTF-8. А вы в какой кодировке передаёте? Неужели Win1251? Вы думаете это должно работать?
W>Нет. Проверил на контрольном прокси. И браузер и automation-приложение (на C++) передает строку в 1251. В этим случае все работает.
W>Более точно сформулированный вопрос: как средствами .NET сделать запрос на интернет-ресурс, передав в качестве URL, например буфер byte[] bufurl. W>Мли — может, стоит копать в сторону Globalization? Чтобы Uri, содержащий правильный (некодированный) запрос, не превращал русские символы в '?'.
Здравствуйте, wmlab2001, Вы писали:
W>Здравствуйте, wmlab2001, Вы писали:
W>>Здравствуйте, SeLarin, Вы писали:
SL>>>Здравствуйте, wmlab2001, Вы писали:
W>>>>К сожалению, Ваш совет неприменим. Переделать скрипт, принимающий аргумент, мы не можем. Надо передать ему данные "как есть". Браузер с этим прекрасно справляется, значит есть способ. SL>>>Браузер наверняка передаёт (а скрипт принимает) UTF-8. А вы в какой кодировке передаёте? Неужели Win1251? Вы думаете это должно работать?
W>>Нет. Проверил на контрольном прокси. И браузер и automation-приложение (на C++) передает строку в 1251. В этим случае все работает.
W>>Более точно сформулированный вопрос: как средствами .NET сделать запрос на интернет-ресурс, передав в качестве URL, например буфер byte[] bufurl. W>>Мли — может, стоит копать в сторону Globalization? Чтобы Uri, содержащий правильный (некодированный) запрос, не превращал русские символы в '?'.
W>ап
W>>>Более точно сформулированный вопрос: как средствами .NET сделать запрос на интернет-ресурс, передав в качестве URL, например буфер byte[] bufurl. W>>>Мли — может, стоит копать в сторону Globalization? Чтобы Uri, содержащий правильный (некодированный) запрос, не превращал русские символы в '?'.
url это обычная текстовая строка, не надо туда массив байтов.
просто преведите параметры в byte[] CP1251 (rtfm Encoding)
потом массив байтов поочередно превратите в стандартный для урл вид — '%CF%A3'
после процента идет шестнадцатеричное представление байта. на вскидку функцию
не вспомню, никогда не пользовался, на такое и руками легко сделать.
полученные таким образом параметры подставляйте в нужные места url
Z>потом массив байтов поочередно превратите в стандартный для урл вид — '%CF%A3'
так задача заключается в обратном — в урл-е надо иметь именно русские буквы, а не их представление в виде '%CF%A3'.
В такое представление HttpWebRequest их сам кодирует — это и не устраивает.
Здравствуйте, SYer, Вы писали:
SY>Здравствуйте, Ziaw, Вы писали:
Z>>потом массив байтов поочередно превратите в стандартный для урл вид — '%CF%A3'
SY>так задача заключается в обратном — в урл-е надо иметь именно русские буквы, а не их представление в виде '%CF%A3'. SY>В такое представление HttpWebRequest их сам кодирует — это и не устраивает.
А всетаки вы попробуйте, HttpWebRequest их кодирует в соответствии со своими правилами.
Выхода два — заставить его кодировать в CP1251 (насколько я понял сервер их так будет раскодировать) либо кодировать самим. Как кодировать самим я написал.
"в урл-е надо иметь именно русские буквы" — эти русские буквы в любом случае будут подвергнуты переведены url кодированию.
Тоже столкнулся с этой проблемой.
Заставить серверную сторону делать UrlDecode не могу. Браузер действительно может отправлять символы без перекодировки.
Я так понимаю HttpWebRequest делает где-нибудь Encoding.GetEncoding("ASCII").GetBytes() где бы это нарыть?
Здравствуйте, Ziaw, Вы писали:
Z>Здравствуйте, SYer, Вы писали:
SY>>Здравствуйте, Ziaw, Вы писали:
Z>>>потом массив байтов поочередно превратите в стандартный для урл вид — '%CF%A3'
SY>>так задача заключается в обратном — в урл-е надо иметь именно русские буквы, а не их представление в виде '%CF%A3'. SY>>В такое представление HttpWebRequest их сам кодирует — это и не устраивает. Z>А всетаки вы попробуйте, HttpWebRequest их кодирует в соответствии со своими правилами. Z>Выхода два — заставить его кодировать в CP1251 (насколько я понял сервер их так будет раскодировать) либо кодировать самим. Как кодировать самим я написал.
Z>"в урл-е надо иметь именно русские буквы" — эти русские буквы в любом случае будут подвергнуты переведены url кодированию.
Я отправлял браузером запрос с русскими буквами, и ловил их не сервере, они не переведены в url кодировку.
Z>url это обычная текстовая строка, не надо туда массив байтов. Z>просто преведите параметры в byte[] CP1251 (rtfm Encoding) Z>потом массив байтов поочередно превратите в стандартный для урл вид — '%CF%A3' Z>после процента идет шестнадцатеричное представление байта. на вскидку функцию Z>не вспомню, никогда не пользовался, на такое и руками легко сделать.
Понятно что руками можно сделать все, вопрос как сделать это руками на C#? писать HTTP протокол через TCP?
Здравствуйте, Tora-Bora, Вы писали:
TB>Тоже столкнулся с этой проблемой. TB>Заставить серверную сторону делать UrlDecode не могу. Браузер действительно может отправлять символы без перекодировки.
Какой браузер может так нарушать стандарты? Тот же файрфокс может в строке адреса показывать русский урл, но серверу все равно отправляет кодированый.
TB>Я так понимаю HttpWebRequest делает где-нибудь Encoding.GetEncoding("ASCII").GetBytes() где бы это нарыть?
Нет, это не ASCII, это RFC 1738: Uniform Resource Locators (URL) specification.
Здравствуйте, Ziaw, Вы писали:
Z>Здравствуйте, Tora-Bora, Вы писали:
TB>>Тоже столкнулся с этой проблемой. TB>>Заставить серверную сторону делать UrlDecode не могу. Браузер действительно может отправлять символы без перекодировки.
Z>Какой браузер может так нарушать стандарты? Тот же файрфокс может в строке адреса показывать русский урл, но серверу все равно отправляет кодированый.
IE Пробовал так, делал HttpWebRequest'ом запрос с русскими буквами ловил его своим-же листенером. Русские буквы приходили в UrlEncoding. Делал запрос браузером IE, приходили русские буквы! Отправлял HttpWebRequest'ом, но с Uri созданым с параметром, который означает, что конвертить не надо( депрекейтед кстати), приходили ????