Русские символы в url-запросе
От: wmlab2001  
Дата: 03.04.07 17:19
Оценка:
Проблема такая — надо обратиться к скрипту и передать ему параметр, содержащий русские символы.
Типа так http://.../abc.php?tovar=Название%20товара
Если отправлять так:

HttpWebRequest req = (HttpWebRequest)HttpWebRequest.Create(url);


скрип дает ошибку (нет товара) из-за того, что страка запроса кодируется (%f0%e4...).
Попробовал так, чтобы избежать кодирования:

Uri url1 = new Uri(url, true);
HttpWebRequest req = (HttpWebRequest)HttpWebRequest.Create(url1);


Правда, компилятор ругается — такой метод Url устарел.
Все равно не работает. На контрольном прокси видно, что все русские символы в запросе
превратились в знаки вопроса (http://.../abc.php?tovar=??????%20?????).
Что можно посоветовать?

Я знаю, русские символы в запросе — это жестокое нарушение стандартов,
но он нас серверная сторона не зависит.




29.06.09 10:16: Перенесено из '.NET'
Re: Русские символы в url-запросе
От: SeLarin Россия http://selarin.livejournal.com
Дата: 03.04.07 18:01
Оценка: +1
Здравствуйте, wmlab2001, Вы писали:

W>Я знаю, русские символы в запросе — это жестокое нарушение стандартов,

Жестокое нарушение стандартов — это нелатиница в имени домена.

Правильно (по всем стандартам) передаётся как раз в первом варианте. Скрипт (или движок) должен раскодировать приходящие к нему параметры и знать в какой они кодировке (обычно UTF-8).

W>но он нас серверная сторона не зависит.
... << RSDN@Home 1.2.0 alpha rev. 676>>
Re[2]: Русские символы в url-запросе
От: wmlab2001  
Дата: 03.04.07 18:16
Оценка:
Здравствуйте, SeLarin, Вы писали:

SL>Здравствуйте, wmlab2001, Вы писали:


W>>Я знаю, русские символы в запросе — это жестокое нарушение стандартов,

SL>Жестокое нарушение стандартов — это нелатиница в имени домена.

SL>Правильно (по всем стандартам) передаётся как раз в первом варианте. Скрипт (или движок) должен раскодировать приходящие к нему параметры и знать в какой они кодировке (обычно UTF-8).


W>>но он нас серверная сторона не зависит.


К сожалению, Ваш совет неприменим. Переделать скрипт, принимающий аргумент, мы не можем. Надо передать ему данные "как есть". Браузер с этим прекрасно справляется, значит есть способ.
Re[3]: Русские символы в url-запросе
От: FDSC Россия consp11.github.io блог
Дата: 03.04.07 18:21
Оценка: +1
Здравствуйте, wmlab2001, Вы писали:

W>К сожалению, Ваш совет неприменим. Переделать скрипт, принимающий аргумент, мы не можем. Надо передать ему данные "как есть". Браузер с этим прекрасно справляется, значит есть способ.


Кто мешает посмотреть в сниффере (Wireshark, например), как браузер передаёт данные?
Re[3]: Русские символы в url-запросе
От: SeLarin Россия http://selarin.livejournal.com
Дата: 03.04.07 19:21
Оценка:
Здравствуйте, wmlab2001, Вы писали:

W>К сожалению, Ваш совет неприменим. Переделать скрипт, принимающий аргумент, мы не можем. Надо передать ему данные "как есть". Браузер с этим прекрасно справляется, значит есть способ.

Браузер наверняка передаёт (а скрипт принимает) UTF-8. А вы в какой кодировке передаёте? Неужели Win1251? Вы думаете это должно работать?
... << RSDN@Home 1.2.0 alpha rev. 676>>
Re[4]: Русские символы в url-запросе
От: wmlab2001  
Дата: 04.04.07 05:28
Оценка:
Здравствуйте, SeLarin, Вы писали:

SL>Здравствуйте, wmlab2001, Вы писали:


W>>К сожалению, Ваш совет неприменим. Переделать скрипт, принимающий аргумент, мы не можем. Надо передать ему данные "как есть". Браузер с этим прекрасно справляется, значит есть способ.

SL>Браузер наверняка передаёт (а скрипт принимает) UTF-8. А вы в какой кодировке передаёте? Неужели Win1251? Вы думаете это должно работать?

Нет. Проверил на контрольном прокси. И браузер и automation-приложение (на C++) передает строку в 1251. В этим случае все работает.

Более точно сформулированный вопрос: как средствами .NET сделать запрос на интернет-ресурс, передав в качестве URL, например буфер byte[] bufurl.
Мли — может, стоит копать в сторону Globalization? Чтобы Uri, содержащий правильный (некодированный) запрос, не превращал русские символы в '?'.
Re[5]: Русские символы в url-запросе
От: wmlab2001  
Дата: 04.04.07 08:32
Оценка:
Здравствуйте, wmlab2001, Вы писали:

W>Здравствуйте, SeLarin, Вы писали:


SL>>Здравствуйте, wmlab2001, Вы писали:


W>>>К сожалению, Ваш совет неприменим. Переделать скрипт, принимающий аргумент, мы не можем. Надо передать ему данные "как есть". Браузер с этим прекрасно справляется, значит есть способ.

SL>>Браузер наверняка передаёт (а скрипт принимает) UTF-8. А вы в какой кодировке передаёте? Неужели Win1251? Вы думаете это должно работать?

W>Нет. Проверил на контрольном прокси. И браузер и automation-приложение (на C++) передает строку в 1251. В этим случае все работает.


W>Более точно сформулированный вопрос: как средствами .NET сделать запрос на интернет-ресурс, передав в качестве URL, например буфер byte[] bufurl.

W>Мли — может, стоит копать в сторону Globalization? Чтобы Uri, содержащий правильный (некодированный) запрос, не превращал русские символы в '?'.

ап
Re[6]: Русские символы в url-запросе
От: SYer  
Дата: 29.11.07 14:28
Оценка:
Здравствуйте, 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>ап


Так всё-таки какое решение данной проблемы?
Re[7]: Русские символы в url-запросе
От: Ziaw Россия  
Дата: 30.11.07 07:02
Оценка:
W>>>Более точно сформулированный вопрос: как средствами .NET сделать запрос на интернет-ресурс, передав в качестве URL, например буфер byte[] bufurl.
W>>>Мли — может, стоит копать в сторону Globalization? Чтобы Uri, содержащий правильный (некодированный) запрос, не превращал русские символы в '?'.
url это обычная текстовая строка, не надо туда массив байтов.
просто преведите параметры в byte[] CP1251 (rtfm Encoding)
потом массив байтов поочередно превратите в стандартный для урл вид — '%CF%A3'
после процента идет шестнадцатеричное представление байта. на вскидку функцию
не вспомню, никогда не пользовался, на такое и руками легко сделать.

полученные таким образом параметры подставляйте в нужные места url
... << RSDN@Home 1.2.0 alpha rev. 786>>
Re[8]: Русские символы в url-запросе
От: SYer  
Дата: 30.11.07 07:48
Оценка:
Здравствуйте, Ziaw, Вы писали:


Z>потом массив байтов поочередно превратите в стандартный для урл вид — '%CF%A3'


так задача заключается в обратном — в урл-е надо иметь именно русские буквы, а не их представление в виде '%CF%A3'.
В такое представление HttpWebRequest их сам кодирует — это и не устраивает.
Re[9]: Русские символы в url-запросе
От: Ziaw Россия  
Дата: 30.11.07 08:02
Оценка:
Здравствуйте, SYer, Вы писали:

SY>Здравствуйте, Ziaw, Вы писали:



Z>>потом массив байтов поочередно превратите в стандартный для урл вид — '%CF%A3'


SY>так задача заключается в обратном — в урл-е надо иметь именно русские буквы, а не их представление в виде '%CF%A3'.

SY>В такое представление HttpWebRequest их сам кодирует — это и не устраивает.
А всетаки вы попробуйте, HttpWebRequest их кодирует в соответствии со своими правилами.
Выхода два — заставить его кодировать в CP1251 (насколько я понял сервер их так будет раскодировать) либо кодировать самим. Как кодировать самим я написал.

"в урл-е надо иметь именно русские буквы" — эти русские буквы в любом случае будут подвергнуты переведены url кодированию.
... << RSDN@Home 1.2.0 alpha rev. 786>>
Re[10]: Русские символы в url-запросе
От: Tora-Bora  
Дата: 26.06.09 14:52
Оценка:
Тоже столкнулся с этой проблемой.
Заставить серверную сторону делать UrlDecode не могу. Браузер действительно может отправлять символы без перекодировки.
Я так понимаю HttpWebRequest делает где-нибудь Encoding.GetEncoding("ASCII").GetBytes() где бы это нарыть?
Re[10]: Русские символы в url-запросе
От: Tora-Bora  
Дата: 26.06.09 14:58
Оценка:
Здравствуйте, 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?
Re[11]: Русские символы в url-запросе
От: Ziaw Россия  
Дата: 29.06.09 06:11
Оценка:
Здравствуйте, Tora-Bora, Вы писали:

TB>Тоже столкнулся с этой проблемой.

TB>Заставить серверную сторону делать UrlDecode не могу. Браузер действительно может отправлять символы без перекодировки.

Какой браузер может так нарушать стандарты? Тот же файрфокс может в строке адреса показывать русский урл, но серверу все равно отправляет кодированый.

TB>Я так понимаю HttpWebRequest делает где-нибудь Encoding.GetEncoding("ASCII").GetBytes() где бы это нарыть?


Нет, это не ASCII, это RFC 1738: Uniform Resource Locators (URL) specification.
... << RSDN@Home 1.2.0 alpha 4 rev. 1228>>
Re[12]: Русские символы в url-запросе
От: Tora-Bora  
Дата: 29.06.09 06:26
Оценка:
Здравствуйте, Ziaw, Вы писали:

Z>Здравствуйте, Tora-Bora, Вы писали:


TB>>Тоже столкнулся с этой проблемой.

TB>>Заставить серверную сторону делать UrlDecode не могу. Браузер действительно может отправлять символы без перекодировки.

Z>Какой браузер может так нарушать стандарты? Тот же файрфокс может в строке адреса показывать русский урл, но серверу все равно отправляет кодированый.


IE Пробовал так, делал HttpWebRequest'ом запрос с русскими буквами ловил его своим-же листенером. Русские буквы приходили в UrlEncoding. Делал запрос браузером IE, приходили русские буквы! Отправлял HttpWebRequest'ом, но с Uri созданым с параметром, который означает, что конвертить не надо( депрекейтед кстати), приходили ????
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.