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

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> UC/LC and UTF-8, UC/LC and UTF-8 
:(
    Опции темы
mastercz
Дата 11.1.2010, 08:24 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


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

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



подскажите пожалуйста, как в UTF-8 консоли заставить работать uc()/lc() ?
заранее благодарю за ответ.

Это сообщение отредактировал(а) mastercz - 11.1.2010, 08:25
PM MAIL   Вверх
krypt3r
Дата 11.1.2010, 09:14 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



Код

use utf8;

Если будет появляться ошибка Wide character in print..., то добавьте, например, строку
Код

binmode STDOUT, ':utf8';

PM MAIL   Вверх
mastercz
Дата 11.1.2010, 09:51 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


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

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



Цитата(krypt3r @ 11.1.2010,  09:14)
Код

use utf8;

Если будет появляться ошибка Wide character in print..., то добавьте, например, строку
Код

binmode STDOUT, ':utf8';

krypt3r  а нельзя как нибудь без

Код

binmode STDOUT, ':utf8';

я, к сожалению не понимаю, зачем  она здесь, на как-то костыль напоминает.
Возможно я ошибаюсь ?

Возможно есть другие функции заменяющие uc/lc для UTF-8...
P.S >Да кстати, perl 5.8.8, UTF-8 local
PM MAIL   Вверх
krypt3r
Дата 11.1.2010, 10:07 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



Код

use utf8;
use open qw /:std :utf8/;

PM MAIL   Вверх
Pfailed
Дата 11.1.2010, 10:46 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



Еще как вариант
Код

use encoding 'utf8';

Тогда патчить stdout не нужно.


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


Шустрый
*


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

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



что-то не догоняю. подскажите пожалуйста, как быть  быть с входными данными. Флаг UTF8 из  аргументов не ставиться, как правильно заставить заставить считать перл, что к нему пришли на входе данные в UTF8.
Заранее благодарен за помощь.

Вот тестовый пример..
Код

#!/usr/bin/perl

use strict;
use utf8;
use open qw /:std :utf8/;

#use encoding 'utf8';
#binmode STDOUT, ':utf8';

#use Encode;

use DBI;
use DBD::Pg;
use Devel::Peek;



    my $dbh = DBI->connect("dbi:Pg:dbname=test", "test", "", { AutoCommit=>"0",RaiseError=>"1" });
       $dbh->{pg_enable_utf8} = 1;
       my $arg=@ARGV[0];
       my $select="select * from tsttables";
       my $sth=$dbh->prepare($select);
      $sth->execute;
     
    my $i=0;
       while(my @tmp=$sth->fetchrow_array)
         {

                print uc($tmp[0])."\t".uc($tmp[1])."\t"."\n";
                $i++;
        }

    $dbh->disconnect;

  #Encode::_utf8_on($arg);

    print "-->>".uc($arg)."\n";
    print "-->>";
    print Dump($arg)."\n";
  exit;


PM MAIL   Вверх
krypt3r
Дата 22.1.2010, 09:02 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



Если данные в базе в UTF-8, то попробуйте после коннекта провести запрос
Код

$dbh->do ("SET client_encoding = utf8");

PM MAIL   Вверх
Pfailed
Дата 22.1.2010, 10:18 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



Или такой вариант:
Код

$dbh->do('SET names utf8');



--------------------
PM MAIL   Вверх
mastercz
Дата 22.1.2010, 12:52 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


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

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




Ту дело не в Базе Данных, строки к ней можно закомментировать.

Проблема в том что, строка берущаяся в качестве аргумента без флага UTF8.

В реальной задаче данные которые я подаю на вход WEB - скрипта, превращаются в не читаемую хрень еще до записи в базу.

Думаю это не важно, но на всякий случай в реальной задаче это Apache2+ mod_perl2 + mason 1.39 + perl 5.10

PM MAIL   Вверх
krypt3r
Дата 22.1.2010, 13:57 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



Эм, а это у вас что?
Код

my $arg=@ARGV[0];

Наверно, предполагалось что-то типа
Код

my $arg=$ARGV[0];
# или
my $arg=shift;

PM MAIL   Вверх
mastercz
Дата 22.1.2010, 15:40 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


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

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



Код

my $arg=@ARGV[0]; 
#запись аналогична
my $arg=$ARGV[0];


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


Опытный
**


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

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



Цитата(mastercz @ 22.1.2010,  15:40)
Код

my $arg=@ARGV[0]; 
#запись аналогична
my $arg=$ARGV[0];

С точки зрения перла не аналогична. Первое - это срез массива, а второе элемент массива.
use warnings об этом намекает.


--------------------
PM MAIL   Вверх
mastercz
Дата 25.1.2010, 02:04 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


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

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



Выходные кончились, возвращаюсь к задаче.

Чувствую себя полным бараном но пока не вижу решения даннаой проблемы :(
Неужели ни у кого не работает Web-Perl скрипт полностью под UTF-8.
Мне кажется задачка весьма тривиальна просто я чего-то не догоняю.

Поделитесь пожалуйста опытом, как вы заставляете интерпретатор, понимать что из веб-морды пришли данные 
в UTF-8. Я предполагаю, если я усилием воли подниму флаг на переменную, то проблема исчезнет. Вот только, _utf8_on($arg); внутренняя функция, а как это сделать корректно, я не знаю. И еще, прагма use open qw /:std :utf8/; должна ИМХО работать и над STDIN и на STDOUT почему же в приведенном выше примере аргумент из командной строки не воспринимается как UTF-8. Для наглядности упрощаю вид вышеприведенного примера:
Код

#!/usr/bin/perl

use strict;
use utf8;
use open qw /:std :utf8/;
use Encode;
use Devel::Peek;

  
 my $arg=$ARGV[0];

#Encode::_utf8_on($arg);

print "-->>".uc($arg)."\n";
print Dump($arg)."\n";
exit;


PM MAIL   Вверх
krypt3r
Дата 25.1.2010, 07:55 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



Цитата

utf8::downgrade снимает флаг со строки
utf8::upgrade выставляет флаг на строку

http://www.nestor.minsk.by/sr/2008/09/sr80902.html
http://xpoint.ru/know-how/Perl/PodderzhkaUnicode
Для юникодизации массива @ARGV запускайте интерпретатор с ключом -CA
Код

$ perl -CA myscript.pl

Added:
Так как этот ключ не работает в самом скрипте, то можно в BEGIN {...} прописать насильную установку utf8-флага для @ARGV - по дефолту у этого массива данный флаг отключен

Это сообщение отредактировал(а) krypt3r - 25.1.2010, 09:19
PM MAIL   Вверх
mastercz
Дата 26.1.2010, 02:15 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


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

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



krypt3r, спасибо за помощь.

Web-скрипт вроде как отчасти заработал.
Я использовал следующую настройку под html-mason

Код

package SetMasonUTF8;
use base qw(HTML::Mason::Plugin);
use warnings;
use strict;
sub start_request_hook {
    my ( $self, $context ) = @_;
    return if $context->request->is_subrequest;
    my $args_ref = $context->args();
    foreach my $arg ( @{$args_ref} ) {
        utf8::is_utf8($arg) || utf8::decode($arg);
    }
    return;
}
1;


Плюс в настройках Apache2
Код

        PerlSetVar MasonPreamble "use utf8;"
        PerlAddVar MasonPlugins "SetMasonUTF8"

Однако почему то DBI  а именно $dbh->errstr   выдает некорректный текст несмотря на 
Код

$dbh->{pg_enable_utf8} = 1;


Получаю что-то вида 
Код

ERROR: Ð½ÐµÐ²ÐµÑ€Ð½Ñ‹Ð¹ входной синтаксис для типа double, точность: ""

Хотя обычный поток данных от DBI идет как нужно.

Да и еще, не врубаюсь почему вместо приведенной надстройки не работает прагма 
Код

use open qw /:std :utf8/;

PM MAIL   Вверх
Ответ в темуСоздание новой темы Создание опроса
Правила форума "Perl"
korob2001
sharq
  • В этом разделе обсуждаются общие вопросы по языку Perl
  • Если ваш вопрос относится к системному программированию, задавайте его здесь
  • Если ваш вопрос относится к CGI программированию, задавайте его здесь
  • Интерпретатор Perl можно скачать здесь ActiveState, O'REILLY, The source for Perl
  • Справочное руководство "Установка perl-модулей", можно скачать здесь


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

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


 




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


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

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