[PHP-dev 220] [PATCH] improved multibyte patch for PHP 4.1.*
Masaki Fujimoto
php-dev@php.gr.jp
Wed, 23 Jan 2002 01:21:57 +0900
ふじもとです。
前に作ったPHP 4用のマルチバイトパッチの改良版を作りました。これにより、
国際化版PHP 3とほぼ同様の機能が得られるはずです。よろしければお使いくだ
さい。
今回は影響する箇所が多いので、一人は十分なテストが出来そうなく、とりあえ
ずdev-jpに流させていただきました(勿論、最低限の動作確認はしてありますの
でいきなりcore吐いたりはしません。多分)。
[使い方等]
(1) ダウンロード
http://nx.dip.jp:8080/php/php-4.1.0-multibyte-20020123.patch.gz
http://nx.dip.jp:8080/php/php-4.1.1-multibyte-20020123.patch.gz
からお使いのバージョンに対応した方のパッチをダウンロードしてください。
(2) apply(4.1.0の場合)
% tar zxvf php-4.1.0.tar.gz
% gunzip -c /tmp/php-4.1.0-multibyte-20020123.patch.gz | patch -p0
% cd php-4.1.0
% ./buildconf
buildconfが必要です。ちなみにbuildconfするにはlibtool 1.4以降が必要
のようです。インストールが面倒とかパッチ当てるのさえ面倒、という方の
ためにpatch/buildconf済みのパッケージを
http://nx.dip.jp:8080/php/php-4.1.0-multibyte-20020123.tar.gz
http://nx.dip.jp:8080/php/php-4.1.1-multibyte-20020123.tar.gz
に置いてあります。
(3) 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
が有効になります。設定できる値は mbstring.http_input とほぼ同様です
がJISは未サポートです。これによりデフォルトのスクリプトエンコーディ
ングを指定することが出来るようになり、また自動検出もサポートします。
自動検出の精度は mb_detect_encoding() 関数と同様です(なぜなら同じも
のを使っているからです:D)。
また、mbstring.script_encodingで指定された値は各々のスクリプトに
encoding ディレクティブ(前回のパッチ参照)を記述することによって上書
きすることができます。
[--enable-mbstr-enc-trans]
さらにさらに --enable-mbstr-enc-trans が指定されているとスクリプトを
コンパイルする段階でscript_encodingで指定された値から
mbstring.internal_encodingで指定された値への文字エンコーディング変換
が行われます(この辺は国際化版PHP 3と同様かと思います。僕は使ったこと
が無いのでなんともいえませんが...)
(4) 制限事項等
[JISは未サポート]
前述の通りJISは未サポートです。といってもinput/output filterを書くだ
けなので対応はすぐ出来るはずです。でも需要がなさそうなのでとりあえず
先送りしています。
[eval()のエンコーディングに関して]
eval()で実行されるコードのエンコーディングは
mbstring.internal_encoding であると見なして動作します。スクリプトに
直にeval()の中身を記述している場合は問題ありませんが、ファイルから読
み込んだ値を実行する場合は注意してください(encodingディレクティブを
使用か、mb_internal_encoding()を使用すれば対応できます)。
[Windowsでの動作]
実はWindows版での動作は未確認です(buildが面倒なだけですが)。時間がと
れればテストしますが、動作確認を行ってくださった方がいましたら是非お
知らせください。
ちなみに多分 config.w32.h に
#define ZEND_MULTIBYTE 1
#define HAVE_MBSTRING 1
#define MBSTR_ENC_TRANS 1
とか書くだけじゃだめで(きっとunresolved symbolが出ます)、mbstringの
シンボルライブラリかスタティックライブラリをリンクする必要があるかな、
と思います。
--
藤本 真樹
アストラザスタジオ
fujimoto@studio.co.jp
fujimoto@php.net