【PHP】OGP出力 文字化け解消[対症療法]

OGPとは

Open Graph protocolの略。
SNSでURLがシェアされた際に、そのページのタイトル・URL・概要・アイキャッチ画像(サムネイル)を意図した通りに正しく表示させる仕組みのこと

やりたかったこと

自サイトの掲示板にURLが書き込まれたとき、リンク先のウェブサイトがOGPを設定をしていれば、その情報を出力する。
f:id:kjtec:20170719224329j:plain

トラブル

文字コードが正常に表示されるはずのUTF-8であるにも関わらず、一部のウェブサイトのサイト名や概要が文字化けした。
f:id:kjtec:20170719224210j:plain

原因

文字化けしてしまうウェブサイトのサイト名や概要は、utf8_encodeされたUTF-8だった。

解決方法

文字化けするテキスト(サイト名や概要)を、utf8_decodeでデコードすると正常に表示されるようになった。
もともと文字化けしていなかったテキストをutf8_decodeすると今度はそちらが文字化けしてしまうので、
utf8_decodeした結果UTF-8になるものだけをテキストとして採用する。

<?php
include_once 'OpenGraph.php';

$graph = OpenGraph::fetch($url);
$title = $graph->title$title_check = utf8_decode($title);
if(mb_detect_encoding($title_check) == 'UTF-8'){
    $title = $title_check; // 文字化け解消
}

$detects = array(
 'ASCII','EUC-JP','SJIS', 'JIS',
  'CP51932','UTF-16', 'ISO-8859-1'
);

// 上記以外でもUTF-8以外の文字コードが渡ってきてた場合、UTF-8に変換する
if(mb_detect_encoding($title) != 'UTF-8'){
    $title = mb_convert_encoding($title, 'UTF-8', mb_detect_encoding($title, $detects, true));
}