Javascript-форум (https://javascript.ru/forum/)
-   jQuery (https://javascript.ru/forum/jquery/)
-   -   Проблема с кодировкой кирилицы внутри скрипта (https://javascript.ru/forum/jquery/9094-problema-s-kodirovkojj-kirilicy-vnutri-skripta.html)

GRIG 28.04.2010 18:03

Проблема с кодировкой кирилицы внутри скрипта
 
Привет всем. Помогите решить такую проблему.
На странице есть форма для ввода фильтров для поискового запроса. Среди прочего в этой форме есть такой кусок:
<select id="my_select">
  <option value="default">Default</option>
</select>

После того, как страница загружена в броузер, срабатывает скрипт, который средствами AJAX'а подгружает другие варианты для этого select'а. При этом делается следующее:
for( var i = 0; i < data.n; i++ )
  $('#my_select').append( '<option>' + data.selections[i] + '</option>' );

А потом пользоваетель как-то инициирует отправку формы на сервер. При этом генерится строка для передачи на сервер методом GET. Для указанного куска делается следующее:
form_data += "&" + send_form.elements[i].id + "=" + send_form.elements[i][ send_form.elements[i].selectedIndex ].value;

Неприятность заключается в следующем. Подгруженные варианты выбора могут содержать в себе русские буквы. При генерации строки-запроса для передачи на сервер эти буквы копируются "как есть" (проверял в отладчике). Однако потом они как-то преобразуются в конструкцию вида "%C1%C2%C3..." Преобразовать, естественно, надо, поскольку не все символы допустимы в URL'е. Но прикол в том, что это преобразование ведется соответственно виндовой кодировке, хотя сервер все данные (и исходную страницу, и последующие варианты выбора) присылает в КОИ8-Р. Да и броузер живет на линухе, который русифицирован в кодировке КОИ8-Р. Откуда тут берется виндовая кодировка - совершенно непонятно.
Есть какие-нибудь идеи?

Gvozd 28.04.2010 18:12

Цитата:

Сообщение от GRIG
При генерации строки-запроса для передачи на сервер эти буквы копируются "как есть" (проверял в отладчике)

неправда.на сервер передаются уже кодированные данные
Цитата:

Сообщение от GRIG
преобразование ведется соответственно виндовой кодировке,

неправда. URL кодируется согласно UTF-8,насоклько я знаю всегда

GRIG 28.04.2010 18:30

1. Данные на сервер действительно передаются уже перекодированными. Но перекодировка происходит уже после того, как мой скрипт отдал данные для отсылки.

2. Конкретно в моем случае - по виндовой. Увы, это экспериментальный факт.

GRIG 28.04.2010 19:04

UPD: Забыл написать один важный момент. Отправка формы на сервер производится средствами AJAX'а. А точнее с помощью вызова $.getJSON(...);

Gvozd 28.04.2010 21:33

используйте явный UTF повсюду, и не парьте себе мозги

GRIG 29.04.2010 09:23

Не могу. Речь идет об интранете, в котором КОИ8-Р - корпоративный стандарт.

subzey 29.04.2010 09:49

GRIG,
Сочувствую.

GRIG 29.04.2010 10:04

UPD. Экспериментальным путем (с помощью модификации скриптов и отладчика FireBug) установлено следующее:
Если для отсылки формы на сервер применяется код
window.location = 'myscript.php?page=1' + form_data;

То буквы "СЭБ" из того списка выбора преобразуются в "%F3%FC%E2", что соответствует кодировке KOI8-R
Если же для отсылки формы на сервер применяется код
$.getJSON( 'myscript.php?page=1' + form_data, { }, myfunc() );

То те же самые буквы преобразуются в "%D1%DD%C1", что соответствует кодировке win-1251.
ВОПРОС: какого черта?????

Gvozd 29.04.2010 10:41

глянь как в библиотеке URL-кодируется параметр
посмотри стандартные URL-кодировщики
а потом если все не катит, напиши свой URL_кодер с блек-джеком, шлюхами, и KOI8-R

GRIG 29.04.2010 10:49

А где это смотреть?

Gvozd 29.04.2010 11:05

Цитата:

Сообщение от Gvozd
глянь как в библиотеке URL-кодируется параметр

в самом коде jQuery же!
Цитата:

Сообщение от Gvozd
посмотри стандартные URL-кодировщики

http://javascript.ru/manual/method
Цитата:

Сообщение от Gvozd
а потом если все не катит, напиши свой URL_кодер с блек-джеком, шлюхами, и KOI8-R

http://javascript.ru/String
PS забыл о самом простом решении - серверный iconv же

GRIG 29.04.2010 11:15

Чем дальше, тем все чудесатее и чудесатее...
1) Думал, что вся эта история - глюк старой версии JQuery (у меня 1.3.2). Сходил на официальный сайт и утянул к себе 1.4.2 - мой скрипт вообще перестал работать. Утянул 1.4 - работоспособность так и не восстановилась. Что за хрень???????
2) Взял отладочную версию 1.3.2 и пошел по ней в FireBug'е трассировкой. Результат такой: для отсылки информации на сервер JQuery создает объект типа XMLHttpRequest и применяет его метод send(). Перекодировка URLа идет внутри этого метода. А исходники этого метода не доступны, так что выяснить, почему он так нехорошо себя ведет, невозможно.

Что касается предложения использовать iconv() на сервере. Считаю такой вариант неудачным. Потому что для этого сервер должен знать, в какой кодировке приходят данные от броузера, при том, что броузер про это ничего не говорит. Так что я бы предпочел iconv() на броузере (если такое вообще возможно)

GRIG 29.04.2010 11:27

UPD. Проблема решилась путем замены вот этого:
$.getJSON( 'myscript.php?page=1' + form_data, { }, myfunc() );

на вот это:
$.getJSON( 'myscript.php?page=1' + encodeURI( form_data ), { }, myfunc() );

И, естественно, на стороне сервера нужен iconv() для преобразования UTF8 -> KOI8-R

Gvozd 29.04.2010 11:30

Цитата:

Сообщение от GRIG
JQuery создает объект типа XMLHttpRequest и применяет его метод send(). Перекодировка URLа идет внутри этого метода. А исходники этого метода не доступны, так что выяснить, почему он так нехорошо себя ведет, невозможно.

жжоте!
это "родной" метод JavaScript-а


Часовой пояс GMT +3, время: 08:29.