Re[8]: как в пост передать юникодную строку?
От: netch80 Украина http://netch80.dreamwidth.org/
Дата: 04.08.09 16:14
Оценка: 2 (1)
Здравствуйте, 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, и тогда посмотрите на результат.
The God is real, unless declared integer.
как в пост передать юникодную строку?
От: sidorov18 США  
Дата: 03.08.09 10:03
Оценка:
есть строка с русским или еще каким(испанский и т.д.) юникодным текстом.
как ее правильно передать в пост запросе? если просто делать 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 протоколе, то ему пофиг что передавать. тут скорее нужно разбираться с тем, что обрабатывает эти запросы.
Re[2]: как в пост передать юникодную строку?
От: sidorov18 США  
Дата: 03.08.09 12:12
Оценка:
Здравствуйте, Аноним, Вы писали:

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



S>>есть строка с русским или еще каким(испанский и т.д.) юникодным текстом.

S>>как ее правильно передать в пост запросе? если просто делать url-encoded( русский текст превращается в что-то вроде %F1%F2... ) то сервер ее не понимает. может заголовки добавить какие-то(пока только Content-Type: application/x-www-form-urlencoded )? или кодировать иным способом...

А>если говорить об http протоколе, то ему пофиг что передавать. тут скорее нужно разбираться с тем, что обрабатывает эти запросы.

сервер, который принимает запросы: twitter.com, например. но наверное есть какие-то общепринятые правила кодирования. т.к. Firefox передает какие-то иероглифы(вместо русских символов) в запросе, и твиттер их понимает.
Re: как в пост передать юникодную строку?
От: netch80 Украина http://netch80.dreamwidth.org/
Дата: 04.08.09 07:16
Оценка:
Здравствуйте, sidorov18, Вы писали:


S>есть строка с русским или еще каким(испанский и т.д.) юникодным текстом.

S>как ее правильно передать в пост запросе? если просто делать url-encoded( русский текст превращается в что-то вроде %F1%F2... ) то сервер ее не понимает. может заголовки добавить какие-то(пока только Content-Type: application/x-www-form-urlencoded )? или кодировать иным способом...

RFC1867 смотрел? Там неплохой пример.
The God is real, unless declared integer.
Re[3]: как в пост передать юникодную строку?
От: netch80 Украина http://netch80.dreamwidth.org/
Дата: 04.08.09 07:58
Оценка:
Здравствуйте, 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 передает какие-то иероглифы(вместо русских символов) в запросе, и твиттер их понимает.

Что за "иероглифы"? Может, это был просто utf-8?
The God is real, unless declared integer.
Re[4]: как в пост передать юникодную строку?
От: frogkiller Россия  
Дата: 04.08.09 08:31
Оценка:
Здравствуйте, netch80, Вы писали:

S>>сервер, который принимает запросы: twitter.com, например. но наверное есть какие-то общепринятые правила кодирования. т.к. Firefox передает какие-то иероглифы(вместо русских символов) в запросе, и твиттер их понимает.


N>Что за "иероглифы"? Может, это был просто utf-8?


Вероятно, то, чем он смотрит, проводит ещё какое-то однобайтовое преобразование. (У меня, например, этим pidgin страдает)
Курица — это инструмент, с помощью которого одно яйцо производит другие.
Re[4]: как в пост передать юникодную строку?
От: sidorov18 США  
Дата: 04.08.09 12:19
Оценка:
Здравствуйте, netch80, Вы писали:

N>Про RFC1867 уже сказано. Если увидишь пример там, то каждое поле ввода отправляется отдельным entity в MIME. А это значит, что никто не мешает тебе указать метод кодировки именно для этого entity. Лучше всего Content-Transfer-Encoding: 8bit, по крайней мере пока данные текстовые.


Не совсем понял, что такое entity.
Пробовал так:

CString edata =  CreateUrlEncodedString( data ).c_str();//обертка для InternetCreateUrl
                                                        //строка param1=1&param2=2&param3=русский становится param1=1&param2=2&param3=%F1%F2...
CString headers = _T("Content-Type: application/x-www-form-urlencoded\r\n\Content-Transfer-Encoding: 8bit;");//заголовки

        char* opt_str = 0;
