:-[ Домашняя страница девелопера ] :( + φ = :D

jquery, ajax, perl, utf8

Как отправить данные perl-скрипту с помощью ajax? Строки передаются в кодировке utf8. Чтобы их раскодировать нужно отключить utf8 флаг для этой строки Encode::_utf8_off, а затем перекодировать Encode::from_to строку из utf8 в ту кодировку, которая нам нужна (в данном случае cp1251).

 

Функция Encode::from_to конвертирует переданную строку "на месте" из одной кодировки в другую и возвращает количество перекодированных октетов в случае успеха и undef в случае ошибки.



Написал скрипт для примера, который при первом запросе выводит страницу с вызовом скрипта, а при запросе аяксом возвращает запрошенную строку.


#!/usr/bin/perl
use strict;
use LWP::UserAgent;
use XML::DOM;
use Data::Dumper;
use Encode;
my ( %FORM, %in );
print "Content-type: text/html; charset=windows-1251\n\n";
if( length( $ENV{ 'QUERY_STRING' } ) != 0 ) {
   
   # разбор переданных GET-параметров
   my @pairs = split( /&/, $ENV{ 'QUERY_STRING' } );
   foreach ( @pairs ) {
      my ( $name, $value ) = split /=/;
      # Un-webify plus signs and %-encoding
      $value =~ tr/+/ /;
      $value =~ s/%([a-fA-F0-9][a-fA-F0-9])/pack( "C", hex( $1 ) )/eg;
   
      # Для картинок вместо кнопок
      if( $name =~ /(\w+)\.[x|y]$/ ) { $name = $1; }
      
      if( defined $in{ $name } ) {
         $in{ $name } .= ',' . $value;
      } else {
         $in{ "$name" } = $value;
      } # End if
      
   } # End foreach
   %FORM = %in;
   
   
   Encode::_utf8_off($FORM{ 'q' });
   Encode::from_to($FORM{ 'q' }, 'utf-8', 'windows-1251');
   #$FORM{ 'q' } = Encode::encode( 'cp1251', $FORM{ 'q' } ); # from utf8 to cp1251
   
   print $FORM{ 'q' };
   
} else {
print q!
<html>
<head>
<script type="text/javascript" src="/js/jquery-1.2.6.min.js"></script>
<script type="text/javascript">
function sendForm( ) {
   var dataString = $('#feedbacks_form').serialize();
   $.ajax({
     type: "GET",  
     url: "/cgi-bin/geo.pl",  
     data: dataString,  
     success: function( response ) {  
      $('#feedbackResponse').html( response );
      $('#ajax_loading').toggleClass('hidden');
     },
     error: function( response ) {  
      $('#feedbackResponse').html( '<div class="error" id="server_error">При загрузке данных произошла ошибка. <br>      Попробуйте перезагрузить страницу.<br>       Если она повторится вновь, сообщите нам об этом.   </div>' );
      $('#ajax_loading').toggleClass('hidden');
     }
   });
}
$(function(){
   $('#feedbacks_form').submit(function() {
      sendForm();
      return false;
   });
});
</script>
</head>
<body>
<form method="get" id="feedbacks_form">
   <input type="text" name="q" value=""/>
   <input type="submit" name="submit" />
</form>
<div id="feedbackResponse"></div>
</body>
</html>
!;
}

Вернуться к списку


В админку