[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