[PHP-users 18173]mb_regex_encodingの挙動に関して

Seiji Masugata s.masugata @ digicom.dnp.co.jp
2003年 10月 1日 (水) 21:10:36 JST


こんにちわ、桝形です。

RedHat6.2J/Apache1.3.28/PHP4.3.3の環境で、mb_regex_encodingの指定を
下記のサンプルスクリプトの様に指定をすると、

reg.php
---------------------------------------------------------------------
<?
mb_internal_encoding( "SJIS" );
echo mb_internal_encoding( )."<BR>\n";
mb_internal_encoding( "SJIS-win" );
echo mb_internal_encoding( )."<BR>\n";
mb_internal_encoding( "EUC-JP" );
echo mb_internal_encoding( )."<BR>\n";
mb_internal_encoding( "eucJP-win" );
echo mb_internal_encoding( )."<BR>\n";

mb_regex_encoding( "SJIS" );
echo mb_regex_encoding( )."<BR>\n";
mb_regex_encoding( "SJIS-win" );
echo mb_regex_encoding( )."<BR>\n";
mb_regex_encoding( "EUC-JP" );
echo mb_regex_encoding( )."<BR>\n";
mb_regex_encoding( "eucJP-win" );
echo mb_regex_encoding( )."<BR>\n";
?>
---------------------------------------------------------------------

結果:
---------------------------------------------------------------------
SJIS
SJIS-win
EUC-JP
eucJP-win
SJIS

Warning: mb_regex_encoding(): Unknown encoding "SJIS-win" in /XXX/XXX/XXX/reg.php on line 16
SJIS
EUC-JP

Warning: mb_regex_encoding(): Unknown encoding "eucJP-win" in /XXX/XXX/XXX/reg.php on line 20
EUC-JP
---------------------------------------------------------------------

という挙動をします。

元々、mb_regex_encodingは「-win」付きの指定ができなかったのは
理解していて、更にphp.iniに、

mbstring.internal_encoding = SJIS-win(多分eucJP-winも)

等と、やってると、mb_regex_encodingはデフォルトのEUC-JPのままで
この辺の挙動がよく分っていないと陥ります。

ただ、internal_encodingにSJIS-winが指定できる以上、mb_regex_encoding
も対応して欲しいなぁ。。。なんて、また、最近思いはじめた今日この頃です。

色々な考えがあると思いますが、皆さんはこの挙動をどう思われますか?

http://jp.php.net/manual/ja/function.mb-regex-encoding.php

には「デフォルトは、内部文字エンコーディングです。」とあり、この
「内部文字エンコーディング」が、どこを指しているのかが難しいの
ですが。。。

ソースをざっと見ると、

/(ソース展開ディレクトリ)/php-4.3.4RC1/ext/mbstring/php_mbregex.c

----------------------------------------------------------------------
static int _php_mb_regex_name2mbctype(const char *pname)
{
	int mbctype;

	mbctype = -1;
	if (pname != NULL) {
		if (strcasecmp("EUC-JP", pname) == 0
		    || strcasecmp("X-EUC-JP", pname) == 0
		    || strcasecmp("UJIS", pname) == 0
		    || strcasecmp("EUCJP", pname) == 0
		    || strcasecmp("EUC_JP", pname) == 0) {
			mbctype = MBCTYPE_EUC;
		} else if (strcasecmp("UTF-8", pname) == 0
		           || strcasecmp("UTF8", pname) == 0) {
			mbctype = MBCTYPE_UTF8;
		} else if (strcasecmp("SJIS", pname) == 0
		           || strcasecmp("CP932", pname) == 0
		           || strcasecmp("MS932", pname) == 0
		           || strcasecmp("SHIFT_JIS", pname) == 0 ) {
			mbctype = MBCTYPE_SJIS;
		} else if (strcasecmp("ASCII", pname) == 0) {
			mbctype = MBCTYPE_ASCII;
			mbctype = MBCTYPE_EUC;
		}
	}

	return mbctype;
}
----------------------------------------------------------------------

と、なっていたので、スクリプト中に変更する方は簡単に対応できそうな
予感です。

一番最後にパッチをつけておきましたので、異論が無ければコミットして
頂ければ幸いです。

とりあえず、こちらの環境で試した限りでは、SEGV等は起きてはいない
ようです。

あ、コメントの部分は冗談です。。。(^^;

ただ、php.iniで、

mbstring.internal_encoding = SJIS-win(eucJP-winも)

と指定した場合の対応がまだできていません。。。UTF-8を指定すると
変更されているので、多分どこかでやっているのだと思うのですが。。。

/* {{{ static PHP_INI_MH(OnUpdate_mbstring_internal_encoding) */
static PHP_INI_MH(OnUpdate_mbstring_internal_encoding)

内の、

#if HAVE_MBREGEX

#endif

の処理の中かな?とか思いつつも確証がありません。

あぁ、情けない。。。識者の補足をお願いします。


--- php-4.3.4RC1.orig/ext/mbstring/php_mbregex.c	Sat Sep 27 02:47:10 2003
+++ php-4.3.4RC1/ext/mbstring/php_mbregex.c	Wed Oct  1 19:52:26 2003
@@ -16,7 +16,7 @@
    +----------------------------------------------------------------------+
  */
 
-/* $Id: php_mbregex.c,v 1.18.2.10 2003/09/26 17:47:10 moriyoshi Exp $ */
+/* $Id: php_mbregex.c,v 1.18.2.11 2003/10/01 21:00:00 masugata Exp $ */
 
 
 #ifdef HAVE_CONFIG_H
@@ -94,7 +94,8 @@
 		    || strcasecmp("X-EUC-JP", pname) == 0
 		    || strcasecmp("UJIS", pname) == 0
 		    || strcasecmp("EUCJP", pname) == 0
-		    || strcasecmp("EUC_JP", pname) == 0) {
+		    || strcasecmp("EUC_JP", pname) == 0
+		    || strcasecmp("EUCJP-WIN", pname) == 0) {
 			mbctype = MBCTYPE_EUC;
 		} else if (strcasecmp("UTF-8", pname) == 0
 		           || strcasecmp("UTF8", pname) == 0) {
@@ -102,7 +103,8 @@
 		} else if (strcasecmp("SJIS", pname) == 0
 		           || strcasecmp("CP932", pname) == 0
 		           || strcasecmp("MS932", pname) == 0
-		           || strcasecmp("SHIFT_JIS", pname) == 0 ) {
+		           || strcasecmp("SHIFT_JIS", pname) == 0
+		           || strcasecmp("SJIS-WIN", pname) == 0 ) {
 			mbctype = MBCTYPE_SJIS;
 		} else if (strcasecmp("ASCII", pname) == 0) {
 			mbctype = MBCTYPE_ASCII;

--
Seiji Masugata<s.masugata @ digicom.dnp.co.jp>




PHP-users メーリングリストの案内