[PHP-users 27717] oci8 UTF-8

nomoto shin-1 @ ca2.so-net.ne.jp
2005年 12月 1日 (木) 16:06:02 JST


  いつもお世話になります。nomotoです。

PHPからPEAR DBをつかってUTF-8でデータを持っているOracle
にアクセスするスクリプトを書いているのですが、文字コードの
指定方法やPHPの環境変数の取扱いかたについて教えてください。

MiracleLinux 2.1
Apache 2.0.52
PHP 4.4.1
Oracle 10.1.0.2.0

.htaccess
php_flag magic_quotes_gpc Off
php_flag register_globals Off
php_flag output_buffering On
php_value output_handler "mb_output_handler"
php_value default_charset "UTF-8"
php_value mbstring.language "Japanese"
php_flag mbstring.encoding_translation Off
php_value mbstring.http_input "auto"
php_value mbstring.http_output "pass"
php_value mbstring.internal_encoding "UTF-8"
php_value mbstring.substitute_character "none"

Apacheの実行ユーザはnobodyで環境変数は
LANG=ja_JP.eucJP
NLS_LANG=Japanese_Japan.ja16euc
となっています。(開発環境や他のスクリプトの関係上eucから変更できません)

PHPのスクリプトをUTF-8で書いて、データもそのままUTF-8で読み込んできて
処理したかったので、ApacheのDirectoryディレクティブでスクリプトを置く
ディレクトリに対して
SetEnv LANG ja_JP.UTF-8
SetEnv NLS_LANG Japanese_Japan.UTF8
としました。

phpinfoでみると$_SERVERにはSetEnvされた値は入っているのですが
$_ENVにはSetEnv前のApache実行ユーザの環境変数がそのまま入っています。
質問1:Apache2のSetEnvとはこういうものなのですか?PassEnvしないでも
環境変数が丸ごと見えているのですが。。

この状態でDBからデータを読み込んでprint_rしてみるとなぜかEUCコードで
データが読み込まれました。
質問2:PEAR DB のoci8インタフェースだと$_ENVのほうが使われるので
しょうか?つまりApacheの設定でSetEnvしても意味がない?

そこでphpスクリプトの先頭で無理やり
putenv('LANG=ja_JP.UTF-8');
putenv('NLS_LANG=Japanese_Japan.UTF8');
としたところ、今度はちゃんとUTF-8でデータベースから読み込まれました。
質問3:こうする対処法が正しいのでしょうか?もっと良い対処法があるの
でしょうか?

putenvしても$_ENV['LANG']や$_ENV['NLS_LANG']は書き換わっていないので
上記のputenvの後で気持ちが悪いので無理やり
$_ENV['LANG'] = 'ja_JP.UTF-8';
$_ENV['NLS_LANG'] = 'Japanese_Japan.UTF8';
として$_ENVの内容も合わせました。
質問4:putenvって$_ENVまでは書き換えてくれないものなのですか?$_ENVは
自分で再設定してしまっても良いものなのでしょうか?

なんとかUTF-8でデータを持ってきて処理できるようにはなったのですが
どの対処法もこれで良いのか不安で、経験者の方がいらしたらアドバイス
を頂ければと思います。

よろしくお願いいたします。


PHP-users メーリングリストの案内