Newsgroup: it.comp.lang.perl
Titolo: [OT] mod_perl e UTF-8

Ciao, ho configurato Apache con la direttiva:
AddDefaultCharset UTF-8
e serve le normali pagine statiche in questo encoding, in più ho un db 
Postgres sempre codificato in UTF-8, il problema è che le pagine servite 
da script mod_perl continuo a verderle in 8859-1, che devo fare per 
ottenere un output in UTF-8? ho provato con un -C ma non funge. Di 
seguito un estratto della mia configurazione mod_perl:
# attivo la modalità Taint del Perl per mod_perl
PerlTaintCheck On
# attivo il supporto Unicode
PerlSwitches -C
# Includo le directory delle librerie
PerlSwitches -I/usr/lib/cgi-bin/share
# Precarico Apache::DBI e gli altri moduli più usati
# attenzione, metterlo dopo Include mods-enabled in modo che mod_perl
# sia già caricato
# this comes before all other modules using DBI
PerlModule Apache::DBI
PerlModule DBI
PerlModule CGI
PerlModule DBD::Pg

 in più ho un db Postgres sempre codificato in UTF-8,
Puoi verificare il client encoding del tuo db?
SHOW client_encoding;

Emanuele Zeppieri ha scritto:

db=# SHOW client_encoding;
  client_encoding
-----------------
  UTF8
(1 row)
db=# \l
         List of databases
    Name    |  Owner   | Encoding
-----------+----------+----------
  db        | postgres | UTF8
  postgres  | postgres | UTF8
  template0 | postgres | UTF8
  template1 | postgres | UTF8
(4 rows)

 (1 row)
Grazie.
Allora prova a forzare gli header (come prima istruzione di stampa del 
tuo script):
print header( -type => 'text/html', -charset => 'utf-8' );
(perché la direttiva AddDefaultCharset non è del tutto affidabile).
Se non va, in aggiunta prova:
PerlSwitches -COE
oppure:
PerlSwitches -CS
(perché C senza niente dipende dal tuo locale. A latere, poi sarà 
comunque meglio limitarci a -COE, per altri motivi...)

 comunque meglio limitarci a -COE, per altri motivi...)
Nulla, non va, l'applicazione è una vecchia applicazione che ho migrato 
sotto mod_perl (Registry) che usa CGI::Ajax, ho settato un header 
personalizzato e ho cambiato gli switch del mod_perl ma nulla:
my $ajax=new CGI::Ajax(... [CUT] ...);
...
#invio la pagina all'utente
print $ajax->build_html($cgi, $page, {-type => 'text/html', -charset => 
'UTF-8'});
Ho provato sia con COE (non so cosa facciano O e E) che con CS ma non 
cambia nulla. Da notare che tutte le chiamate fatte anche a CGI normali 
restituivano sempre ISO-8859-1 malgrado le pagine statiche venissero 
servite in UTF-8 grazie ad AddDefaultCharset. Settando esplicitamente 
l'header nei CGI normali risolvo:
print $cgi->header('Content-Type: text/html; charset=UTF-8');
mi piacerebbe sapere se posso impostare l'header a livello globale per 
tutti gli script mod_perl.
Per quanto esposto sopra mi viene da pensare che sia un problema di 
CGI::Ajax
L'interprete che ho installato mi da:
# perl -v
This is perl, v5.8.8 built for x86_64-linux-gnu-thread-multi
[CUT]
# perl --help
Usage: perl [switches] [--] [programfile] [arguments]
   -0[octal]       specify record separator (\0, if no argument)
   -a              autosplit mode with -n or -p (splits $_ into @F)
   -C[number/list] enables the listed Unicode features
   -c              check syntax only (runs BEGIN and CHECK blocks)
   -d[:debugger]   run program under debugger
   -D[number/list] set debugging flags (argument is a bit mask or alphabets)
   -e program      one line of program (several -e's allowed, omit 
programfile)
   -f              don't do $sitelib/
sitecustomize.pl
 at startup
   -F/pattern/     split() pattern for -a switch (//'s are optional)
   -i[extension]   edit <> files in place (makes backup if extension 
supplied)
   -Idirectory     specify @INC/#include directory (several -I's allowed)
   -l[octal]       enable line ending processing, specifies line terminator
   -[mM][-]module  execute "use/no module..." before executing program
   -n              assume "while (<>) { ... }" loop around program
   -p              assume loop like -n but print line also, like sed
   -P              run program through C preprocessor before compilation
   -s              enable rudimentary parsing for switches after programfile
   -S              look for programfile using PATH environment variable
   -t              enable tainting warnings
   -T              enable tainting checks
   -u              dump core after parsing program
   -U              allow unsafe operations
   -v              print version, subversion (includes VERY IMPORTANT 
perl info)
   -V[:variable]   print configuration summary (or a single Config.pm 
variable)
   -w              enable many useful warnings (RECOMMENDED)
   -W              enable all warnings
   -x[directory]   strip off text before #!perl line and perhaps cd to 
directory
   -X              disable all warnings