Модераторы: Illuminaty
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Как подружить IE с UTF-8 
V
    Опции темы
SkyHawk
Дата 5.5.2011, 12:49 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 164
Регистрация: 17.8.2006
Где: г. Новосибирск

Репутация: нет
Всего: 2



Народ! Помогите! Уже несколько дней бьюсь с данной проблемой!
В-общем, так. Решил в своем внутреннем портале использовать JSON (альтернатива XML). Все бы ничего, но JSON работает с данными только в формате UTF-8. ОК, переходим на UTF-8 (раньше все было на win-1251). Однако при работе с utf-8 глючит ослик! 

Привожу два файла - клиентская часть, и серверная.

Клиент:
Код


<script language='javascript' type='text/javascript'>

  var xmlHttp = false;
  var rezXML = new Array();  
  /*@cc_on @*/
  /*@if (@_jscript_version >= 5)
  try {
    xmlHttp = new ActiveXObject("Msxml2.XMLHTTP");
  } catch (e) {
    try {
      xmlHttp = new ActiveXObject("Microsoft.XMLHTTP");
    } catch (e2) {
      xmlHttp = false;
    }
  }
  @end @*/

  if (!xmlHttp && typeof XMLHttpRequest != 'undefined') {
    xmlHttp = new XMLHttpRequest();
  }



  function SendAjaxQueryJSON(url, RecipFunc, async)
  {

    xmlHttp.open("GET", url, async);
    eval("xmlHttp.onreadystatechange = function(){ serverReplyJSON('"+RecipFunc+"'); }");
    xmlHttp.send(null);
  }

function serverReplyJSON(recip_func)
{
    if (xmlHttp.readyState == 4) 
    {
        if ( xmlHttp.status == 200 ) 
        {
                 var response = xmlHttp.responseText;

            obj = eval( "(" + response + ")" );

            eval(recip_func+"('obj');");
        }
        else
        {
            alert( "Ошибка получения AJAX-ответа от сервера! Код ошибки: "+ xmlHttp.status);
        }
    }
}

function updatePage(val)
{
  var val1 = window[val];
  for (var key in val1)
  {
    alert(key +":    "+ val1[key]);
  }

}

function newEvent()
{
  var Val="Имя: Василий; Фамилия: Пупкин; Год рождения: 1970; Группа крови: 2;";

  SendAjaxQueryJSON("2.php?val="+Val, "updatePage", true );
}

</SCRIPT>


<BODY onload="newEvent();">
</BODY>


Сервер:
Код

<?
$arr=explode(";", $val);

foreach($arr as $arr1)
{
  $value= explode(":", $arr1);
  $rez[$value[0]]=$value[1];
}

$text=json_encode($rez);
echo $text;
?>


Суть в следующем. Клиентом через Ajax отправляются значения, указанные в переменной Val, серверу. Сервер парсит эту переменную, создает массив, и передает обратно клиенту, преобразовав в JSON-формат. Клиент должен принять, и выдать сообщением значения всех полученных переменных.
Функции SendAjaxQueryJSON и serverReplyJSON созданы для универсализации - в дальнейшем будут использоваться как модуль, и тупо подключаться везде, где нужна работа с JSON через Ajax. 
Так вот. При работе БЕЗ кириллических символов все ОК. Но, когда в переменной Val есть кириллица - во всех браузерах работает нормально, кроме Ослика! Ослик работает, только если насильно указать кодировку Windows-1251 в настройках (можете проверить сами). В чем проблема, что я делаю не так, и как можно побороть данную траблу?

Это сообщение отредактировал(а) SkyHawk - 5.5.2011, 13:42
--------------------
Быть может все, что может быть, И даже то, что быть не может.
PM MAIL WWW   Вверх
ReFleX
Дата 5.5.2011, 16:57 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 499
Регистрация: 26.9.2004
Где: Таллинн

Репутация: 1
Всего: 3



Недеюсь сам файл сохранён с кодировкой UTF-8?
user posted image
PM WWW   Вверх
bars80080
Дата 5.5.2011, 17:37 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


прапор творюет
****
Награды: 1



Профиль
Группа: Завсегдатай
Сообщений: 12022
Регистрация: 5.12.2007
Где: Königsberg

Репутация: 50
Всего: 315



на ютф-8 ничего не глючит. скорее всего, у вас на одной из сторон где-то осталась кодировка cp1251
PM MAIL WWW   Вверх
SkyHawk
Дата 5.5.2011, 18:22 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 164
Регистрация: 17.8.2006
Где: г. Новосибирск

Репутация: нет
Всего: 2



Именно в utf-8 сохранены и клиент, и сервер. Ранее были сохранены в windows-1251, но потом я преобразовал оба файла в Notepad++ именно в utf-8. У вас все нормально работает? Или нет?

Если в хидере указан utf-8, глючит IE. Если же указать windows-1251, то ослик начинает нормально принимать, но начинает глючить Файрфокс.
У меня эти две Ajax-функции находятся в отдельном файле .js (здесь я для удобства вписал их в тело клиента), он по умолчанию сохранен в вин-1251, и присоединяются динамически, но там вроде бы нет кириллических символов. Неужели из-за этого файла тоже могут быть проблемы?
--------------------
Быть может все, что может быть, И даже то, что быть не может.
PM MAIL WWW   Вверх
ksnk
Дата 5.5.2011, 18:59 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


прохожий
****


Профиль
Группа: Комодератор
Сообщений: 6855
Регистрация: 13.4.2007
Где: СПб

Репутация: 48
Всего: 386



а хидеры установлены в запросах? Их достаточно просто посмотреть в панели отладки JS для любого вменяемого броузера (IE в том числе ;))
Код

header('Content-type: text/html; charset=utf-8');// was сharset=windows-1251');

