Here a small helpful function to convert a php file for multi byte use:
<?php
$filename = 'header.php'; // File name
$search[] = 'mail('; $replace[] = 'mb_send_mail(';
$search[] = 'strlen('; $replace[] = 'mb_strlen(';
$search[] = 'strpos('; $replace[] = 'mb_strpos(';
$search[] = 'strrpos('; $replace[] = 'mb_strrpos(';
$search[] = 'substr('; $replace[] = 'mb_substr(';
$search[] = 'strtolower('; $replace[] = 'mb_strtolower(';
$search[] = 'strtoupper('; $replace[] = 'mb_strtoupper(';
$search[] = 'stripos('; $replace[] = 'mb_stripos(';
$search[] = 'strstr('; $replace[] = 'mb_strstr(';
$search[] = 'stristr('; $replace[] = 'mb_stristr(';
$search[] = 'strrchr('; $replace[] = 'mb_strrchr(';
$search[] = 'substr_count('; $replace[] = 'mb_substr_count(';
$search[] = 'ereg('; $replace[] = 'mb_ereg(';
$search[] = 'eregi('; $replace[] = 'mb_eregi(';
$search[] = 'ereg_replace('; $replace[] = 'mb_ereg_replace(';
$search[] = 'eregi_replace('; $replace[] = 'mb_eregi_replace(';
$search[] = 'split('; $replace[] = 'mb_split(';
$file = file_get_contents($filename);
$file = str_replace($search,$replace,$file);
file_put_contents($filename,$file);
?>
関数のオーバーロード機能
PHP アプリケーションの多くは、英語等のシングルバイトの言語用に設計されており、 日本語を含むマルチバイト文字列を扱う場合には問題を生じる場合があります。 substr() 等の PHP の文字列関数の多くは、 マルチバイト文字列に対応していません。
mbstring では、 対応するマルチバイト文字対応版の関数で既存の PHP 関数を オーバーロードする機能をサポートします。関数のオーバーロードを行うと、例えば substr() を PHP スクリプトでコールした場合に、 mb_substr() が代わりにコールされるようになります。 これにより、マルチバイト文字に対応しないアプリケーションの移植が容易となります。
関数オーバーロードを使用するには、php.ini の mbstring.func_overload ディレクティブに正の値を指定します。 これは、オーバーロードされる関数の種類を指定するビットマスクの組み合わせとなります。 mail() 関数をオーバーロードするには 1 を指定します。 2 は文字列関数、4 は正規表現関数を表します。つまり、例えば 7 を指定すると、メール関数、文字列関数および正規表現関数が オーバーロードされることになります。オーバーロードされる関数の一覧を以下に示します。
| mbstring.func_overload の値 | 元の関数 | オーバーロードする関数 |
|---|---|---|
| 1 | mail() | mb_send_mail() |
| 2 | strlen() | mb_strlen() |
| 2 | strpos() | mb_strpos() |
| 2 | strrpos() | mb_strrpos() |
| 2 | substr() | mb_substr() |
| 2 | strtolower() | mb_strtolower() |
| 2 | strtoupper() | mb_strtoupper() |
| 2 | stripos() | mb_stripos() |
| 2 | strripos() | mb_strripos() |
| 2 | strstr() | mb_strstr() |
| 2 | stristr() | mb_stristr() |
| 2 | strrchr() | mb_strrchr() |
| 2 | substr_count() | mb_substr_count() |
| 4 | ereg() | mb_ereg() |
| 4 | eregi() | mb_eregi() |
| 4 | ereg_replace() | mb_ereg_replace() |
| 4 | eregi_replace() | mb_eregi_replace() |
| 4 | split() | mb_split() |
注意:
ディレクトリ単位の設定でこのオプションを使用することは推奨されません。 これは、実際の運用環境ではまだ安定性が確認されておらず、 予期しない結果をもたらす可能性があるためです。
zeddix at freenet dot de
15-May-2011 10:43
Oliver Baltz
26-Jul-2010 02:25
In case you need to (de)activate the overloading for a specific directory, try setting an appropriate php_admin_value in your httpd.conf, e.g.
<Directory ...>
...
php_admin_value mbstring.func_overload 7
</Directory>
I'm not 100% sure if one can rely on that, but it seems to work for me.
andrew
21-May-2009 02:38
It seems in php 5.2.7 - 5.2.9 under windows mbstring overloading not working in .htaccess files. Apache v.2.2.
Works only in php.ini, this is not convinient in some situations.
