(PHP4の)--enable-zend-multibyteの落とし穴
ヤラレタ。。。_| ̄|○
php.ini: -------------------------------------------------------- mbstring.internal_encoding = EUC-JP; mbstring.script_encoding = SJIS -------------------------------------------------------- mb.php: -------------------------------------------------------- <?php declare( encoding="EUC-JP" ); // 実はSJISでコーディング mb_internal_encoding( "SJIS" ); var_dump( "あ" ); include( "mb_inc.php" ); // 化けない mb_internal_encoding( "SJIS-win" ); include( "mb_inc.php" ); // 化ける ?> -------------------------------------------------------- mb_inc.php: -------------------------------------------------------- <?php declare( encoding="EUC-JP" ); var_dump( "い" ); // こっちは本当にEUC-JPでコーディング ?> -------------------------------------------------------- 結果 ---- string(2) "あ" string(2) "い" string(2) "、、" <= ここは「string(2) "い"」になって欲しい 出力はSJISなのでコンソールの文字コードに注意。
確か、mbregex関数にも昔あったなぁ。。。って、この頃から変わってないよ。駄目ジャン。
この件、PHP5は既に対応済みなのでPHP4に(バックポート)タコさんパッチしてみました。
後で神様にお願いする為に、お賽銭入れに行こっと。(-人-)
JISエンコーディングはEUC-JP(?)へ勝手に変換されてるっぽいぞ。。。!?
一体、何処で?教えて偉い人!(>_<)
--- php-4.4.0,orig/Zend/zend_multibyte.c 2005-08-02 11:27:46.000000000 +0900 +++ php-4.4.0/Zend/zend_multibyte.c 2005-08-02 11:27:46.000000000 +0900 @@ -53,6 +53,25 @@ 0 }; +const char *eucjp_win_aliases[] = {"eucJP-open", NULL}; +zend_encoding encoding_eucjp_win = { + NULL, + NULL, + "eucJP-win", + (const char *(*)[])&eucjp_win_aliases, + 1 +}; + +const char *sjis_win_aliases[] = {"SJIS-open", "MS_Kanji", "Windows-31J", "CP932", NULL}; +zend_encoding encoding_sjis_win = { + /* sjis-filters does not care about diffs of Shift_JIS and CP932 */ + sjis_input_filter, + sjis_output_filter, + "SJIS-win", + (const char *(*)[])&sjis_win_aliases, + 0 +}; + const char *ascii_aliases[] = {"us-ascii", NULL}; zend_encoding encoding_ascii = { NULL, @@ -67,6 +86,8 @@ &encoding_ascii, &encoding_euc_jp, &encoding_sjis, + &encoding_eucjp_win, + &encoding_sjis_win, NULL };