[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