phpの文字コンバート処理について質問です

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となってしまいます。
いったい何が問題なのでしょうか?

回答の条件
  • URL必須
  • 1人50回まで
  • 登録:
  • 終了:2012/03/31 09:09:33

ベストアンサー

id:JULY No.1

回答回数966ベストアンサー獲得回数247

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
)

となりました。

id:k-motoyan123

ありがとうございます!
$encType2 = mb_detect_encoding($key,"auto");
とすることで上手く出力されるようになりました

自分で結果に該当しそうな値を設定しないといけないなんて、
あまり使い勝手がよくない関数なんですね

2012/03/31 09:09:26
id:JULY

> 自分で結果に該当しそうな値を設定しないといけないなんて、
> あまり使い勝手がよくない関数なんですね

というよりは、"auto" を指定しないと、php.ini で指定したか、もしくは、mb_detect_order() で設定した対象文字コードに限定して、その中から推定する、というのが、ちょっと「落とし穴」のような感じです。

特に指定しないと、扱えるすべてのコードから、のように思ってしまうけど、実は違う。なので、一番簡単なのは "auto" を指定する方法でしょう。

まぁ、文字コードの推定って、あくまでも「推定」なので、想定する文字コードをあらかじめ絞っておいた方が、処理的に有利に働くとは思います。

2012/03/31 11:23:50

コメントはまだありません

この質問への反応(ブックマークコメント)

「あの人に答えてほしい」「この質問はあの人が答えられそう」というときに、回答リクエストを送ってみてましょう。

これ以上回答リクエストを送信することはできません。制限について

回答リクエストを送信したユーザーはいません