StringUtil::detectEncodingの実装について

EUCで文字化け? - gounx2の日記 http://d.hatena.ne.jp/gounx2/20080621/1214059256

これの続きです。

個人的には mb_detect_encoding は文字列が短いと当てにならないので、普段使わないんですよね。
本来、fromエンコードが何なのかは作り手が意識すべきものだから、明示的に自分で変換すればよいと思ってます。

StringUtil の今の実装

function detectEncoding($value){
	/*** unit("lang.StringUtilTest"); */
	if(is_array($value) || is_object($value)) return null;
	return (extension_loaded("mbstring")) ? mb_detect_encoding($value) : StringUtil::UTF8();
}

私が気持ちが悪いと思ってるのは、mbstring拡張があれば、mb_detect_encoding が毎回実行されてしまう点です。
確か、mb_string系関数の fromエンコーディングのデフォルトは、internal_encoding なので、これを使ってもいいのかもしれない。

と思ったのだが・・・
rhacoでmb_internal_encodingをgrepしたけど見つからない。
多分各mb関数で明示的に指定するポリシーと解釈。

案としては・・・

こんな感じにしておいて。

StringUtil::detectEncoding($val)
{
    $from = self::getFromEncoding();
    return ($from === "detect" ? mb_detect_encoding($value) : $from);
}
StringUtil::setFromEncoding("UTF-8");

とか、

StringUtil::setFromEncoding("detect");

で切替ができるようにするとかでしょうか。

あと、Rhaco::constantでとか思いましたが、切替られないしなぁ。。

    • -

追記・・・

rev3185で対応してもらいました。いつもありがとうございます。
http://rhaco.svn.sourceforge.net/viewvc/rhaco/trunk/lang/StringUtil.php?r1=3185&r2=3184&pathrev=3185

ということで、
・短い文字を処理したときにだけ文字化けするよ(><
・俺はUTF-8で統一してるんだ。mb_detect_encodingなんかに頼らないぞ。EUCRSSとかは自分でmb_convert_encodingするもね。
という人は、StringUtil::setFromEncoding("UTF-8"); とすればたぶん幸せになれます。

あと、エンコードは難しいねぇ。っていう話をしました。
http://www.lingr.com/room/rhaco-ja/archives/2008/06/22#msg-40493966