mbstring関数内のエンコーディング名
色んな名前があるのですが実体は一つだけです。他は全てエイリアスになっています。
コレが自分の頭を悩ませています。実体の名前を返してくれる関数って見当たらないんだよね。。。
サポートしているエンコーディング一覧を返してくれる関数はありますが、ちょっと要求とは違うんだよなぁ。
という訳で、この機能を実現すべくタコさんパッチを敢行だっ。
っていうか、ミンナが実体を定義してくれれば解決なんだけどさ。。。
段々、CVSアカウントが欲しくなってきたな。コンナ僕デモ受ケ入レ可能デスカ?駄目デスカ?ソウデスカ。
--- php-4.4.0,orig/ext/mbstring/mbstring.h 2005-08-01 11:30:02.000000000 +0900 +++ php-4.4.0/ext/mbstring/mbstring.h 2005-08-01 11:30:02.000000000 +0900 @@ -92,6 +92,7 @@ /* php function registration */ PHP_FUNCTION(mb_language); PHP_FUNCTION(mb_internal_encoding); +PHP_FUNCTION(mb_get_encoding_name); PHP_FUNCTION(mb_http_input); PHP_FUNCTION(mb_http_output); PHP_FUNCTION(mb_detect_order); --- php-4.4.0,orig/ext/mbstring/mbstring.c 2005-08-01 11:30:02.000000000 +0900 +++ php-4.4.0/ext/mbstring/mbstring.c 2005-08-01 11:30:02.000000000 +0900 @@ -227,6 +227,7 @@ PHP_FE(mb_strtolower, NULL) PHP_FE(mb_language, NULL) PHP_FE(mb_internal_encoding, NULL) + PHP_FE(mb_get_encoding_name, NULL) PHP_FE(mb_http_input, NULL) PHP_FE(mb_http_output, NULL) PHP_FE(mb_detect_order, NULL) @@ -1212,6 +1213,39 @@ } /* }}} */ +/* {{{ proto string mb_get_encoding_name([string encoding]) + Gets encoding name as a string */ +PHP_FUNCTION(mb_get_encoding_name) +{ + pval **arg1; + char *name; + enum mbfl_no_encoding no_encoding; + + if (ZEND_NUM_ARGS() == 1 && zend_get_parameters_ex(1, &arg1) != FAILURE) { + convert_to_string_ex(arg1); + if( Z_STRLEN_PP(arg1) > 0 ){ + no_encoding = mbfl_name2no_encoding(Z_STRVAL_PP(arg1)); + if (no_encoding == mbfl_no_encoding_invalid) { + php_error_docref(NULL TSRMLS_CC, E_WARNING, "Unknown encoding \"%s\"", Z_STRVAL_PP(arg1)); + RETURN_FALSE; + } else { + name = (char *)mbfl_no_encoding2name(no_encoding); + if (name != NULL) { + RETURN_STRING(name, 1); + } else { + RETURN_FALSE; + } + } + } else{ + php_error_docref(NULL TSRMLS_CC, E_WARNING, "Empty encoding"); + RETURN_FALSE; + } + } else { + WRONG_PARAM_COUNT; + } +} +/* }}} */ + /* {{{ proto mixed mb_http_input([string type]) Returns the input encoding */ PHP_FUNCTION(mb_http_input)
このタコさんパッチを適用する事で悩みも解消だっ。全部フィルタリングしてしまおう。
<?php var_dump( mb_get_encoding_name( ) ); var_dump( mb_get_encoding_name( "" ) ); var_dump( mb_get_encoding_name( "hoge" ) ); var_dump( mb_get_encoding_name( "EUC" ) ); var_dump( mb_get_encoding_name( "EUC_JP" ) ); var_dump( mb_get_encoding_name( "x-euc-jp" ) ); var_dump( mb_get_encoding_name( "eucJP" ) ); var_dump( mb_get_encoding_name( "EUC-JP" ) ); var_dump( mb_get_encoding_name( "eucJP-open" ) ); var_dump( mb_get_encoding_name( "eucJP-win" ) ); var_dump( mb_get_encoding_name( "SHIFT_JIS" ) ); var_dump( mb_get_encoding_name( "SHIFT-JIS" ) ); var_dump( mb_get_encoding_name( "x-sjis" ) ); var_dump( mb_get_encoding_name( "SJIS" ) ); var_dump( mb_get_encoding_name( "SJIS-open" ) ); var_dump( mb_get_encoding_name( "CP932" ) ); var_dump( mb_get_encoding_name( "Windows-31J" ) ); var_dump( mb_get_encoding_name( "MS_Kanji" ) ); var_dump( mb_get_encoding_name( "SJIS-win" ) ); ?> 結果 --- Warning: Wrong parameter count for mb_get_encoding_name() in /home/masugata/mb.php on line 2 NULL Warning: mb_get_encoding_name(): Empty encoding in /home/masugata/mb.php on line 3 bool(false) Warning: mb_get_encoding_name(): Unknown encoding "hoge" in /home/masugata/mb.php on line 4 bool(false) string(6) "EUC-JP" <= "EUC" string(6) "EUC-JP" <= "EUC_JP" string(6) "EUC-JP" <= "x-euc-jp" string(6) "EUC-JP" <= "eucJP" string(6) "EUC-JP" <= "EUC-JP" string(9) "eucJP-win" <= "eucJP-open" string(9) "eucJP-win" <= "eucJP-win" string(4) "SJIS" <= "SHIFT_JIS" string(4) "SJIS" <= "SHIFT-JIS" string(4) "SJIS" <= "x-sjis" string(4) "SJIS" <= "SJIS" string(8) "SJIS-win" <= "SJIS-open" string(8) "SJIS-win" <= "CP932" string(8) "SJIS-win" <= "Windows-31J" string(8) "SJIS-win" <= "MS_Kanji" string(8) "SJIS-win" <= "SJIS-win"