Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > Perl: Общие вопросы > помогите разобраться с кодировкой AJAX и PERL


Автор: evya 19.4.2009, 10:30
Уважаемые господа програмисты!

Помогите разобратся, опыта в передачах через AJAX мало., знаю что он работает только с UTF-8, на самому не получается разобратся
итак есть форма, необходимо ее вывести в реальном времени на страницу при заполнении.

В итоге выводятся символы в неизвестной кодировке

Думаю проблема, что форма отправляется с СР а аякс принимает только в UTF, и так же с перлом при выводе.

пожалуйста поправьте код. smile 

HTML:

Код

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

<html>
<head>
<title>Simple Ajax Example</title>
<script language="Javascript">
function xmlhttpPost(strURL) {
    var xmlHttpReq = false;
    var self = this;
    // Mozilla/Safari
    
       if (window.XMLHttpRequest) {
        self.xmlHttpReq = new XMLHttpRequest();
    }
    // IE
    else if (window.ActiveXObject) {
        self.xmlHttpReq = new ActiveXObject("Microsoft.XMLHTTP");
    }
    self.xmlHttpReq.open('POST', strURL, true);
    self.xmlHttpReq.setRequestHeader('Content-Type', 'application/x-www-form-urlencoded');
    self.xmlHttpReq.onreadystatechange = function() {
        if (self.xmlHttpReq.readyState == 4) {
            updatepage(self.xmlHttpReq.responseText);
        }
    }
    self.xmlHttpReq.send(getquerystring());
}

function getquerystring() {
    var form     = document.forms['f1'];
    var word = form.word.value;
    qstr = 'w=' + escape(word);  // NOTE: no '?' before querystring
    return qstr;
}

function updatepage(str){
    document.getElementById("result").innerHTML = str;
}
</script>
</head>
<body>
<form name="f1">
  <p>Проверка: 
    <input name="word" type="text">  
  <input value="Go" type="button" onclick='JavaScript:xmlhttpPost("/cgi-bin/ajax.pl")'></p>
  <div id="result"></div>
</form>
</body>
</html>


Скрипт:

Код

#!/usr/bin/perl -w
use CGI;

$query = new CGI;

$secretword = $query->param('w');
$remotehost = $query->remote_host();

print $query->header;

print "<p>Вы ввели: <b>$secretword</b> and your IP is <b>$remotehost</b>.</p>";



на сайте http://1m65.ru/ajax.html

Автор: GoDleSS 19.4.2009, 20:43
Даже без проверки:
Цитата

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

должен идти в контейнере <head></head>

Также проверьте правильную выдачу кодировки сервером

Автор: evya 20.4.2009, 05:46
Даже если писать его в контейнере head, все равно кодировка неправильна

Автор: KSURi 20.4.2009, 10:48
Цитата

Код

print $query->header;


попробуйте заменить на
Код

print $query->header(-charset => 'UTF-8');

Автор: pompei 20.4.2009, 11:16
Код

print yourEncoding_convertsTo_utf8( "<p>Вы ввели: <b>$secretword</b> and your IP is <b>$remotehost</b>.</p>" );

sub yourEncoding_convertsTo_utf8 {
   my $myEncodingStr = shift;
   return ... здесь нужно преобразовать вашу кодировку в утф8
}


а можно по другому: просто сам файл преобразовать в утф8.

Выбирайте что удобнее

Автор: evya 20.4.2009, 13:04
Это понятно,

так я отправляю в кодировке cp, 
 -как мне преобразовать в Java из ср в утф, 

и обратно при получении ответа из perla, из UTF в СР

в какой часте Java это делать нужно

помогите примером

Автор: pompei 21.4.2009, 09:26
Если ваш файл в cp1251 кодировке, то надо так
Код

use Convert::Cyrillic;

sub yourEncoding_convertsTo_utf8 {
   my $myEncodingStr = shift;
   return Convert::Cyrillic::cstocs ("WIN", "UTF-8", $myEncodingStr); 
}


нужно ещё установить модуль Convert::Cyrillic, например с CPAN-а: http://search.cpan.org/~jneystadt/cyrillic-1.05/Convert/Cyrillic.pm

как устанавливать модули перла в винде смотрите в гугле (там есть пошаговые инструкции)

Автор: shamber 21.4.2009, 09:46
на этом сайте тоже есть инструкции по установке

Автор: kavkaz 21.4.2009, 13:40
Господа, а разве ответ ajax'у обязательно должен приходить в utf8 ?
я понимаю что это может быть настоятельная рекомендация, но не панацея же.
Наверняка у многих есть проекты в cp1251 и там же используется cp1251 

