[PHP-users 5029] [PATCH] improved multibyte patch for PHP 4.1.*
Masaki Fujimoto
php-users@php.gr.jp
Sun, 27 Jan 2002 23:54:04 +0900
ふじもとです。
PHP 4対応のマルチバイトパッチ(一応最終版。これで問題なさそうなら本家に投
げてみます。多分ダメだろうけど:( )を作りましたので、よろしければお使いく
ださい。詳細は以下の通りです。
[機能]
mbstringモジュールで補え切れなかった国際化版PHP3の機能+αを提供します。
これによりPHP4でPHP3国際化版と同様(ひょっとしたら+α)の機能を得ることが
出来ます。
- php.iniのmbstring.script_encodingディレクティブによるスクリプトエンコー
ディングの指定
- mbstring.script_encodingからmbstring.internal_encodingへのエンコーディ
ングの自動変換
- encodingディレクティブによる個々のスクリプトのエンコーディング指定
[使いかた]
(1) ダウンロード
[patch]
http://nx.dip.jp:8080/php/php-4.1.0-multibyte-20020124.patch.gz
http://nx.dip.jp:8080/php/php-4.1.1-multibyte-20020124.patch.gz
[tar.gz]
http://nx.dip.jp:8080/php/php-4.1.0-multibyte-20020124.tar.gz
http://nx.dip.jp:8080/php/php-4.1.1-multibyte-20020124.tar.gz
[Windows版バイナリ]
http://nx.dip.jp:8080/php/php-4.1.0-win32-mb-20020124.lzh
http://nx.dip.jp:8080/php/php-4.1.1-win32-mb-20020124.lzh
(廣川さんの配布してくださっているWindows版マルチバイト対応PHP4に上記
機能を追加したものです)
patchを使用する場合は
% gunzip -c /tmp/php-4.1.0-multibyte-20020123.patch.gz | patch -p0
とした後buildconfして下さい。
(2) configure
今回のパッチに関連するconfigureオプションは以下の通りです。
[--enable-zend-multibyte]
configureオプションに --enable-zend-multibyte をつけるとZend Engine
のマルチバイト対応機能が有効になります。これにより得られる機能は前回
のパッチと同様です(encoding "Shift_JIS"; とか書くとShift_JISのスクリ
プトをparse出来ます)。
[--enable-mbstring]
さらに --enable-mbstring が指定されているとphp.ini(もしくは.htaccess)
の
mbstring.script_encoding
が有効になります。設定できる値はUTF-8, Shift_JIS, EUC-JP, AUTO, PASS,
未定義のいずれかです。未定義の場合はPASSと同様の扱いとなります。これ
によりデフォルトのスクリプトエンコーディングを指定することが出来るよ
うになり、またAUTOを指定するれば自動検出も可能します。
また、mbstring.script_encodingで指定された値は各々のスクリプトに
encoding ディレクティブ(前回のパッチ参照)を記述することによって上書
きすることができます。
[--enable-mbstr-enc-trans]
さらにさらに --enable-mbstr-enc-trans が指定されているとスクリプトを
コンパイルする段階でscript_encodingで指定された値から
mbstring.internal_encodingで指定された値への文字エンコーディング変換
が行われます。
(3) 使用例
configureが終了したら通常どおりインストールを行ってください。で、例
えばphp.iniを以下のように設定するとShift_JISで記述されたスクリプトを
問題なく動作させることが出来ます(多分)。
[mbstring]
mbstring.internal_encoding = Shift_JIS
mbstring.http_input = auto
mbstring.http_output = Shift_JIS
mbstring.detect_order = auto
mbstring.substitute_character = none;
mbstring.script_encoding = Shift_JIS
上記の設定で、仮にEUC-JPで記述されたスクリプトが1つだけあったとする
と、
<?php
encoding "EUC-JP";
print "これはEUC-JPで書かれたスクリプト\n";
?>
の様にencodingディレクティブを使用することで個々のファイルのエンコー
ディングを指定することが出来ます。
(4) 注意事項
[JISは未サポート]
JISは未サポートです。といってもinput/output filterを書くだけなので対
応はすぐ出来るはずです。スクリプトをJISで書いている人がいるとは思え
ないので先送りしています。
[eval()のエンコーディングに関して]
eval()で実行されるコードのエンコーディングは
mbstring.internal_encoding であると見なして動作します。スクリプトに
直にeval()の中身を記述している場合は問題ありませんが、ファイルから読
み込んだ値を実行する場合は注意してください(encodingディレクティブを
使用するか、mb_internal_encoding()を使用すれば対応できます)。
以上、長々とすみません。問題点や疑問点とうありましたらご指摘ください。
--
藤本 真樹
アストラザスタジオ
fujimoto@studio.co.jp
fujimoto@php.net