есть строка с русским или еще каким(испанский и т.д.) юникодным текстом.
как ее правильно передать в пост запросе? если просто делать url-encoded( русский текст превращается в что-то вроде %F1%F2... ) то сервер ее не понимает. может заголовки добавить какие-то(пока только Content-Type: application/x-www-form-urlencoded )? или кодировать иным способом...
Re: как в пост передать юникодную строку?
От:
Аноним
Дата:
03.08.09 11:49
Оценка:
Здравствуйте, sidorov18, Вы писали:
S>есть строка с русским или еще каким(испанский и т.д.) юникодным текстом. S>как ее правильно передать в пост запросе? если просто делать url-encoded( русский текст превращается в что-то вроде %F1%F2... ) то сервер ее не понимает. может заголовки добавить какие-то(пока только Content-Type: application/x-www-form-urlencoded )? или кодировать иным способом...
если говорить об http протоколе, то ему пофиг что передавать. тут скорее нужно разбираться с тем, что обрабатывает эти запросы.
Здравствуйте, Аноним, Вы писали:
А>Здравствуйте, sidorov18, Вы писали:
S>>есть строка с русским или еще каким(испанский и т.д.) юникодным текстом. S>>как ее правильно передать в пост запросе? если просто делать url-encoded( русский текст превращается в что-то вроде %F1%F2... ) то сервер ее не понимает. может заголовки добавить какие-то(пока только Content-Type: application/x-www-form-urlencoded )? или кодировать иным способом...
А>если говорить об http протоколе, то ему пофиг что передавать. тут скорее нужно разбираться с тем, что обрабатывает эти запросы.
сервер, который принимает запросы: twitter.com, например. но наверное есть какие-то общепринятые правила кодирования. т.к. Firefox передает какие-то иероглифы(вместо русских символов) в запросе, и твиттер их понимает.
S>есть строка с русским или еще каким(испанский и т.д.) юникодным текстом. S>как ее правильно передать в пост запросе? если просто делать url-encoded( русский текст превращается в что-то вроде %F1%F2... ) то сервер ее не понимает. может заголовки добавить какие-то(пока только Content-Type: application/x-www-form-urlencoded )? или кодировать иным способом...
Здравствуйте, sidorov18, Вы писали:
S>>>есть строка с русским или еще каким(испанский и т.д.) юникодным текстом. S>>>как ее правильно передать в пост запросе? если просто делать url-encoded( русский текст превращается в что-то вроде %F1%F2... ) то сервер ее не понимает. может заголовки добавить какие-то(пока только Content-Type: application/x-www-form-urlencoded )? или кодировать иным способом...
Про RFC1867 уже сказано. Если увидишь пример там, то каждое поле ввода отправляется отдельным entity в MIME. А это значит, что никто не мешает тебе указать метод кодировки именно для этого entity. Лучше всего Content-Transfer-Encoding: 8bit, по крайней мере пока данные текстовые.
А вообще, почему не используешь готовые библиотеки? Их должно быть если не "как грязи", то по крайней мере достаточно, чтобы посмотреть и выбрать.
А>>если говорить об http протоколе, то ему пофиг что передавать. тут скорее нужно разбираться с тем, что обрабатывает эти запросы. S>сервер, который принимает запросы: twitter.com, например. но наверное есть какие-то общепринятые правила кодирования. т.к. Firefox передает какие-то иероглифы(вместо русских символов) в запросе, и твиттер их понимает.
Здравствуйте, netch80, Вы писали:
S>>сервер, который принимает запросы: twitter.com, например. но наверное есть какие-то общепринятые правила кодирования. т.к. Firefox передает какие-то иероглифы(вместо русских символов) в запросе, и твиттер их понимает.
N>Что за "иероглифы"? Может, это был просто utf-8?
Вероятно, то, чем он смотрит, проводит ещё какое-то однобайтовое преобразование. (У меня, например, этим pidgin страдает)
Курица — это инструмент, с помощью которого одно яйцо производит другие.
Здравствуйте, netch80, Вы писали:
N>Про RFC1867 уже сказано. Если увидишь пример там, то каждое поле ввода отправляется отдельным entity в MIME. А это значит, что никто не мешает тебе указать метод кодировки именно для этого entity. Лучше всего Content-Transfer-Encoding: 8bit, по крайней мере пока данные текстовые.
сервер не понимает все равно русскую строку, хотя если в ней присутствуют числа или знаки припинания, то он их распознает.
N>А вообще, почему не используешь готовые библиотеки? Их должно быть если не "как грязи", то по крайней мере достаточно, чтобы посмотреть и выбрать.
нечто вроде продвинутой WinInet? не встречал.
N>Что за "иероглифы"? Может, это был просто utf-8?
Ну то, что снифер показывает. много букв, похожих на С и Р(в форум вставляются, как символы, похожие на "№")
Здравствуйте, sidorov18, Вы писали:
S>Здравствуйте, netch80, Вы писали:
N>>Про RFC1867 уже сказано. Если увидишь пример там, то каждое поле ввода отправляется отдельным entity в MIME. А это значит, что никто не мешает тебе указать метод кодировки именно для этого entity. Лучше всего Content-Transfer-Encoding: 8bit, по крайней мере пока данные текстовые.
S>Не совсем понял, что такое entity.
Понятие MIME, посылка в целом или любая её часть внутри multipart, обладающая блоком собственных заголовков.
N>>А вообще, почему не используешь готовые библиотеки? Их должно быть если не "как грязи", то по крайней мере достаточно, чтобы посмотреть и выбрать. S>нечто вроде продвинутой WinInet? не встречал.
Вы уж извините, я с виндой не общаюсь. Но CURL достаточно продвинутая и под винду есть, можно её глянуть.
N>>Что за "иероглифы"? Может, это был просто utf-8? S>Ну то, что снифер показывает. много букв, похожих на С и Р(в форум вставляются, как символы, похожие на "№")
Если каждая вторая такая (одна из двух), то это utf-8, возможно, ещё чем-то искажённая.
Снимите с того же снифера дамп и покажите.
Отлично. а как его самостоятельно сделать
пробовал передавать его, как набор байт(т.е. WCHAR приводил к CHAR ). сервер его воспринимает . но в первозданном виде. статус на сервере выходит: @CAA>.
Передача, как отдельным entity здесь тоже ничего не решает, находил запросы и без них и с аналогичной строкой. т.е. пост данные a=1&b=текст(тут соотв utf-8).
Здравствуйте, sidorov18, Вы писали:
S>Здравствуйте, netch80, Вы писали:
N>>utf-8, он, родимый.
S>Отлично. а как его самостоятельно сделать :) S>пробовал передавать его, как набор байт(т.е. WCHAR приводил к CHAR ). сервер его воспринимает :). но в первозданном виде. статус на сервере выходит: @CAA>.
Вы зачем-то передаёте данные тут открытым текстом вместо дампа. В таких вопросах нужны дампы.
WCHAR — это значит, что лежит юникод 16-битными кодами? Если да — то нужна _явная_ конверсия в utf-8. Как это сделать на винде в Ваших конкретных условиях, я не знаю. MSDN на поиск "converting to UTF-8" выдаёт кучу ссылок, посмотрите. То, что Вы привели — насколько я могу понять эту кашу из символов — представляет собой прямую передачу UTF-16LE, что, понятно, не то, что нужно.
S>Передача, как отдельным entity здесь тоже ничего не решает, находил запросы и без них и с аналогичной строкой. т.е. пост данные a=1&b=текст(тут соотв utf-8).
Ну для начала попробуйте сконвертить в настоящий utf-8, и тогда посмотрите на результат.
Тебе нужно преобразовать твою WideChar строку в мильтибайт строку в чарсете UTF-8.
т.е. все что нужно это заменить вызова макроса W2A на вызов функции WideCharToMultibyte и соответствующими параметрами.
Макрос W2A кстати тоже ее вызывает, но конвертирает в пультибайт строку в чарсете, который у тебя в реестре прописан на дефолтный (скорее всего 1251 иои 1252.)
Здравствуйте, Makht, Вы писали:
M>Тебе нужно преобразовать твою WideChar строку в мильтибайт строку в чарсете UTF-8. M>т.е. все что нужно это заменить вызова макроса W2A на вызов функции WideCharToMultibyte и соответствующими параметрами. M>Макрос W2A кстати тоже ее вызывает, но конвертирает в пультибайт строку в чарсете, который у тебя в реестре прописан на дефолтный (скорее всего 1251 иои 1252.)
Ну да. так и было сделано.
CStringA UTF16toUTF8(const CStringW& utf16)
{
CStringA utf8;
int len = WideCharToMultiByte(CP_UTF8, 0, utf16, -1, NULL, 0, 0, 0);
if (len>1)
{
char *ptr = utf8.GetBuffer(len-1);
if (ptr) WideCharToMultiByte(CP_UTF8, 0, utf16, -1, ptr, len, 0, 0);
utf8.ReleaseBuffer();
}
return utf8;
}