Javascript-форум (https://javascript.ru/forum/)
-   Серверные языки и технологии (https://javascript.ru/forum/server/)
-   -   Не та кодировка при изменении элементов DOM, загружаемых через ajax (https://javascript.ru/forum/server/12313-ne-ta-kodirovka-pri-izmenenii-ehlementov-dom-zagruzhaemykh-cherez-ajax.html)

ShootNik 11.10.2010 20:56

Не та кодировка при изменении элементов DOM, загружаемых через ajax
 
Проблема подробнее:

Файл index.html:
<html>
  <head>
  <meta http-equiv="Content-Type" content="text/html; charset=windows-1251" >
   <script type="text/javascript" src="http://ajax.googleapis.com/ajax/libs/jquery/1.4.2/jquery.min.js"></script>
    <script type="text/javascript" src="geoip.js"></script>
  </head>
  <body>
    <div id="add_ads"><a href='javascript:void(null)'>Добавить объявление</a></div>
    <div id="geoip_ads">text</div>
  </body>
</html>


В файле geoip.js есть функция:
$('#add_ads').click(function() {
          $.post('show_ads.php?add=add', function(data) { $('#geoip_ads').html(data);})


В файле show_ads.php:
case 'add': 
    echo '
    <script type="text/javascript" src="check_reg.js"></script>
      <form id="regform" target="_self" style="margin: 0px;" name="regform" method="post" action="show_ads.php">
          <div id="authtitle">Регистрация</div>
        <table cellpadding="2" cellspacing="2" align="center" id="authtable">
          <tr>
            <td id="regtd">Логин:</td>
            <td id=""><input name="login" type="text" id="logininput" onchange="checkLogin()" autocomplete="off" /><div id="logincheck"> &nbsp<br>&nbsp</div></td>
          </tr>
          ...
       </form>';
  break;


В скрипте check_reg.js функция:
function checkLogin(){
          var userlogin = $("#logininput").attr('value');
          var reg= /^[a-zA-Z0-9_]{2,15}$/ ;
          if (reg.test(userlogin)) {
            $("#logincheck").load("/geoip/show_ads.php", {add: "checklogin", data:userlogin});          
          } else {
            if (userlogin.length < 2){
              $("#logincheck").html('<span style="color:red">Минимальная длина = 2</span>'); 
            } 
   ....еще условия...
          }
        }


Собственно, проблема - когда я ввожу в поле логин больше двух символов и он проверяется на сервере, ответ приходит в cp1251 и отображается нормально, а когда меньше двух символов, проверка проходит в ява-скрипте и
$("#logincheck").html('<span style="color:red">Минимальная длина = 2</span>');
почему то получается в utf-8 кракозябрами. Если эту форму не подгружать через ajax, то работает в любом случае.
Помогите, как сделать что бы всегда cp1251 была?

monolithed 11.10.2010 21:54

в AJAX по-умолчанию кодировка UTF-8

windows-1251е - архаизм, но если уж используете прочтите статью.

ShootNik 11.10.2010 23:39

AJAX нормально все отдает, в той кодировке, которая и ожидается, если пишу
header('Content-type: text/html; charset=windows-1251');
контент отдается в 1251, если
header('Content-type: text/html; charset=utf-8');
то utf-8. А с клиента на сервер, я не передаю ничего в кириллице.
Что мне непонятно, почему
$("#logincheck").html('<span style="color:red">Минимальная длина = 2</span>');
где никакого аякса нет (единственное, применяется он к элементу, загруженному через аякс), оказывается в кодировке utf-8?

Gozar 12.10.2010 14:55

Если не дойдет с первого раза, прочитать 51 раз аки мантру: javascript - utf-8

ps: кодировку html файла проверьте, в какой отдается с сервера, в какой пишите. Других вариантов вроде и нет.

ShootNik 12.10.2010 21:59

А вот не получается utf8 в данном случае, сайт не мой.
Вообщем нашел 2,5 решения:
1) check_reg.js пересохранить все-таки в utf-8. Работает, но почему не пойму, пхп скрипт отдает браузеру строчку
echo '<script type="text/javascript" src="check_reg.js"></script>...
и браузер (4 разных пробовал) почему-то загружает этот скрипт всегда в utf-8, хотя то что идет следом за ним <div id="authtitle">Регистрация</div> отображется в той кодировке что нужно (win-1251).
2) вместо
echo '<script type="text/javascript" src="check_reg.js"></script>'
вывести сразу его содержимое
echo ' <script type="text/javascript">
        function checkLogin(){            
          var userlogin = $("#logininput").attr("value");
          var reg= /^[a-zA-Z0-9_]{2,15}$/ ;
          if (reg.test(userlogin)) {
            $("#logincheck").load("/geoip/show_ads.php", {add: "checklogin", data:userlogin});          
          } else {
            if (userlogin.length < 2){
              $("#logincheck").html("<span style=\"color:red\">Минимальная длина = 2</span>"); 
            } else {
              if (userlogin.length > 15){
                $("#logincheck").html("<span style=\"color:red\">Максимальная длина = 15</span>"); 
              } else {
                $("#logincheck").html("<span style=\"color:red\">Только латинские буквы и цифры</span>");  		
              }
            }	     
          }
        }
</script>';
Работает тоже.
2,5) Вывести сразу, но что бы не тянуть в пхп скрип и не долбаться с кавычками:
echo '<script type="text/javascript">';
echo file_get_contents('check_reg.js'); 
echo '</script>';
На этом варианте и остановился.
Если кто знает, почему
echo '<script type="text/javascript" src="check_reg.js"></script>
подключается браузером в утф, объясните, пожалуйста.
пс: Фразы про то что js ajax в utf-8 можно не повторять, я понял/знаю.

Gozar 13.10.2010 09:45

Цитата:

Сообщение от ShootNik (Сообщение 73999)
1) check_reg.js пересохранить все-таки в utf-8. Работает, но почему не пойму

потому что
Цитата:

Сообщение от Gozar (Сообщение 73954)
javascript - utf-8

зы: т.к. до вас туго доходит, а мне лень объяснять все, но меня радует что вы хотите разобраться как это работает, то я вам подскажу, а остальное дойдет со временем.

Цитата:

Сообщение от ShootNik (Сообщение 73999)
пхп скрипт отдает браузеру строчку
echo '<script type="text/javascript" src="check_reg.js"></script>...

мысль не верная, правильно так -
пхп скрипт отдает браузеру строчку
<script type="text/javascript" src="check_reg.js"></script>

, соответственно браузер запрашивает файл check_reg.js, который в вашем случае в utf-8, в результате всё ок.

ShootNik 13.10.2010 11:18

Цитата:

т.к. до вас туго доходит
эээх, тупить так тупить - почему тогда если написать тоже самое сразу в index.html
<script type="text/javascript" src="check_reg.js"></script>
причем кодировка check_reg.js 1251, то все подключается и читается по русски? Я считал, что браузер должен одинаково обрабатывать разметку как написанную заранее, так и подгруженную позже, ан нет.

Kolyaj 13.10.2010 11:31

ShootNik,
вы какой-то бред говорите. Браузер понятия не имеет, заранее вы подготовили вёрстку или через echo вывели. Он получает сформированный html-документ. Он даже не знает, что на сервере PHP работает.

Gozar 13.10.2010 11:48

если база 0, то никакими советами не поможешь :nono:
ShootNik, прочтите что такое кодировка, что такое браузер, как он формирует документы и т.д. в общем базу начальных знаний вам нужно.

ShootNik 13.10.2010 13:21

Цитата:

Сообщение от Kolyaj
Браузер понятия не имеет, заранее вы подготовили вёрстку или через echo вывели. Он получает сформированный html-документ. Он даже не знает, что на сервере PHP работает.

Согласен. Так почему же в случае заранее подготовленной верстки, он подгружает скрипт в win-1251, а в случае
$.post('show_ads.php?do=add', function(data) { $('#geoip_ads').html(data);})
где data это та же самая строчка
<script type="text/javascript" src="check_reg.js"></script>
скрипт подгружается в utf-8?
Если этот вопрос неадкватный, то не знаю что и сказать, попробуйте повторить ситуацию, исходные данные я довольно внятные предоставил, кода там на пять минут копировать... "базу начальных знаний".. ну да, вчера увидел браузер и решил авторизацию аяксовую написать.. перед тем как задавать вопрос, я поискал в нете ответ на него, не нашел - спросил тут.


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