![]() |
Модераторы: Sardar, Aliance |
![]() ![]() ![]() |
|
etta |
|
|||
Новичок Профиль Группа: Участник Сообщений: 3 Регистрация: 14.11.2006 Репутация: нет Всего: нет |
Привет всем!
Есть данные которые передаются на сервер через xmlHttpRequest в русских буквах, предварительно преобразованные через encodeURIComponent(). Всё, вроде бы, работает - но encodeURIComponent кодирует юникодом по два байта на символ, а хотелось бы покороче. Где-то нашел решение этой проблемы - ручками через жабаскрипт переделываю всю строку и отсылаю - но сервер возвращает эту же строку, но вместо русских буков знаки вопроса "???". Вопрос 1: Где не установил кодировку? Вопрос 2: Почему при использовании <FORM> всё кодируется по тому же байт-коду, что организовал я, заголовки хттп-запросов и ответов те же(!), что и у меня, а всё работает как надо Вопрос 3: Может, кто-то знает более элегантные способы без ручных перебираний в яваскрипт в этом случае (мне нужно зашифровать и спецсимволы в т.ч. как это делает <FORM>)? Это сообщение отредактировал(а) etta - 14.11.2006, 14:39 |
|||
|
||||
12345c |
|
|||
![]() Круглый ![]() ![]() ![]() ![]() Профиль Группа: Vingrad developer Сообщений: 2018 Регистрация: 26.12.2005 Где: наша не пропадала ? Репутация: 57 Всего: 101 |
||||
|
||||
Alca |
|
|||
Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 3993 Регистрация: 14.6.2006 Репутация: нет Всего: 50 |
Ссылки не рабочие.
|
|||
|
||||
ksnk |
|
|||
![]() прохожий ![]() ![]() ![]() ![]() Профиль Группа: Комодератор Сообщений: 6855 Регистрация: 13.4.2007 Где: СПб Репутация: 84 Всего: 386 |
А вот не надо ничего никуда преобразовывать javascript'ом. Пусть сайт будет в сp1251, а ajax - в utf. Все равно толком уговорить Ajax работать с другой кодировкой, imho, нельзя. Разбираться можно в самом php. К тому-же может оказаться полезным одну и туже форму посылать и Ajax и обычным образом, в зависимости от фаз луны и броузера клиента.
Во первых, по прилетевшим данным можно сделать вывод - они от Ajax или нет. Либо по специфическому адресу, или по параметру или по header'ам. Если по какой-то причине диагностика хромает - можно применить такой трюк
А вот вывод скрипта можно оставить в обычной кодировке сайта, разве что дополнить хидерами с указанием кодировки.. P.S. Я уже не помню точно, откуда пришли ко мне функция detectUTF8, но ,с большой вероятностью, из библиотеки jsHttpRequest -------------------- Человеку свойственно ошибаться, программисту свойственно ошибаться профессионально ! ![]() |
|||
|
||||
Alca |
|
|||
Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 3993 Регистрация: 14.6.2006 Репутация: нет Всего: 50 |
GET и POST-запросы. Кодировка.
Во время обычного submit'а формы браузер сам кодирует значения полей и составляет тело GET/POST-запроса для посылки на сервер. При работе через XmlHttpRequest, это нужно делать самим, в javascript-коде. Большинство проблем и вопросов здесь связано с непониманием, где и какое кодирование нужно осуществлять. Вначале рассмотрим общее кодирование запросов, ниже - правильную работу с русским языком для windows-1251. Существуют два вида кодирования HTTP-запроса. Основной - urlencoded, он же - стандартное кодирование URL. Пробел представляется как %20, русские буквы и большинство спецсимволов кодируются, английские буквы и дефис оставляются как есть. Способ, которым следует кодировать данные формы при submit'е, задается в ее HTML-таге: <form method="get"> // метод GET с кодировкой по умолчанию <form method="post" enctype="application/x-www-form-urlencoded"> // enctype явно задает кодировку <form method="post"> // метод POST с кодировкой по умолчанию (urlencoded, как и предыдущая форма) Если форма submit'ится обычным образом, то браузер сам кодирует (urlencode) название и значение каждого поля данных (input и т.п.) и отсылает форму на сервер в закодированном виде. Формируя XmlHttpRequest, мы должны формировать запрос "руками", кодируя поля функцией encodeURIComponent. Конечно, пропускать через encodeURIComponent стоит только те переменные, в которых могут быть спецсимволы или не английские буквы, т.е которые и будут как раз закодированы. Например, для посылки GET-запроса с произвольными параметрами name и surname, их необходимо закодировать вот так: // Пример с GET ... var params = 'name=' + encodeURIComponent(name) + '&surname=' + encodeURIComponent(surname) xmlhttp.open("GET", '/script.html?'+params, true) ... xmlhttp.send(null) В методе POST параметры передаются не в URL, а в теле, посылаемом через send(). Поэтому params нужно указывать не в адресе, а при вызове send() Кроме того, при POST обязателен заголовок Content-Type, содержащий кодировку. Это указание для сервера - как обрабатывать (раскодировать) пришедший запрос. // Пример с POST ... var params = 'name=' + encodeURIComponent(name) + '&surname=' + encodeURIComponent(surname) xmlhttp.open("POST", '/script.html', true) xmlhttp.setRequestHeader('Content-Type', 'application/x-www-form-urlencoded') ... xmlhttp.send(params) Заголовки Content-Length, Connection в POST-запросах, хотя их и содержат некоторые "руководства", обычно не нужны. Используйте их, только если Вы действительно знаете, что делаете. Запросы multipart/form-data Второй способ кодирования - это отсутствие кодирования. Например, кодировать не нужно для пересылки файлов. Он указывается в форме (только для POST) так: <form method="post" enctype="multipart/form-data"> В этом случае при отправке данных на сервер ничего не кодируется. А сервер, со своей стороны, посмотрев на Content-Type(=multipart/form-data), поймет, что пришло. Возможности XmlHttpRequest позволяют создать запрос с любым телом. Например, можно вручную сделать POST-запрос, загружающий на сервер файл. Функционал создания таких запросов есть, в частности, во фреймворке dojo. Но можно реализовать его и самому, прочитав о нужном формате тела POST и заголовках. Кодировка (языковая) Если Вы используете только UTF-8 - пропустите эту секцию. Все идущие на сервер параметры GET/POST, кроме случая multipart/form-data, кодируются в UTF-8. Не в кодировке страницы, а именно в UTF-8. Поэтому, например, в PHP их нужно при необходимости перекодировать функцией iconv. // ajax.php $name = iconv('UTF8','CP1251',$_GET['name']); С другой стороны, ответ с сервера браузер воспринимает именно в той кодировке, которая указана в заголовке ответа Content-Type. Т.е, опять же, в PHP, чтобы браузер воспринял ответ в windows-1251 и нормально отобразил данные на странице в windows-1251, нужно послать заголовок с кодировкой в php-коде, например так: // ajax.php header('Content-Type: text/plain; charset=windows-1251'); Или же, такой заголовок должен добавить сервер. Например, в apache автоматически добавляется кодировка опцией: # в конфиге апача AddDefaultCharset windows-1251 |
|||
|
||||
An6rey |
|
|||
Новичок Профиль Группа: Участник Сообщений: 36 Регистрация: 13.10.2008 Репутация: 1 Всего: 5 |
Все же отсылка файлов XMLHttpRequest не получится. Это делается динамически создаваемыми формами, инпутами и фреймами (target=myiframe)
|
|||
|
||||
![]() ![]() ![]() |
Форум для вопросов, которые имеются в справочниках, но их поиск вызвал затруднения, или для разработчика требуется совет или просьба отыскать ошибку. Напоминаем: 1) чётко формулируйте вопрос, 2) приведите пример того, что уже сделано, 3) укажите явно, нужен работающий пример или подсказка о том, где найти информацию. |
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей) | |
0 Пользователей: | |
« Предыдущая тема | JavaScript: Общие вопросы | Следующая тема » |
|
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности Powered by Invision Power Board(R) 1.3 © 2003 IPS, Inc. |