ます’s Blog - どうでもいい記事100選

どうでもいい記事100選

(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
 };