[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 メーリングリストの案内