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

どうでもいい記事100選

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"