【これだけ】PHPでの文字エンコードの変換方法【現役エンジニアが解説】

PROGRAM

今回は、PHPでの文字エンコードの変換方法について、文字エンコードの検出方法と変換方法に分け、簡単に解説していきます。

文字エンコードを検出する方法

文字エンコードを変換する前に、対象の文字列の現在の文字エンコードを検出したい場合は多々あると思います。

$val = "ほげ"; // 検出対象の文字列
$encode = mb_detect_encoding($val); // 文字エンコードの取得

そのような場合には、上記のように、PHPで標準で用意されているmb_detect_encoding関数を使うことで、文字列の文字エンコードを取得することができます。

ただし、この関数はあまり当てにならないケースも多く、UTF-8にもかかわらずSJISとして検出される等の問題があるため、この関数を100%信頼することは避けた方が良いです。

指定した文字エンコードに変換する方法

PHPには文字エンコードを変換する関数も標準で用意されています。

$val = "ほげ"; // 変換対象の文字列
$val = mb_convert_encoding($val, "sjis-win", "utf-8"); // 指定した文字エンコードに変換

上記のように、mb_convert_encodingという関数を使うことで、指定した文字エンコードから異なるエンコードに変換することができます。

mb_convert_encodingでは、第一引数に変換対象の文字列、第二引数に変換後の文字エンコード、第三引数に変換前の文字エンコードを指定しますが、第三引数の文字エンコードはできれば”auto”ではなく、きちんと特定した方が失敗する確率が減ります。

より正しく文字エンコードを検出する方法

文字エンコードを変換するうえでは、対象の文字列の元々の文字エンコードを正しく取得することが重要です。

PHPで標準で用意されているmb_detect_encoding関数では正しく判定できないこともあるため、以下のようにバイトの誤差も考慮してチェックすると精度が上がるでしょう。

function getEncoding($str) {
    $encoding = "";
    for ($i=0;$i<4;$i++) {
        $contents = substr($str,0,(1024+$i));
        $encodings = array('UTF-8', 'EUC-JP', 'sjis-win');
        foreach ($encodings as $encodingsVal){
            if ($contents == mb_convert_encoding($contents, $encodingsVal, $encodingsVal)){
                $encoding = $encodingsVal;
                break;
            }
        }
        if (mb_strlen($encoding,"UTF-8") > 0) {break;}
    }
    return $encoding;
}

バイトの誤差の他、文字列の最初の方に出現する文字が英数字であると早々にASCIIと判定されてしまうため、上記のように、日本語が出現するところまで含まれるように多少大目に文字列を取って判定すると良いでしょう。