Уважаемый evya, у вас скрипт, к которому обращается javascript (http://1m65.ru/cgi-bin/ajax.pl) сам по себе вроде как отдается без чарсета
вам тут уже неоднократно советовали выставить хидер.

Отладьте сначала отдельно ваш скрипт /cgi-bin/ajax.pl, чтоб он отдавал все в нужной вам кодировке
Затем пробуйте посылать к нему запросы через ajax
Для облегчения жизни при работе с javascript'ом, в частности с ajax'ом советую использовать какие нибудь фреймверки (например jquery)  

Проверьте в какой кодировке приходят данные к /cgi-bin/ajax.pl
Убедитесь что /cgi-bin/ajax.pl отдает ответ в нужной кодировке

не бойтесь если приперло пользоваться use Encode
есть так же полезная функция utf8::is_utf

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

в целом, работать с ajax и c cp1251 вполне себе можно


Автор: evya 21.4.2009, 19:24
Про заголовки все понятно в скрипте!
Согласен с kavkaz что сайт лучше писать на cp1251!

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

Потому что я перепробывал все, и думаю опять будут проблемы.

Автор: DEER 22.4.2009, 18:06
используй для AJAX jQuery 
он прекрасно работает с windows-1251

Автор: pompei 24.4.2009, 14:15
Вообще я так посмотрел, и пришел к выводу что у вас все скрипты уже написаны правильно - везде кодировка виндовая - и как мне кажеться преобразование кодировки в утф-8 вам ни чего не даст - всеравно будут крокозяблики(только другой формы). Так?

Напишите в таком случае каким веб-сервером вы пользуетесь, у меня такое ощущение, будто веб-сервер сам конвертит кодировку.

Напишите также каким редакором вы пользуетесь - редакторы тоже умеют шутить с кодировками.

Короче абсолютно убедитесь что оба файла в кодировке cp1251 (сравните коды одинаковых русских букв там и там)

Автор: evya 25.4.2009, 18:23
ТЕМА НЕ ЗАКРЫТЫ!

Прошу вас привести реальный пример!!!!!
 smile  smile  smile 

Автор: kavkaz 26.4.2009, 07:28
Покажите пожалуйста ваш исправленный вариант скрипта, который вызывается ajax'ом при этом отдающий данные в cp1251 (если вы остановились на этой кодировке)

здесь никто за вас ниче писать не будет, носом ткнуть – эт можно smile

Автор: mvsgt 3.6.2009, 14:11
Ваш скрипт выдаёт
Код

Content-Type: text/html; charset=ISO-8859-1

<p>secret word is <b>Слово</b> and your IP is <b>94.159.19.34</b>.</p>


Смотрите что сервер в заголовках посылает.

Автор: Dima85 10.6.2009, 16:50
Расскажите пожалуйста а в чем разница между:

Код

use CGI;
$query = new CGI;

$secretword = $query->param('w');
$remotehost = $query->remote_host();



 и

Код

use CGI qw(param);
my $username = param("username");
my $email = param("email");

Автор: ginnie 10.6.2009, 17:08
Dima85, в верхнем варианте создается объект $query и вызываются его методы param() и remote_host(), в нижнем варианте в пространство имен скрипта из CGI.pm импортируется функция param, которая в теле скрипта вызывается. Т.е. фрагменты отличаются тем, что используются разные парадигмы: объектная и процедурная. 

Автор: Dima85 10.6.2009, 18:48
Цитата

Dima85, в верхнем варианте создается объект $query и вызываются его методы param() и remote_host(), в нижнем варианте в пространство имен скрипта из CGI.pm импортируется функция param, которая в теле скрипта вызывается. Т.е. фрагменты отличаются тем, что используются разные парадигмы: объектная и процедурная. 


Я не совсем в это разбираюсь, расскажите пожалуйста другими словами.
Вот допустим я использую Ajax запрос а Perl заголовок выглядит так

Код

use CGI qw(param);
my $username = param("username");
my $email = param("email"); 


Расскажите пожалуйста чем лучше или хуже мой способ?

Автор: ginnie 10.6.2009, 19:00
Цитата(Dima85 @  10.6.2009,  18:48 Найти цитируемый пост)
Расскажите пожалуйста чем лучше или хуже мой способ

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

Автор: mvsgt 11.6.2009, 10:27
Цитата(Dima85 @  10.6.2009,  18:48 Найти цитируемый пост)
код Perl
use CGI qw(param);
my $username = param("username");
my $email = param("email"); 


Расскажите пожалуйста чем лучше или хуже мой способ?


Это плохо тем, что param() импортируется в пространство имён модуля. Может быть, например, конфликт с другой функцией param(). 

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)