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

どうでもいい記事100選

mbstring関数の"auto"指定

haltさんが"auto"がぬるいと仰っているようだ。


"auto"が指定された場合、この文字列は、"ASCII,JIS,UTF-8,EUC-JP,SJIS"に変換されます。

そうだなぁ。。。この並び順は(ちょっと)実用的ではナイのかも。
個人的には順番は全く逆(SJIS,EUC-JP,UTF-8,JIS,ASCII)を希望。
という訳で(早速)タコさんパッチを敢行っ!この並び順はあくまでも趣味ですので。
並び順を変える事による影響度は未知数。。。だったらやるなよな。

--- php-4.4.0,orig/ext/mbstring/mbstring.c	2005-07-14 13:36:09.000000000 +0900
+++ php-4.4.0/ext/mbstring/mbstring.c	2005-07-14 13:36:09.000000000 +0900
@@ -105,11 +105,11 @@
 } php_mb_nls_ident_list;
 
 static const enum mbfl_no_encoding php_mb_default_identify_list_ja[] = {
-	mbfl_no_encoding_ascii,
-	mbfl_no_encoding_jis,
-	mbfl_no_encoding_utf8,
+	mbfl_no_encoding_sjis,
 	mbfl_no_encoding_euc_jp,
-	mbfl_no_encoding_sjis
+	mbfl_no_encoding_utf8,
+	mbfl_no_encoding_jis,
+	mbfl_no_encoding_ascii
 };
 
 static const enum mbfl_no_encoding php_mb_default_identify_list_cn[] = {

このタコさんパッチを適用する事で、以下の様な短い文字でも(とりあえず)消えない事を確認。

<?php
declare( encoding="EUC-JP" );
$String = mb_convert_encoding( "城", "SJIS", "EUC-JP" );
var_dump( mb_convert_encoding( $String, "EUC-JP", "auto" ) );
?>

結果
----
string(2) "城"

ただ、"auto"を指定するのは勧めません。自動検出は(完全に検出する事は)不可能です。
また、"auto"の検出順の定義はPHPのコンパイル時に決定されるので後から変更したいと思ってもできません。
(自分ナリの検出順を定義した上で)mb_detect_order関数を使う方が得策です。検出順の定義変更も簡単に行えます。