Вообще-то не обязательно выдавать сервером данные именно в utf. Достаточно указать корректный заголовок. Вот приходящие данные довольно сложно кроссбраузерно уложить в нужную кодировку и все рекомендации обычно оканчиваются utf-8...


--------------------
Человеку свойственно ошибаться, программисту свойственно ошибаться профессионально ! user posted image
PM MAIL WWW Skype   Вверх
SkyHawk
Дата 6.5.2011, 05:20 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 164
Регистрация: 17.8.2006
Где: г. Новосибирск

Репутация: нет
Всего: 2



Хидеры указываю и в клиенте, и на сервере так:
Код

header('Content-type: text/html; charset=utf-8');

Если указать, как выше, то Firefox показывает нормально, а IE выдаёт вместо кириллических символов null. Если указать windows-1251, то наоборот IE показывает нормально, а Firefox отображает некорректно кириллические символы.


Заголовки запроса (при указанном выше хидере):

Код

Accept-Charset    ISO-8859-14,utf-8;q=0.7,*;q=0.7


Заголовки ответа:
Код

Content-Type    text/html; charset=utf-8


Посмотрел в Мозилле firebug'ом. А как в IE 8 посмотреть заголовки?... В "Сервис -> Средства разработчика" не нашел ничего нужного...

Цитата(ksnk @  5.5.2011,  18:59 Найти цитируемый пост)
Вообще-то не обязательно выдавать сервером данные именно в utf. Достаточно указать корректный заголовок.

Ну так я и указываю хидером корректный заголовок. Нет?

Так что делать-то?...

Это сообщение отредактировал(а) SkyHawk - 6.5.2011, 05:47
--------------------
Быть может все, что может быть, И даже то, что быть не может.
PM MAIL WWW   Вверх
SkyHawk
Дата 6.5.2011, 09:30 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 164
Регистрация: 17.8.2006
Где: г. Новосибирск

Репутация: нет
Всего: 2



Уфф. Частично разобрался. 
Поставил на IE DebugBar, просмотрел с помощью него отправляемый запрос, сравнил с запросом Firefox'а. Оказалось, параметр val в строке запроса выглядит по разному. в фоксе - байт-кодом, в ослике - набором кракозябр. Далее в серверном скрипте "поставил логгер" - вывел в текстовый файл значение параметра val. Так и вышло - Firefox и Internet Explorer посылают запросы в разных кодировках. После запроса фокса скрипт сохранил текст в кодировке utf-8. А после запроса IE - в windows-1251. 
А теперь, внимание, вопрос: КАК заставить ослик посылать GET-запрос именно в формате UTF-8? 
Еслю ставлю php-хидер: 
Код

  header('Content-type: text/html; charset=utf-8');

 то нормально работает фокс, ослик шлёт на сервер гадость. Если ставлю мета-тег:
Код

<meta http-equiv="Content-Type" content="text/html; charset=utf-8">

то наоборот, ишак нормально работает, а вот лис шлёт на сервер фигню. Если же ставлю оба значения (и мета-тег, и хидер), то приоритет имеет php-хидер, и повторяется первый вариант. Что делать?

Знающие, подскажите!
--------------------
Быть может все, что может быть, И даже то, что быть не может.
PM MAIL WWW   Вверх
ReFleX
Дата 6.5.2011, 09:48 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 499
Регистрация: 26.9.2004
Где: Таллинн

Репутация: 1
Всего: 3



В ASP.NET есть метод Server.UrlEncode который специально используется для того чтобы передавать к примеру русский текст в url, он заменяет к примеру пробел на %20

Ищи подобную тему в PHP

Да, кстати точно, на сколько я помню IE не умеет читать русские буквы в адресной строке, может уже в 9 это исправили...

Добавлено через 50 секунд
Вроде бы даже в JS я тоже как то видел подобный метод
PM WWW   Вверх
SkyHawk
Дата 6.5.2011, 13:21 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 164
Регистрация: 17.8.2006
Где: г. Новосибирск

Репутация: нет
Всего: 2



Есть! Добил я эту траблу!

ReFleX, спасибо тебе за подсказку! Навел на верный путь! Прибавляю + к твоей репутации. smile

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

Справился так. Чтобы избавиться от кириллицы, строку запроса кодирую с помощю js-функции encodeURIComponent(Val), которая преобразовывает всю строку в байт-код. В противоположность ей (для раскодирования) в точности соответствует php-функция urldecode($val), с помощью которой я и получаю исходную строку! Во всех основных браузерах (проверял на IE6, IE8, Google Chrome 10, Opera 9, Mozilla Firefox 3.6) работает на ура! 
Блин, вот реально ступил! Надо было сразу ковырять в сторону кириллического шрифта в строке запроса, и кодировать его. Правду говорят, век живи - век учись, и дураком помрёшь. smile 
Всем спасибо! Тема закрыта. 
--------------------
Быть может все, что может быть, И даже то, что быть не может.
PM MAIL WWW   Вверх
Pena
Дата 27.1.2015, 13:03 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


КорнеплодЪ
*


Профиль
Группа: Участник
Сообщений: 161
Регистрация: 20.4.2006
Где: эРэФия, аул Москв а...

Репутация: нет
Всего: нет



Дядиньки, а неужели надо перелопачивать все ссылки и urlencod-ить их. Неужели нельзя написать jQuery функцию (запускающуюся после загрузки страницы) которая бы искала все ссылки на странице и encodeURIComponent-ила их? =\
--------------------
Самовар по всем вопросам - сильно не ругайте 
PM   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Вёрстка веб-сайтов | Следующая тема »


 




[ Время генерации скрипта: 0.0825 ]   [ Использовано запросов: 21 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.