#ifdef UNICODE
        USES_CONVERSION;
        CStringA ansi_str = W2A(edata);
        opt_str = ansi_str.GetBuffer();
#else
        opt_str = edata.GetBuffer();
#endif

        bSend= HttpSendRequest(hRequest.GetObject(), headers,headers.GetLength(), (LPVOID)opt_str, edata.GetLength() );

сервер не понимает все равно русскую строку, хотя если в ней присутствуют числа или знаки припинания, то он их распознает.

N>А вообще, почему не используешь готовые библиотеки? Их должно быть если не "как грязи", то по крайней мере достаточно, чтобы посмотреть и выбрать.


нечто вроде продвинутой WinInet? не встречал.

N>Что за "иероглифы"? Может, это был просто utf-8?


Ну то, что снифер показывает. много букв, похожих на С и Р(в форум вставляются, как символы, похожие на "№")
Re[5]: как в пост передать юникодную строку?
От: sidorov18 США  
Дата: 04.08.09 12:57
Оценка:
Здравствуйте, sidorov18, Вы писали:

S>
S>CString headers = _T("Content-Type: application/x-www-form-urlencoded\r\n\Content-Transfer-Encoding: 8bit;");//заголовки
S>


пробовал


CString headers = _T("Content-Type: application/x-www-form-urlencoded; charset=utf-8");


то же самое.

пробовал просто передать юникодную строку в HttpSendRequest(с указанием размера буфера соотв data.GetLength()*sizeof(TCHAR)) — сервер не принимает.

смотрел подобные запросы у гугла. там русский текст отображается иероглифами и не url-encoded. как только эти данные кодировать?
вот кусок из снифера:

Content-Type: multipart/form-data; boundary=---------------------------182832622229331
Content-Length: 1221

...
-----------------------------182832622229331
Content-Disposition: form-data; name="subject"

русский
-----------------------------182832622229331

...
Re[5]: как в пост передать юникодную строку?
От: netch80 Украина http://netch80.dreamwidth.org/
Дата: 04.08.09 13:32
Оценка:
Здравствуйте, 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, возможно, ещё чем-то искажённая.
Снимите с того же снифера дамп и покажите.
The God is real, unless declared integer.
Re[6]: как в пост передать юникодную строку?
От: netch80 Украина http://netch80.dreamwidth.org/
Дата: 04.08.09 13:33
Оценка:
Здравствуйте, sidorov18, Вы писали:

S>[code]

S>Content-Type: multipart/form-data; boundary=---------------------------182832622229331
S>Content-Length: 1221

S>...

S>-----------------------------182832622229331
S>Content-Disposition: form-data; name="subject"

S>русский


utf-8, он, родимый.

S>-----------------------------182832622229331


Вот между этими двумя строками с кучей минусов и находится вложенный entity с данными.
The God is real, unless declared integer.
Re[7]: как в пост передать юникодную строку?
От: sidorov18 США  
Дата: 04.08.09 13:51
Оценка:
Здравствуйте, netch80, Вы писали:


N>utf-8, он, родимый.


Отлично. а как его самостоятельно сделать
пробовал передавать его, как набор байт(т.е. WCHAR приводил к CHAR ). сервер его воспринимает . но в первозданном виде. статус на сервере выходит: @CAA>.

Передача, как отдельным entity здесь тоже ничего не решает, находил запросы и без них и с аналогичной строкой. т.е. пост данные a=1&b=текст(тут соотв utf-8).
Re[8]: как в пост передать юникодную строку?
От: Makht  
Дата: 12.08.09 12:26
Оценка:
Тебе нужно преобразовать твою WideChar строку в мильтибайт строку в чарсете UTF-8.
т.е. все что нужно это заменить вызова макроса W2A на вызов функции WideCharToMultibyte и соответствующими параметрами.
Макрос W2A кстати тоже ее вызывает, но конвертирает в пультибайт строку в чарсете, который у тебя в реестре прописан на дефолтный (скорее всего 1251 иои 1252.)
Re[9]: как в пост передать юникодную строку?
От: sidorov18 США  
Дата: 13.08.09 12:20
Оценка:
Здравствуйте, 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;
}
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.