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なんかに頼らないぞ。EUCなRSSとかは自分でmb_convert_encodingするもね。
という人は、StringUtil::setFromEncoding("UTF-8"); とすればたぶん幸せになれます。
あと、エンコードは難しいねぇ。っていう話をしました。
http://www.lingr.com/room/rhaco-ja/archives/2008/06/22#msg-40493966