LINUX.ORG.RU

Сделать AJAX XMLHttpRequest запрос «POST» не в UTF-8 ???


0

1

Сделать AJAX XMLHttpRequest запрос «POST», отправив данные не в UTF-8,такое вообще возможно?

У меня букмарклет, который должен отправлять данные методом POST на сервер. Сервер готов принимать данные ТОЛЬКО как win-1251. Сервер не мой. на нем ни чего не меняем.

Погуглив и поэксперементировав вижу, что перед отправкой XMLHttpRequest, javascript сам преобразует что угодно в UTF-8. и это ни как не изменить.

Уже убился, как вывернуться то?

Ответ на: комментарий от Noisee

да, читал эту статью... грустно. Правда меня один человек уверил, что у него удалось вывернуться. так что пока ищу ответ....

hi_artem
() автор топика
Ответ на: комментарий от Noisee

>букмарклет (post обработчику) -> iconv -> сервер

Поясни?

Если бы можно было запустить iconv, то и проблемы нет. Но сервер не мой.

Логика работы javascript такова, что он БЕЗУСЛОВНО преобразует POST запрос в UTF-8 перед отправкой на сервер (((

hi_artem
() автор топика
Ответ на: комментарий от Noisee

>http://easywebscripts.net/ajax/ajax_rus.php

все известно. сделай то то на клиенте и то то на СЕРВЕРЕ. и будет счастье. ты же видишь, что там главный совет > iconv(«UTF-8», «WINDOWS-1251», $param); но сервер не мой!

Все же надеюсь, что решение должно быть , так как иначе с помощью javascript не получится писать например в форумы, если только они не в UTF-8 или админ не захочет подкрутить iconv на сервере...

Кстати надо посмотреть, может в YUI что есть.

hi_artem
() автор топика

Костыль в виде промежуточного скрипта, который принимает POST из ajax, делает iconv и отправляет POST куда надо.

Deleted
()

Очевидно, надо отправлять не строки. В документации XMLHttpRequest Level 2 написано, что отправлять можно ArrayBuffer или Blob или даже FormData. Но это браузерами ещё не поддерживается.

Однако в своём букмарклете тебе XMLHttpRequest не нужен, ты можешь создать форму, манипулируя DOM, установить нужный ей accept-charset, а потом отправить её.

anonymfus ★★★★
()
Ответ на: комментарий от Deleted

нет. такой костыль не выйдет. Учитывая что это javascript, для которого (вернее для броузера в котором он работает) ограничение на same origin policy подобный костыль потянет за собой необходимость LAMP на клиенте.

hi_artem
() автор топика
Ответ на: комментарий от anonymfus

>Однако в своём букмарклете тебе XMLHttpRequest не нужен, ты можешь создать форму, манипулируя DOM, установить нужный ей accept-charset, а потом отправить её.

Принято. Это некий выход. правда потянет за собой дополнительное кодирование....

На той страничке, на которой запускается букмарклет уже есть форма ввода. Когда пользователь ее отправляет, то сервер в ответ ему отдает новую страницу. и естественно букмарклету приходит писец.

Чтобы этого не происходило я переназначаю кнопку отправить на свой код с XMLHttpRequest и вуаля. Данные отправлены, а ответ от сервера проигнорирован. Все ОК, но вылезли вот эти грабли с кодировкой.

Так что пока жду еще советов.

hi_artem
() автор топика
Ответ на: комментарий от hi_artem

Вместо букмарклета сделать юзерскрипт. Создать iframe, внутри этого iframe отправить форму запустившейся там копией юзерскрипта.

anonymfus ★★★★
()
Ответ на: комментарий от hi_artem

типа кодировать/декодировать браузером, не?

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
<html>
<head>
<script type="text/javascript" src="http://code.jquery.com/jquery-latest.js"></script>
</head>
<body>
<textarea id="ta_1">ололо îëîëî pysch</textarea>
<br/>
<button id="conv">convert</button>
<br/>
<textarea id="ta_2"></textarea>
<script type="text/javascript">

function utf8_to_cp1251 (aa) {
    var bb = '', c = 0;
    for (var i = 0; i < aa.length; i++) {
        c = aa.charCodeAt(i);
        if (c > 127) {
            if (c > 0x0400 && c <= 0x04ff) {
                if (c == 0x0401) {
                    c = 0x4002;
                } else if (c == 0x0451) {
                    c = 0x0408;
                }
                bb += String.fromCharCode(c - 0x0350);
            } else {
                bb += '&#' + c + ';';
            }
        } else {
            bb += aa.charAt(i);
        }
    }
    return bb;
}

$(document).ready(function() {
    $('#conv').click(function() {
        $('#ta_2').val(utf8_to_cp1251($('#ta_1').val()));
    });
});

</script>
</body>
</html>
anonymous
()
Ответ на: комментарий от anonymous

>> типа кодировать/декодировать браузером, не?

не. декодировать на стороне браузера, что ответил сервер - можно, но вот отправитьь серверу данные в той кодировке, чтобы сервер понял - нельзя. Вернее я надеюсь что как то можно выкрутиться, но не могу найти решения..

так как , еще раз повторяю, XMLrequest работает так, что POST запрос БЕЗУСЛОВНО преобразуется в UTF-8 перед отправкой на сервер (((

Вместо букмарклета сделать юзерскрипт. Создать iframe, внутри этого iframe отправить форму запустившейся там копией юзерскрипта.

тоже к этому склоняюсь, но хотелось бы красивее решение

hi_artem
() автор топика
Ответ на: комментарий от hi_artem

твоя проблема в том что ты пытаешься слать ajax запрос туда куда его слать не надо, так что это не проблема javascript, это проблема dna.

trashymichael ★★★
()
Ответ на: комментарий от trashymichael

>>твоя проблема в том что ты пытаешься слать ajax запрос туда куда его слать не надо

Почему???? У меня очень милый букмарклет,который добавляет функциональности очень сильно посещаемому, но убогому форуму. Он показывает новые сообщения, сколько их добавилось в ветки с момента последнего просмотра, запоминает, на каком сообщении закончился просмотр и все такое. И вот чтобы пользователь писать в форум мне и нужен POST. Можно конечно выкрутится по другому, но с XMLHttpRequest было бы красивее.

Я уже почти уверен, что выхода нет и буду выкручиваться по другому. вот только YUI еще посмотрю...

hi_artem
() автор топика
Ответ на: комментарий от trashymichael

>> ajax запросы нужно слать на обработчики ajax запросов, сечешь?

Так и есть)

НО хочется для написания пауков и прочего хулиганства использовать javascript, тем более, что появился node.js, а невозможность передавать данные в отличной от utf-8 кодировке все обламывает ((((

hi_artem
() автор топика
Ответ на: комментарий от hi_artem

На стороне клиента можно сделать так:

function hexdump(str){
        var ret = "";
        var l = str.length;
        var i, ch, code;
        for(i=0; i<l; i++){
                ch = str.charCodeAt(i);
                if(utf2koi[ch] != null)
                        code = utf2koi[ch];
                else if(utf2koi[ch+32] != null)
                        code = utf2koi[ch+32]+32;
                else code = ch;
                ch = code.toString(16);
                ret += "%" + ch;
        }
        return ret;
}
а на стороне сервера - так:
void unhexdump(char *inp){
	char tmp[512], *o_ptr = inp, *tok;
	unsigned char ch;
	unsigned int a;
	strncpy(tmp, inp, 512);
	tok = strtok(tmp, "%");
	do{
		sscanf(tok, "%x", &a);
		ch = a;
		*o_ptr++ = ch;
	}while(tok = strtok(NULL, "%"));
	*o_ptr = 0;
}

Eddy_Em ☆☆☆☆☆
()
Ответ на: комментарий от trashymichael

>> то ограничение связанно только с ajax, к ноде ты всегда сможешь забиндить iconv проч.

Имеешь ввиду с node.js > apache > php > запрос на внешний сервер ? Весь LAMP разворачивать на клиенте? ого го какой костыль.

hi_artem
() автор топика
Ответ на: комментарий от Eddy_Em

>На стороне клиента можно сделать так:

а на стороне сервера - так:

В том то и дело, что на стороне сервера ни чего сделать нельзя. Сервер не мой! как и бывает в большинстве случаев.

Снимаю вопрос. Сделать такое невозможно

hi_artem
() автор топика
Ответ на: комментарий от hi_artem

Что, даже написать простенький скрипт-посредник нельзя?

Eddy_Em ☆☆☆☆☆
()
Ответ на: комментарий от hi_artem

нет не имею, подумай еще раз, алсо бред твоего ответа я даже не распарсил...

trashymichael ★★★
()
Ответ на: комментарий от hi_artem

> но вот отправитьь серверу данные в той кодировке, чтобы сервер понял - нельзя

перекодировать данные перед передачей таки образом, что бы перекодирование в XMLHttpReques давало в результате cp1251

anonymous
()

и да, купи уже VDS за 150 рублей, и не морочь людям голову

anonymous
()
Ответ на: комментарий от anonymfus

>В документации XMLHttpRequest Level 2 написано, что отправлять можно ArrayBuffer или Blob или даже FormData. Но это браузерами ещё не поддерживается.

ArrayBuffer уже можно отправлять в Opera 11.60, бета-версия которой недавно вышла.

anonymfus ★★★★
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.