• 締切済み

phpとoracleを用いたシステムでの文字化け

phpとoracleを用いたシステムでwebサイトを構築しているのですが、 ブラウザからアクセスしページ表示した際に、全角文字が文字化けしてしまいます。 ◆環境 webサーバ:apache, php, oracleClient, PDO_OCI DBサーバ:oracle DBデータアクセス方法:PDO ◆事象の詳細 文字化けといっても必ず ???? とクエスチョン続きで表示されます。 上記webサーバのコマンドラインでphpのバッチを実行したところ、 コマンドライン上では正常に全角文字が表示されます。 まったく同じバッチをwebブラウザからhttpでアクセスを行ったところ、 文字化けしてしまいます。 ブラウザでの表示が悪いのではと思い、 phpのバッチ実行時に結果をテキスト出力させる処理を追加したのですが、 コマンドラインで実行した際は正常に出力され、ブラウザでアクセスした際は内容が文字化けして出力されました。 上記事象からアパッチが影響してるのではと考えられるので、 webサイトごと個別のhttpd.confの設定ファイルに NLS_LANG を設定したのですが、 結果は変わりませんでした。 文字コードの指定がない(正しくない)から文字化けするというよりは DBサーバから取得する文字列をどう受け取って(扱って)いいのかわからないという感じがします。 何か解決策等、わかる方がいましたらご教授いただけますでしょうか。

みんなの回答

  • shimix
  • ベストアンサー率54% (865/1590)
回答No.2

PDO_OCIならDSNで文字セット指定がありますよね?それは何を指定していますか? http://php.net/manual/ja/ref.pdo-oci.connection.php >???? >とクエスチョン続きで表示されます。 表示している文字列データがSJIS(cp932)で、ブラウザがutf-8などと認識していたりはしないんですかね。 #コマンドラインはcp932 onlyですから >文字コードの指定がない(正しくない)から文字化けするというよりは この可能性を除外するためには「ブラウザ側のエンコードをどう変えても同じ化け方になる」ことを確認しないといけませんが、それは確認済みということでいいでしょうか? という内容を他所(http://www.phppro.jp/qa/4604)で書きました。こちらにまとめます(あちらではレスしません)のであしからず。

hsmt8
質問者

補足

ご回答ありがとうございます。 >PDO_OCIならDSNで文字セット指定がありますよね?それは何を指定していますか? 上記については以前EUCを指定していましたが、どの文字コードを指定しても「????」となるため、 現在は指定しておりません。 設定をいくつか変えましたので、再度設定を行って確認してみます。 >この可能性を除外するためには「ブラウザ側のエンコードをどう変えても同じ化け方になる」ことを確認しないといけませんが、それは確認済みということでいいでしょうか? HTML上のcharset、putenvでの文字コード(NLS_LANG)指定、ブラウザの機能を利用してのエンコードぐらいであれば確認しました。Shift-JIS,EUC,UTF-8のどれに変えても???という表示でした。 >表示している文字列データがSJIS(cp932)で、ブラウザがutf-8などと認識していたりはしないんですかね。 ソースファイル、サーバのNLS_LANG設定、表示ページのcharset、DBのcharsetはすべてEUCに統一しています。 また、ブラウザ表示前に文字列の文字コードをphp関数で表示させたときも「EUC-JP」で返ってきました。 「ブラウザの認識」について、上記方法以外に確認した方がいい点がありましたら教えていただけますでしょうか。

回答No.1

こんにちは。 DBの文字コードやPHPの設定、PHPスクリプトを記述しているファイルの文字コードなど環境に依存するいくつか原因が考えられますので一概には言えないのですが、差しあたって以下の点を確認してみるといかがでしょうか。 (1) php.iniでdefault_charsetを設定 php.iniで指定するパラメータのdefault_charsetでは、既定の文字コードを指定することができます。デフォルトではコメントアウトされていると思いますのでコメントを外して任意の文字コードを指定します。例えばutf-8を指定する場合は以下のようになります。 ○デフォルトの設定 ;default_charset = "iso-8859-1" ○変更後の設定 default_charset = "utf-8" (2) スクリプトの先頭でheader関数を実行 スクリプトの先頭でheader関数を実行して文字コードを指定することでデバッグし、問題の切り分けします。Httpレスポンスの出力時の問題ならばこちらで解消されるかもしれません。以下、UTF-8の場合です。 <?php header("Content-Type: text/html; charset=UTF-8"); echo "テスト"; ?> ご参考になれば幸いです。

hsmt8
質問者

補足

ご回答ありがとうございます。 >(1) php.iniでdefault_charsetを設定 php.iniに関しましては同サーバの他システムが影響してしまうため、変更ができません。 ただwebサイトごとに設定を指定できるconfファイルで、phpの設定を個別で書くことができるようなので、そちらで試してみます。 >(2) スクリプトの先頭でheader関数を実行 本事象のHTTPアクセスで文字化けするものは、DBへアクセスし取得した全角文字のみでした。 phpソース内で書いた全角文字は正常に表示されています。

関連するQ&A

専門家に質問してみよう