Модераторы: korob2001, ginnie
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> кириллица в cookies, как реализовать? (при установке вручную) 
:(
    Опции темы
Deft
Дата 30.12.2008, 15:05 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



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

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



устанавливаю куки через Set-Cookie
читаю так:
Код

 $buffer=$ENV{'HTTP_COOKIE'};
@pairs = split(/; /, $buffer);
foreach $pair (@pairs) {
  ($name, $value) = split(/=/, $pair);$value =~ tr/+/ /;
  $value =~ s/%([a-fA-F0-9][a-fA-F0-9])/pack("C", hex($1))/eg;
  $in{$name} = $value;}


работает только с латиницей, что поменять чтоб и с кириллицей пахало? 
з.ы. темы на форуме по кукисам читал, но как в данном случае добавить кириллицу не нашел...
PM MAIL ICQ   Вверх
ginnie
Дата 30.12.2008, 15:18 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Комодератор
Сообщений: 1287
Регистрация: 6.1.2008
Где: Москва

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



Deft, а какие именно проблемы с кириллицей? Можно описать подробнее, а то угадывать тяжеловато.


--------------------
Написать код, понятный компьютеру, может каждый, но только хорошие программисты пишут код, понятный людям. (Мартин Фаулер. Рефакторинг)
PM MAIL Skype Jabber   Вверх
Deft
Дата 30.12.2008, 15:36 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



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

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



ну к примеру записываем "тест" читаем "тест" ...

Это сообщение отредактировал(а) Deft - 30.12.2008, 15:37
PM MAIL ICQ   Вверх
ginnie
Дата 30.12.2008, 16:12 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Комодератор
Сообщений: 1287
Регистрация: 6.1.2008
Где: Москва

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



Deft, рекомендую сохранять данные в cookie в uft8. Если не хотите, смотрите в направлении модуля Encode, Вам надо конвертировать текст из unicode в нужную кодировку (вероятно, cp1251).


--------------------
Написать код, понятный компьютеру, может каждый, но только хорошие программисты пишут код, понятный людям. (Мартин Фаулер. Рефакторинг)
PM MAIL Skype Jabber   Вверх
Deft
Дата 30.12.2008, 16:36 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



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

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



utf8 мне не подходит, т.к. еще идет работа с mysql и туда мне надо в 1251 сохранять...
а что за модуль encode и как его конкретно применить ? а то я не особо разбираюсь(
з.ы. как я понял его надо ставить отдельно? просто работаю с университетским сервером (курсовую делаю) и если этот модуь не ставится по умолчанию с перлом а является каким-то специфичным то врятли он установлен..
PM MAIL ICQ   Вверх
ginnie
Дата 31.12.2008, 14:21 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Комодератор
Сообщений: 1287
Регистрация: 6.1.2008
Где: Москва

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



Deft, работать с cookie в utf8, а в БД сохранять в cp1251 проблемы не составляет: клиент mysql умеет перекодировать (надо только указать кодировку при соединении), правда, не во всех версиях. Для перекодировки в скрипте можно использовать функцию Encode::from_to(). Модуль Encode на Вашем сервере с большой вероятностью установлен - теперь он ставится в составе дистрибутива. Проверить это не сложно - добавьте use Encode в скрипт и запустите на выполнение.


--------------------
Написать код, понятный компьютеру, может каждый, но только хорошие программисты пишут код, понятный людям. (Мартин Фаулер. Рефакторинг)
PM MAIL Skype Jabber   Вверх
tolkien
Дата 31.12.2008, 15:02 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



Кодируй значения кук url кодингом.
Тем более у тебя всравно обратный процесс декодинга уже имеется.

PM MAIL   Вверх
Deft
Дата 2.1.2009, 08:32 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



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

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



Цитата(tolkien @  31.12.2008,  15:02 Найти цитируемый пост)
Кодируй значения кук url кодингом.

что это значит? что за урл кодинг?


ginnie, 

для проверки делаю:
Код

   print $in{'log'}; // начальное значение - тест
   $lgnenc=encode("utf8",$in{'log'});
   print $lgnenc;  //в utf8  - ГІГҐГ±ГІ
   $lgnenc1=$lgnenc;
   from_to($lgnenc1, "utf8", "cp1250");
   print $lgnenc1; // пустота


в чем ошибка?

з.ы если заменить
Код

 from_to($lgnenc1, "utf8", "cp1250");

на
Код


$lgnenc1=encode("cp1251", decode("utf8", $lgnenc1));


то на выходе получаем "????"

Это сообщение отредактировал(а) Deft - 2.1.2009, 09:49
PM MAIL ICQ   Вверх
tolkien
Дата 2.1.2009, 11:34 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



Вот у тебя строчка
Код

$value =~ s/%([a-fA-F0-9][a-fA-F0-9])/pack("C", hex($1))/eg;

Она декодирует. А тебе надо наоборот еще и кодировать когда сохраняешь значения куки. Т.е русские буквы A, Б, В переводить в псолед. вида %A0, %A1, %A2. 
PM MAIL   Вверх
Deft
Дата 2.1.2009, 12:18 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



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

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



погуглил чутка, наткнулся на
Код

$str =~ s/([^A-Za-z0-9])/sprintf("%%%02X", ord($1))/seg;


оно?  декодирующая функция там вроде как у меня была.. только с seg на конце вместо eg

только помоему что в декодирующей функции что в кодирующей используется одна латиница...

Это сообщение отредактировал(а) Deft - 2.1.2009, 12:19
PM MAIL ICQ   Вверх
tolkien
Дата 2.1.2009, 14:13 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



Пример

Код


my $url = 'http://www.infanata.org/index.php?do=search&subaction=search&story=%C0%ED%E0%EB%E8%F2%E8%F7%E5%F1%EA%E0%FF%20%E3%E5%EE%EC%E5%F2%F0%E8%FF%20%E2%20%EF%F0%E8%EC%E5%F0%E0%F5%20%E8%20%E7%E0%E4%E0%F7%E0%F5';
print "before e2s\n",$url,"\n";
print "after e2s\n",e2s(\$url),"\n";
print "after s2e\n",s2e(\$url),"\n";
print "after e2s\n",e2s(\$url),"\n";

#урл декодирование
sub e2s
{
  my ($s) = @_;
  
  if (${$s})
  {
    my $p1 = 0;
    
    while( ($p1 = index(${$s}, '%', $p1)) != -1)
    {
      substr(${$s}, $p1, 3, chr(hex(substr(${$s}, $p1 + 1, 2))));
      $p1++;
    }
  }

  return ${$s};
}


#урл кодирование
sub s2e
{
  my ($s) = @_;

  if (${$s})
  {
    for (my $i = 0; $i < length(${$s}); )
    {
      my $n = ord( substr(${$s}, $i, 1) );
     
      if (($n >= 48 && $n <= 57) || ($n >= 97 && $n <= 122) || ($n >= 65 && $n <= 90))
      {
        $i++;
      }
      else
      {
        my $e = sprintf("%%%02X",$n);
        substr(${$s}, $i, 1, $e);
        $i += length($e);
      }
    }
  }
  
  return ${$s};
}

PM MAIL   Вверх
Deft
Дата 10.1.2009, 06:35 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



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

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



все оказалось проще:
подключил
Код

use URI::Escape;

затем использовал
uri_escape(); и uri_unescape();

PM MAIL ICQ   Вверх
Usmanec
Дата 24.2.2009, 16:19 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



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

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



Вобщето нецелесообразно гонять большое количество данных в заголовках запроса. Проще пользователю присвоить идентификатор и все хранить на сервере.
А вобще перед тем как установить кукис нужно преобразовать недопустимые символы.

Код

sub setcookie(%){
    my(%cook)=@_;
    my(@cook,$name,$value);
    foreach $name (keys %cook){
         $value=$cook{$name};
         $value=~s/([=\+&%\/\\\|\0-\x1f\x80-\xff])/sprintf("%%%02X",unpack('C',$1))/eg;
         $value=~y/ /+/;
         $name=~s/([=\+&%\/\\\|\0-\x1f\x80-\xff])/sprintf("%%%02X",unpack('C',$1))/eg;
         $name=~y/ /+/;
         push(@cook,"$name=$value");
         }
    return join('; ',@cook);
    }
print setcookie(
                               'Параметр1' => 'Значение1',
                               'Параметр2' => 'Значение2',
                               'ПараметрN' => 'ЗначениеN',
                               'Name'      => 'V a l u e',
                               )."\n";

В результате получим следующую строку
%CF%E0%F0%E0%EC%E5%F2%F01=%C7%ED%E0%F7%E5%ED%E8%E51; %CF%E0%F0%E0%EC%E5%F2%F02=%C7%ED%E0%F7%E5%ED%E8%E52; Name=V+a+l+u+e; %CF%E0%F0%E0%EC%E5%F2%F0N=%C7%ED%E0%F7%E5%ED%E8%E5N
PM MAIL   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "Perl: CGI программирование"
korob2001
sharq
  • В этом разделе обсуждаются вопросы относящиеся только к CGI программированию
  • Если ваш вопрос не относится к системному или CGI программированию, задавайте его в общем разделе
  • Если ваш вопрос относится к системному программированию, задавайте его здесь
  • Интерпретатор Perl можно скачать здесь ActiveState, O'REILLY, The source for Perl
  • Справочное руководство "Установка perl-модулей", качать здесь


Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, korob2001, sharq.

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Perl: разработка для Web | Следующая тема »


 




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


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

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