• 締切済み

日本語だけ文字化け

Solaris上で、Perl(5.005_03)を用い、DB(Oracle10.2.0)のデータを抽出しブラウザで表示させた際に、日本語のみが??????という感じに、半角の"?"で表示されてしまいます。 Solaris上で、cgiファイルを標準出力したり、Perlのデバッガで表示させると問題なく日本語表示されます。また、ブラウザでもDBから抽出した文字以外の日本語は問題なく表示されます。加えて、OUT関数を用いても、やはりDBから抽出した値のみ?表記になってしまいます。 下記に利用したCGIを書き出してみます。(DB接続以降の記述のみ) ------------------ここから--------------------- my $dbh = DBI->connect($datasrc, $username, $password) || die DBI::errstr; my $sql = "SELECT AAA FROM XXXXX"; my $sth = $dbh->prepare($sql) || die $dbh->errstr; $sth->execute || die $dbh->errstr; print "Content-type: text/html\n\n"; print "<HTML>\n<HEAD>\n"; print "<TITLE>DBテスト</TITLE>\n"; print "<meta http-equiv=Content-Type content=text/html; charset=Shift_JIS>\n"; print "</HEAD>\n<BODY>\n"; print "DB接続テスト<P>\n"; # display results my @results; my $count; while($count < 2) { @results = $sth->fetchrow; print "あああ"; print "@results\n<P>"; print ,$count++,"行目\n"; } $sth->finish; $dbh->disconnect; print "\n</BODY>\n</HTML>\n"; ------------------ここまで--------------------- ブラウザ表示の結果は、 DB接続テスト ???????? ???????? となってしまいます。"DB接続テスト"は正常に表示されて、print "@results\n<P>";が????に置換わり、"行目\n"が非出力となってしまいます。DB(AAA列)の値が数字や英数は問題なくブラウザ表示されます。 日本語全てが一律文字が置き換わるのであれば、文字コードの問題だと疑うのですが、SELECT文の日本語のみが、?というのはどうしてなのかがわかりません。また、Solaris上でのデバッガーや標準出力は問題なく、ブラウザやOUT関数でファイルに書き出すと、?になるのもわかりません。 もし、ご存知の方がいらっしゃいましたら、教えてくださいm(_ _)m

みんなの回答

  • t-okura
  • ベストアンサー率75% (253/335)
回答No.3

> Solaris上で、cgiファイルを標準出力したり、Perlのデバッガで表示さ > せると問題なく日本語表示されます。 とのことなので、Webサーバ経由でデータベースからデータを取り出した場 合におかしくなっていると思います。 Oracle データベースとクライアントとの間では、NLS_LANG 環境変数の値 により文字コード変換が行われますので、Solaris 上で直接実行したとき の NLS_LANG の値と、Webサーバ経由で実行した場合の NLS_LAMG の値を比 べてみてはいかがでしょうか。 NLS_LANG の値は perl であれば $ENV{NLS_LANG} で参照可能です。

skypearl
質問者

お礼

t-okuraさん ご回答ありがとうございます。 $ENV{NLS_LANG}をコードに記述し、Perlの標準出力で実行すると、 NLS_LANG="Japanese_Japan.JA16SJISTILDE"と表示されます。 当然SJISなので標準出力では文字化けしない事が確認できました。 Webブラウザでも確認をしたいと思い、printで記述してみたのですが、 非表示になってしまい、表示する事ができませんでした。エラーも特に無しです。また、print OUTで、ファイルに書き出しても同じように非表示でした。 初歩的な質問で恐縮ですが、Webに書き出すコードをご存知であればご教授いただきたいです。宜しくお願い致します。

skypearl
質問者

補足

解決しました! DB接続の前に下記の記述を書いたらOKでした。 $ENV{NLS_LANG} = 'JAPANESE_JAPAN.JA16SJIS'; $ENV{NLS_LANGUAGE} = 'JAPANESE'; 本当に、ご回答ありがとうございました。

回答No.2

文字化けなんで、基本的にどこかで文字コードがおかしくなっているのが原因だと思うんですが、標準出力で問題ないならWebサーバでの設定だと思ったんですが、違いましたか。。。 もう一度質問文を読ませていただいて気付いたのですが、 Perl5でShift_JISなんですね。 ソースもShift_JISだと思いますが、表示しようとしている文字に"表示"とか"能力"とか含まれてませんか? 久しぶりだったのですぐ気付かなかったのですが、たぶんCGIでShift_JISを出力しようとすると化ける例ではないかと。

skypearl
質問者

補足

"表示"とか"能力"とかそのほか、Perlで文字化けする文字列はDBから取得していなんです。 print "DB接続テスト<P>\n"; は問題なく表示できて、 @results = $sth->fetchrow; の部分だけ表示が?になるっていうのが、 わからないんですよね~。 Perlの中身の全ての日本語が?になれば、ある程度予想はつくと思うのですが。 ほんと、考えてくれてありがとうございます。

回答No.1

はずしているかもしれませんが、 Webサーバのデフォルト文字コードが悪さしてるんではないですか? (HTTPヘッダになんか出てませんか?)

skypearl
質問者

お礼

念のため、HTTPヘッダーをFirefoxから抜き取りましたので、掲載させて頂きます。 ●レスポンスヘッダー Date: Fri, 07 Mar 2008 04:58:12 GMT Content-Type: text/html Proxy-Connection: close Server: Apache P3P: CP="NON DSP COR CURa ADMa DEVa CUSo TAIa PSDo OUR BUS UNI COM NAV STA" Via: 1.0 brooklyn3 (NetCache NetApp/6.0.4P1) ●リクエストヘッダー Host: www.test.co.jp User-Agent: Mozilla/5.0 (Windows; U; Windows NT 5.1; ja; rv:1.8.1.12) Gecko/20080201 Firefox/2.0.0.12 Accept: text/xml,application/xml,application/xhtml+xml,text/html;q=0.9,text/plain;q=0.8,image/png,*/*;q=0.5 Accept-Language: ja,en-us;q=0.7,en;q=0.3 Accept-Encoding: gzip,deflate Accept-Charset: Shift_JIS,utf-8;q=0.7,*;q=0.7 Keep-Alive: 300 Proxy-Connection: keep-alive Cookie: GalileoCookie=R7DsysCo6asdayoNU If-Modified-Since: Wed, 14 Feb 2007 15:09:11 GMT If-None-Match: "d50ee-930-45d32617" Cache-Control: max-age=0

skypearl
質問者

補足

genkivogueさん ご回答ありがとうございました。一応、HTTPヘッダを調べてみたのですが、特に問題となるような点は無さそうでした。ほんと、何の問題なのかよくわかりません。

関連するQ&A