Hello,

 

I have a cgi application that works fine using DBD::Pg to insert/select data
from a PostgreSQL using UTF-8 (database created as UNICODE).  We have data
in multiple languages stored, which has been working fine.

 

I have modified the application to use either Oracle or PostgreSQL,
depending on a config file.  The PostgreSQL part still works fine - web page
shows up correctly (we specify utf-8 encoding in the header), no problems.

 

The Oracle way is problematic.

 

>From SQLPLUS, it appears that I can INSERT and SELECT data in French, for
example, and it all looks correct.  The environment in my Linux window has
these variables:

NLS_LANG=.UTF8                     ----->   this also works with
NLS_LANG=AMERICAN_AMERICA.UTF8

ORACLE_SID=STSDEV1

ORACLE_BASE=/home/oracle

LANG=UTF-8

ORA_NLS33=/home/oracle/product/9.2.0/ocommon/nls/admin/data

ORACLE_HOME=/home/oracle/product/9.2.0

 

I set ORACLE_HOME, ORACLE_SID, ORA_NLS33, and NLS_LANG environment variables
in httpd.conf, and in programs that I run for tests that are not running as
web apps.

 

If I connect via DBD::Oracle, I get some of the French special characters to
come out right, and others do not.  I have been told that some (when
retrieved) are actually encoded in UTF8, and others are Latin1.

 

I use the same input data, fetch the same translated data, etc.  The only
differences that are left seems to be DBD::Oracle, Oracle itself, and the
environment settings for Oracle.

 

I extracted some basic data, known to be utf8, and inserted it into a table
using Oracle SQLLDR.   Then, I retrieved it using a sql script, via sqlplus,
spooling the output to a file.  If I read that file, and output it to a web
page, it looks fine.

 

If I read the data via DBD::Oracle, it has garbage characters instead of the
special characters.

 

This seems to point to DBD::Oracle being the cause of the problems.  Perhaps
some method I need to call that I did not get from the documentation?

 

I will append the basic test program below (simple program, instead of giant
application - same type of results):

 

Any advice gratefully received.  I have never had so much trouble with a DBD
application, and have used DBD::Oracle before with no trouble.

 

Susan Cassidy

 

----------------------------------------------------------------------------
-------------------------------------

 

#!/usr/local/bin/perl

 

use CGI;

use DBI;

 

our $dbh;

our $sth;

 

$dbuser="xxx";

$dbpasswd="yyy";

$dbserver='devsys';

$db_sid='TEST1';

 

 

#$ENV{NLS_LANG}='AMERICAN_AMERICA.UTF8';

$ENV{NLS_LANG}='.UTF8';

$ENV{ORA_NLS33}='/home/oracle/product/9.2.0/ocommon/nls/admin/data';

$ENV{ORACLE_HOME}='/home/oracle/product/9.2.0';

 

$dbh= DBI->connect("dbi:Oracle:host=$dbserver;sid=$db_sid", $dbuser,
$dbpasswd,

    {PrintError => 0, AutoCommit => 1}) or  errexit( "Unable to connect to
$dbserver: $DBI::errstr");

 

 

my $html_hdr=<<"EOF";

<html>

<head>

<title>SYSTRAN - UTF8 Test</title>

<meta http-equiv="Content-Type" content="text/html; charset=utf-8">

<link rel="stylesheet" href="http://www.systransoft.com/Systran.css";
type="text/css">

</head>

<h3>Sample data</h3>

<table cellpadding=0 cellspacing=2 border=1>

EOF

 

my $cgi=new CGI;

print $cgi->header( -charset=>'utf-8');

print $html_hdr;

print <<"EOF";

<tr bgcolor="silver">

<td>TU</td>

<td>English</td>

<td>French</td>

</tr>

EOF

 

  my (@data);

 

  my ($select_stmt)=<<"  EOF";

  SELECT source, target from test_trans

  EOF

 

  execute_db_statement($select_stmt, __LINE__);

  while (@data = $sth->fetchrow_array) {

    foreach (@data) { $_='' unless defined}

    next if ($data[0] eq '');

    print '<tr><td>',(join "</td><td>",@data),"</td></tr>\n";

  }

  #check for problems with premature termination

  errexit($sth->errstr) if $sth->err;

print <<"EOF";

</table>

<p>

</body>

</html>

EOF

exit;

 

sub errexit {

  my (@msg)[EMAIL PROTECTED];

  print @msg,"\n";

  exit 1;

}

 

 

 

sub execute_db_statement {

  #this subroutine will prepare and execute a statement for the database,

  # and errexit if it fails either step

  my ($statement, $lineno)[EMAIL PROTECTED];

  my ($rc);

  #get basic machine info

  $sth=$dbh->prepare($statement) ||

    errexit("bad prepare for stmt $statement at line $lineno, error:
$DBI::errstr");

  $rc=$sth->execute() ||

    errexit("can't execute statement:\n$statement\n at line $lineno, ",

     "return code $rc: DB error: $DBI::errstr");

} # end sub execute_db_statement

Reply via email to