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

どうでもいい記事100選

mbstring関数のencoding指定

mb_substr関数を例にとって説明します。


string mb_substr ( string str, int start [, int length [, string encoding]] )
encodingは文字エンコーディング名です。省略された場合は、内部文字エンコーディングが使用されます。

encodingを指定した場合、指定した内容に従って処理を行います。
現状では、ここに空("")を指定すると怒られてしまいます。
空("")の場合は現在の内部コードに従って処理をして欲しいなぁ。。。
つまり、空("")の場合は指定していないと見なす。という訳でタコさんパッチを敢行だっ!

--- php-4.4.0,orig/ext/mbstring/mbstring.c	2005-07-21 20:31:59.000000000 +0900
+++ php-4.4.0/ext/mbstring/mbstring.c	2005-07-21 20:31:59.000000000 +0900
@@ -2354,11 +2354,15 @@
 			WRONG_PARAM_COUNT;
 		}
 		convert_to_string_ex(arg4);
+		if( Z_STRLEN_PP(arg4) > 0 ){
 		string.no_encoding = mbfl_name2no_encoding(Z_STRVAL_PP(arg4));
 		if (string.no_encoding == mbfl_no_encoding_invalid) {
 			php_error_docref(NULL TSRMLS_CC, E_WARNING, "Unknown encoding \"%s\"", Z_STRVAL_PP(arg4));
 			RETURN_FALSE;
 		}
+		} else{
+			php_error_docref(NULL TSRMLS_CC, E_NOTICE, "Empty encoding");
+		}
 		break;
 	default:
 		WRONG_PARAM_COUNT;

このタコさんパッチを適用する事で、以下の処理でも(とりあえず)動作する事を確認。

<?php
declare( encoding="EUC-JP" );
error_reporting( E_ALL );
var_dump( mb_substr( "あいうえお", 1, "2", "" ) );
var_dump( mb_substr( "あいうえお", 1, "2", "a" ) );
var_dump( mb_substr( "あいうえお", 1, "2", "EUC-JP" ) );
var_dump( mb_substr( "あいうえお", 1, "2" ) );
?>

結果
----
Notice: mb_substr(): Empty encoding in /home/masugata/mb2.php on line 5
string(4) "いう"
Warning: mb_substr(): Unknown encoding "a" in /home/masugata/mb2.php on line 6
bool(false)
string(4) "いう"
string(4) "いう"

この話はencoding指定を行える関数全般に言える事です。
空("")を明示的に指定する事自体が間違っているのは理解しているんですが。。。
「E_NOTICE」出してるんで許してぇ。許してくれるんだったら順次適用していきたいトコロ。