プロが教えるわが家の防犯対策術!

PHPの mb_detect_encoding 関数を使っているのですが、
文字エンコーディングの検出が間違っていないかを検証する為に、
以下のように、検出された文字コードに戻し、元の文字列と一致するかで、
検出された文字エンコーディングが正しかったか確認しています。

$str = file_get_contents ( $url );

$moji_code = mb_detect_encoding ( $str , "ASCII,JIS,UTF-8,eucJP-win,SJIS-win" );

$str_after = mb_convert_encoding ( $str , 'UTF-8' , $moji_code );

if ( $str !== mb_convert_encoding ( $str_after , $moji_code , 'UTF-8' ) ) {
    //文字化けしている可能性あり
}

これで、完璧でしょうか?

A 回答 (3件)

>他に何か良い方法はありませんでしょうか?



#1で書いたとおり、文字コードを「完璧」に自動判別することは100%不可能です。
ある程度でよければご提示の方法で使用に耐えうる範囲だと思います。
    • good
    • 0

文字コードの変換は、逆変換すると元に戻ることが多いです。



コードA (エンコードa)
 ↓エンコードa→UTF-8変換
コード B(UTF-8)
 ↓UTF-8→エンコードa変換
コードA (エンコードa)

ところが、これは、エンコードが違っていてもだいたい成り立ちます。

コードA (エンコードaだけどエンコードbと判定された)
 ↓エンコードb→UTF-8変換
コード C (UTF-8)
 ↓UTF-8→エンコードb変換
コードA (エンコードa)

と、判定に失敗しても前後が同じになるケースが無いわけでもありません。

また、対応する文字が無かったり、1対多対応で変換/逆変換で文字が変わったりがあるので、正しく判定されても違う文字になることもあります。

この回答への補足

ご回答ありがとうございます。

他に何か良い方法はありませんでしょうか?

補足日時:2011/07/26 21:34
    • good
    • 0

>完璧でしょうか?



mb_detect_encoding()自体の信頼性の問題なのでどこまで行っても
完璧はありえません。
ある程度確率は高いですがしょせん「たぶんこうじゃね?」という
あてずっぽでしかないということです。
文字コードの判定については昔から、「美乳処理」などいろいろ
工夫されてきていますが、テキストファイルはどこまでいっても
テキストファイルなので決め手に掛けます。
かといってBOMで処理するのはHTTPのヘッダ処理の兼ね合いから
敬遠される場合が多いようです。

この回答への補足

ご回答ありがとうございます。

他に何か良い方法はありませんでしょうか?

補足日時:2011/07/26 21:34
    • good
    • 0

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!