プログラミング言語や環境設定を中心としたパソコン関連の技術メモです。
主にシステム開発中に調べたことをメモしています。TIPS的な位置付けで、気が向いたときにちまちま更新していきます。
PHP、文字のエンコードが違うファイルをインクルードする方法
メインのPHPがUTF-8でインクルードしたいファイルがshift-jisの場合とかですね。
そのままインクルードすると文字化けしちゃいます。

例えばこんなケースですφ(--)

■inc.php(Shift-JIS)
<?php
    //テスト
    function hogeMehod(){
        return "あああ";
    }
?>

■main.php(UTF-8)
<?php
    //インクルード
    include(dirname(__FILE__) . "/inc.php");

    $str = hogeMehod();
?>

<!DOCTYPE html>
<html lang="ja">
<head>
    <meta charset="utf-8">
</head>
<body>
<?php print $str; ?>
</body>

hogeMethod()の戻り値はShift-JISなのでUTF-8だと文字化けします。

個人的には

どんなに面倒くさくてもエンコードを合わせろ

と思うのですが、諸般の事情で無理なときもあるでしょう。

そんなときの逃げ道(--)b

取りあえずパッと思いつくのは

1.eval()を使う方法
2.エンコードを合わせたインクルード用のファイルを自動生成する方法

の2つですかね(--ゞ

どちらもそれなりにデンジャラスなので
苦肉の策だとご理解ください。

ほんでは「1.eval()を使う方法」はこちらφ(--)

■main.php(UTF-8)
<?php
//    includedirname(__FILE__) . "/inc.php");

    //インクルードファイル読込
    $incFile = file_get_contents(dirname(__FILE__) . '/inc.php');

    /*「<?php」と「?>」を消去(evalで補完されるから)*/
    $incFile = str_replace("?>","",$incFile);
    $incFile = str_replace("<?php","",$incFile);

    //文字コード変換して擬似include
    eval(mb_convert_encoding($incFile, 'UTF-8', 'SJIS-win'));

    $str = hogeMehod();
?>

<!DOCTYPE html>
<html lang="ja">
<head>
    <meta charset="utf-8">
</head>
<body>
<?php print $str; ?>
</body>

要はファイルを読み込んでエンコード変換してeval()でコードをそのまま埋め込む。

eval()さんは「<?php」と「?>」を自前で付与してくれるので
「inc.php」に元々記述されていた「<?php」と「?>」を潰しています。

「$str = hogeMehod();」が実行されるまでに
「hogeMehod()」が用意できればいーんでしょ?な
インタプリタ方式ならではの方法ですね(--;

「2.エンコードを合わせた(以下略)」はこちらφ(--)

■main.php(UTF-8)
<?php

    //テスト
//    include("./inc.php");

    //インクルードファイル読込&UTF-8にして保存
    if(!file_exists(dirname(__FILE__) . "/inc_utf8.php")){
        //Shift-JISのファイルを読み込み
        $incFile = file_get_contents(dirname(__FILE__) .'/inc.php');

        //UTF-8へ変換
        $incFile = mb_convert_encoding($incFile, 'UTF-8', 'SJIS-win');

        //UTF-8のインクルードファイル保存
        file_put_contents(dirname(__FILE__) . "/inc_utf8.php", $incFile);
    }

    //UTF-8のインクルードファイルをインクルード
    include(dirname(__FILE__) . "/inc_utf8.php");

    $str = hogeMehod();
?>

<!DOCTYPE html>
<html lang="ja">
<head>
    <meta charset="utf-8">
</head>
<body>
<?php print $str; ?>
</body>

個人的にはこっちの方がなんぼか好き。
初回起動時にエンコードを合わせたインクルード用のファイルを作っておく形。
2回目からは普通にインクルードするのと同じです。
「inc.php」に手を加えたときは「inc_utf8.php」を一回消さないといけないのが
面倒と言えば面倒ですかね。

まぁ

こんな処理埋めるくらいなら手でコンバートしても同じじゃね?

と思わなくもないですが、
既存のシステムはShift-JISで新規のシステムはUTF-8で
一部のロジックを既存のシステムと共用しないといけないケースなんかは
仕方ないのですかね。

あくまでその場しのぎなのでご注意を(--)b
長い目で見ればやらない方が良いと思いますよ、こんな変なこと。
スポンサーリンク
 
このエントリーをはてなブックマークに追加 

category:● PHP  thema:システム開発 - genre:コンピュータ  Posted by ササキマコト 

  関連記事