mbstring無しのPHPでの動作に関して

PukiWiki1.4からは、PHPmbstring付きでビルドされていることが前提となっています。しかしながら,RedHat8,9では、標準では mbstringが入っていません。
リビルドできる環境なら問題ないですが、レンタルサーバなどで困難な場合に対応して、Jcodeを使用したmbstring互換関数を 7/3版の1.4rc3からサポートするようになっています。(7/5,7/27などにさらにパッチが当たっていますので最新版を使用することをお薦めします。)

mbstring非対応の場合のエラー

  • PukiWiki 1.4.2以降、および 1.3.8(予定)以降では下記のエラーは出力されません。
Fatal error: Call to undefined function: mb_internal_encoding() 
in ..../pukiwiki/init.php on line 17
または
Runtime error
Error message : Multibyte functions cannot be used. Please read 
"mbstring.php" for an additional installation procedure.

Jcodeを使用したmbstring互換関数

注意事項

  • (lib/)mbstring.php は、TOMOさん作のjcode.php を利用して文字コード変換を行います。そのため、mbtring extension の代わりに使う場合は別途 jcode.php をインストールする必要があります。
    • jcode.phpを別途インストールしていない場合、不完全な結果が返ります(マルチバイトではなくシングルバイト文字として扱われた結果が返ります)。
  • EUC-JP専用です。

導入手順*1

  • より、jcode_1.34.zip (http://www.spencernetwork.org/jcode/ )を入手してPukiWikiのルートにディレクトリ付きで展開します。
      -+--- mbstring.php          -r--
       +-+- jcode_1.34/           dr-x
         +--- readme.txt          -r--
         +--- jcode.phps          -r--
         +--- jcode_wrapper.php   -r--
         +--- code_table.ucs2jis  -r--
         +--- code_table.jis2ucs  -r--
  • 後は libディレクトリ下の pukiwiki.php内で自動的に判断して必要なら mbstring.phpを読み込みます。
      .....
      require('auth.php');
      require('proxy.php');
      if (!extension_loaded('mbstring'))
      {
            require('mbstring.php');
       }
    
      /////////////////////////////////////////////////
      // プログラムファイル読み込み
      ......

FAQ

  • そのサーバーで mbstring が使えるかどうかを識別するには (普通の方法)
    • 任意の名前でphpinfo() 関数を含んだ小さなphpファイルを作り、そのファイルにブラウザからアクセスし、mbstringという文字で検索し、状況をチェックし、そのファイルを消します。
  • mbstring が使えるかどうかを識別するには (安直な方法)
    • mbstring.php に直接アクセスし、エラーが表示されないならば、そのサーバーにはmbstringがあれば定義されているはずの関数がありません。
    • ※部品となるファイルにアクセスするのも、させるのもあまりお行儀が良いことではありませんが・・・
  • jcode.php 1.35 (今までは1.34)が同じ出力結果を返すかどうかをRH9にて簡単にテストしました。機能自体に問題はなさそうですが、インストールにあたっては jcode_1.35/jcode_wrapper.php の以下2箇所を修正する必要があります。作者の方は既に認識されています。 -- henoheno
    • require_once dirname(__FILE__).'/jcode.phps'; (phps => sが不要)
    • $jc_from = AutoDetect($str) (行末のセミコロンが無い)

さらに,mbstring.phpにおいて

  • 'jcode_1.34/jcode_wrapper.php'を1.35にしなければならないと思います(line 30,32).
  • jcodeにあわせてdefine('JCODE_DIR','./jcode_1.34');を1.35や1.35aに書き換えます。

参考

その他のmbstring互換関数

mbstringエミュレータという手もあります。 libにいれたら、

if (! extension_loaded('mbstring')) {
	require(LIB_DIR . 'mbstring.php');
}

if (! extension_loaded('mbstring')) {
	require(LIB_DIR . 'mb-emulator.php');
}

に書き換える。


*1 本手順は、mbstring.phpにもコメントされています。

トップ   編集 凍結 差分 バックアップ 添付 複製 名前変更 リロード   新規 一覧 検索 最終更新   ヘルプ   最終更新のRSS
Last-modified: 2010-06-05 (土) 14:18:16
Site admin: PukiWiki Development Team

PukiWiki 1.5.2+ © 2001-2019 PukiWiki Development Team. Powered by PHP 5.6.40-0+deb8u7. HTML convert time: 0.265 sec.

OSDN