mb_convert_encoding関数を利用して文字コードをSHIFT-JISからUTF-8に変換したいのですが、
なぜか文字コードが変換されません…
コードは以下のようになっています
$encType1 = mb_detect_encoding($key, "SJIS, SJIS-win");
$key = mb_convert_encoding($key, "UTF-8", $encType1);
$encType2 = mb_detect_encoding($key);
結果は変換前、後でどちらもSJISとなってしまいます。
いったい何が問題なのでしょうか?
2つ目の「mb_convert_encoding」を下記のように書き換えて下さい。
$encType2 = mb_detect_encoding($key, "auto");
"auto" を省略すると、mb_detect_order() で取得されるリストから、該当する文字コードが何かを検証します。
PHP: mb_detect_encoding - Manual
PHP: mb_detect_order - Manual
で、mb_detect_order() で得られるリストに UTF-8 が含まれていないと、同様の結果になりました。
php.ini で
mbstring.detect_order = SJIS,ASCII
として、下記のコードを実行してみます。
<?php $key = "あいうえお"; $encType1 = mb_detect_encoding($key, "SJIS, SJIS-win"); $key = mb_convert_encoding($key, "UTF-8", $encType1); $encType2 = mb_detect_encoding($key, "auto"); echo "$encType2\n"; echo "$key\n"; print_r(mb_detect_order()); echo "\n"; ?>
このファイルの文字コードを Shift_JIS として保存して実行すると、
UTF-8 あいうえお Array ( [0] => SJIS [1] => ASCII )
となります。この状態で "auto" を外して、
<?php $key = "あいうえお"; $encType1 = mb_detect_encoding($key, "SJIS, SJIS-win"); $key = mb_convert_encoding($key, "UTF-8", $encType1); $encType2 = mb_detect_encoding($key); echo "$encType2\n"; echo "$key\n"; print_r(mb_detect_order()); echo "\n"; ?>
として実行すると、
SJIS あいうえお Array ( [0] => SJIS [1] => ASCII )
となりました。
ありがとうございます!
2012/03/31 09:09:26$encType2 = mb_detect_encoding($key,"auto");
とすることで上手く出力されるようになりました
自分で結果に該当しそうな値を設定しないといけないなんて、
あまり使い勝手がよくない関数なんですね
> 自分で結果に該当しそうな値を設定しないといけないなんて、
2012/03/31 11:23:50> あまり使い勝手がよくない関数なんですね
というよりは、"auto" を指定しないと、php.ini で指定したか、もしくは、mb_detect_order() で設定した対象文字コードに限定して、その中から推定する、というのが、ちょっと「落とし穴」のような感じです。
特に指定しないと、扱えるすべてのコードから、のように思ってしまうけど、実は違う。なので、一番簡単なのは "auto" を指定する方法でしょう。
まぁ、文字コードの推定って、あくまでも「推定」なので、想定する文字コードをあらかじめ絞っておいた方が、処理的に有利に働くとは思います。