🚀 go-pugleaf

RetroBBS NetNews Server

Inspired by RockSolid Light RIP Retro Guy

Thread View: pl.comp.bazy-danych
4 messages
4 total messages Started by Czarek Grądys Tue, 23 Jun 2015 09:41
PostgreSQL - perl DBI problem z kodowaniem UTF8
#194497
Author: Czarek Grądys
Date: Tue, 23 Jun 2015 09:41
84 lines
3135 bytes
Mam taki problem:
Czytam skryptem perlowym z bazy danych i w liniach zawierających 'Pokój' 
mam inne kodowanie niż w reszcie.

Skrypt mniej więcej taki:

#!/usr/bin/perl
use utf8;
use DBI;
use Config::Tiny;
# use strict;

my $driver   = "Pg";
my $host = 'localhost';
my $port = 5432;
my $userid = 'czarek';
my $database = 'pomiary';
my $password = '';


# Połączenie z bazą
local $dsn = "DBI:$driver:dbname=$database;host=$host;port=$port";
local $dbh = DBI->connect($dsn, $userid, $password, { RaiseError => 1 })
                       or die $DBI::errstr;
print "Opened database successfully\n";

# .......
# .......


# to poniżej w pętli:
   $stmt = qq(SELECT
                    rank() OVER(ORDER BY trim(p.nazwa),trim(p.opis||' 
'|| nazwa_punktu))  AS lp,
                    trim(p.nazwa) AS lokalizacja,
                    trim(p.opis||' '|| nazwa_punktu) AS nazwa,
                    n.wartosc,
                    pomiar,
                    CASE WHEN pomiar >= n.wartosc THEN 'TAK' ELSE 'NIE' END
                    --       n.opis AS norma
                FROM
                    pomieszczenie p
                JOIN
                    wynik_osw w ON (p.id=w.id_pom)
                JOIN
                    norma_osw n ON (n.id=w.id_norm)
                WHERE
                    n.id <> 22 -- nie mierzyc
                AND  trim(poziom) = '$pietro';

              );


     $sth = $dbh->prepare( $stmt );
     $rv = $sth->execute() or die $DBI::errstr;
     if($rv < 0){
        print $DBI::errstr;
        exit -1;
     }
     while(my @row = $sth->fetchrow_array()) {
       my $lp = $row[0];
       my $nr_obw = $row[1];
       my $nazwa_urzadz = $row[2];
       my $zabezp = $row[3];
       my $wynik = $row[4];
       my $tak_nie = $row[5];
       print PLIK "$lp & $nr_obw & $nazwa_urzadz & $zabezp & $wynik & 
$tak_nie \\\\\n \\hline\n";
     }



W psql to zapytanie daje dobre wyniki, niestety tu coś nie gra i linie 
mające w p.opis = 'Pokój%' wychodzą w innym kodowaniu niż reszta. Jak 
się nie uda rozwiazać problemu, to najwyżej zamienię ten Pokój na Pokoj,
ale to mało elegancko na wydruku będzie.





-- 
Cezary Grądys
czarekgr@wa.onet.pl
Re: PostgreSQL - perl DBI problem z kodowaniem UTF8
#194498
Author: Czarek Grądys
Date: Tue, 23 Jun 2015 10:12
21 lines
1724 bytes
W dniu 23.06.2015 o 11:41, Czarek Grądys pisze:
> Mam taki problem:
> Czytam skryptem perlowym z bazy danych i w liniach zawierających 'Pokój'
> mam inne kodowanie niż w reszcie.
>



Problem już rozwiązany, trzeba było dać po otwarciu pliku binmode:


  open (PLIK , ">$plik") or die "nie moge otworzyc pliku";
  binmode PLIK, ":encoding(utf8)";


Ciekawe tylko, dlaczego źle było tylko z tym pokojem, 'ó' występowało w 
innych wyrazach i szlo dobrze.

-- 
Cezary Grądys
czarekgr@wa.onet.pl
Re: PostgreSQL - perl DBI problem z kodowaniem UTF8
#194499
Author: hubert depesz lubaczewski
Date: Tue, 23 Jun 2015 11:09
36 lines
1944 bytes
On 2015-06-23, Czarek Grądys <czarekgr@wa.onet.pl> wrote:
> Skrypt mniej więcej taki:
> #!/usr/bin/perl
> use utf8;
> use DBI;
> use Config::Tiny;

Ja wiem, że długie, ale przeczytaj proszę:
https://stackoverflow.com/questions/6162484/why-does-modern-perl-avoid-utf-8-by-default/
pytanie, i pierwszą odpowiedź (tchrist'a).

Ja po tym po prostu mam taki "boilerplate" dla wszystkich skryptów
perlowych:

#v+
# UTF8 boilerplace, per http://stackoverflow.com/questions/6162484/why-does-modern-perl-avoid-utf-8-by-default/
use v5.14;
use strict;
use warnings;
use warnings qw( FATAL utf8 );
use utf8;
use open qw( :std :utf8 );
use Unicode::Normalize qw( NFC );
use Unicode::Collate;
use Encode qw( decode );
if ( grep /\P{ASCII}/ => @ARGV ) {
    @ARGV = map { decode( 'UTF-8', $_ ) } @ARGV;
}
# If there is __DATA__,then uncomment next line:
# binmode( DATA, ':encoding(UTF-8)' );
# UTF8 boilerplace, per http://stackoverflow.com/questions/6162484/why-does-modern-perl-avoid-utf-8-by-default/
#v-

To rozwiązuje większość problemów.

depesz
Re: PostgreSQL - perl DBI problem z kodowaniem UTF8
#194500
Author: Czarek Grądys
Date: Tue, 23 Jun 2015 12:57
22 lines
1732 bytes
W dniu 23.06.2015 o 13:09, hubert depesz lubaczewski pisze:
> On 2015-06-23, Czarek Grądys <czarekgr@wa.onet.pl> wrote:
>> Skrypt mniej więcej taki:
>> #!/usr/bin/perl
>> use utf8;
>> use DBI;
>> use Config::Tiny;
>
> Ja wiem, że długie, ale przeczytaj proszę:
> https://stackoverflow.com/questions/6162484/why-does-modern-perl-avoid-utf-8-by-default/
> pytanie, i pierwszą odpowiedź (tchrist'a).
>
> Ja po tym po prostu mam taki "boilerplate" dla wszystkich skryptów
> perlowych:
>

Dzięki na pewno się przyda.


-- 
Cezary Grądys
czarekgr@wa.onet.pl
Thread Navigation

This is a paginated view of messages in the thread with full content displayed inline.

Messages are displayed in chronological order, with the original post highlighted in green.

Use pagination controls to navigate through all messages in large threads.

Back to All Threads