[WordPress]取得したサイトの文字コードをUTF-8にしてみる

PHP
この記事は約6分で読めます。

自前でタイトルと抜粋文を取得する「Pz-LinkCard」。

タイトルと抜粋文を取得したあとDBに格納して、DBから取得→表示を行いますが、元々の文字コードがUTF-8以外だったりすると「バケバケ」になってしまいます。

Shift_JIS のサイトを取得してみる

リンク先のサイトから、タイトルや抜粋文を取得して、DBへ保存。

そこからリンクカードの内容を表示しようと思っています。

「はて?Σ(゚ロ゚)o゙」

001_sjis_to_utf8_failed

めっちゃ文字化けしております。

ちなみにこちら、NTT-Xストアのページです。

まるでcharsetが指定されていない、Shift_JISとかEUC-JPのサイトを見に行ったみたいになっています。

よくよく考えてみると、相手サイトの内容は取得しっぱなしでした(^-^;

$html = curl_exec($ch);

ブラウザはCharsetを見たりして、うまいこと文字エンコードして表示してくれています。

テキストを取得するためには、適切な文字コード変換を行う必要があります。

とりあえず “auto” を指定

取得できた HTML に、ともあれ mb_convert_encoding() をしてみます。

$html = curl_exec($ch);
$html = mb_convert_encoding($html, 'UTF-8', 'auto');

003_auto_to_utf-8

「はい、ドーン!Σ(゚ロ゚)o゙」

はい、変わりませんでした。

 

では、変換元コードを「SJIS」にしてみます。

$html = curl_exec($ch);
$html = mb_convert_encoding($html, 'UTF-8', 'SJIS');

002_sjis_to_utf8_failed

「はい、ドーン!Σ(゚ロ゚)o゙」

みごとに Shift_JIS でかかれている文字が、きれいに表示されました(^-^)o

めでたし、めでたし。

 

「じゃなーい!Σ(゚ロ゚)o゙」

って、今度は「UTF-8」のサイトが化けちゃってますΣ(゚ロ゚)o゙

あれこれ考えてみる

取得してきたサイトは、UTF-8、Shift_JIS、JIS、EUC-JPなど、色々な文字セットがあり得ます。

「Contetnt-Type」を見れば「text/html; charset=Shift_JIS」といった感じで使用文字セットが分かります。

「このcharsetを取得して、適切に対処しないといけないのでは無いだろうかっΣ(゚ロ゚)o゙」

とか思いつつ、もういっちょ。

$html = curl_exec($ch);
$html = mb_convert_encoding($html, 'UTF-8', 'SJIS,EUC-JP,JIS,ASCII,UTF8');

004_ok_both

「はい、ドーン!Σ(゚ロ゚)o゙」

 

って、あれ?Σ(゚ロ゚)o゙

今回もダメだと思っていたものの、両方ともちゃんと取れています。

 

「NTT-X Store(Shift_JIS)」としては ‘SJIS’ 、「gooスマホ部(UTF-8)」としては ‘UTF-8’ の指定が無いと化けてしまうようです。

‘auto’ を指定すると「”ASCII,JIS,UTF-7,EUC-JP,SJIS”」と指定したことになるようです。

この状態だと「UTF-8」が無いからか、「mb_convert_encoding(): Unable to detect character encoding」とか出てしまうようです。

 

「charset」を見て、正しいエンコードを指定するのが良いのでしょうけど、とりあえずこのままでいい…のかな(^-^;

get_file_contentsとcURLとwp_remote_get

リンク先のサイトの内容を取得する方法はいつくつかあります。

最初に覚えたのが get_file_contents() 。

これはローカルのファイルを読み込むのと同様、フルパスの代わりにURL(URI?)を指定すると、サイトの内容も取得できちゃう。

エラー制御もファイルと同じようにすればいいので、読み込みソースを限定しない場合に良いのだろうか。

とはいえ、サーバーの設定(php.ini)によっては、URLを指定できない場合があるので、汎用性を求めるプラグインとしては少々使いづらいかも知れず。

 

次に cURL。

クッキーの指定やら設定項目が多いので、「ブラウザのふりをしてあちこちのサイトにアクセスするような用途」に向いている気がします。

多機能で、コマンドライのものが元のようなので、Linux使いの方には馴染みが濃いのでしょう。

 

そして、WordPress 関数の wp_remote_get()。(WordPress2.7以降実装)

結果は連想配列で返してくれるようです。

処理速度とか計測していないので気にはなりますが、WordPress標準関数っていうのが良い感じです。

ステータスも取れるし、なんかもうこれにすればいい気がしてきましたΣ(゚ロ゚)o゙

(Pz-HatenaBlogCardのソーシャルカウント取得も実は wp_remote_get() を使ってたりします。)

変換先はUTF-8でいいのかな?

自分はUTF-8でWordPressを使っているので、「UTF-8でオッケー!」って決めつけてしまいましたが、大丈夫なのでしょうか。

一応、「bloginfo(‘charset’)」で、WordPressが扱っている文字セットが取得できるっぽいです。

$html = mb_convert_encoding($html, get_bloginfo('charset'), "ASCII,JIS,UTF-7,EUC-JP,SJIS,UTF-8");

でも、「WordPress 3.5.0以降は “UTF-8” を常に返します」とか書いてあるので、動作保障するWordPressを3.5.0以降ということにするならば、直書きでも問題無さそうです。

 

やろうとすると、

$result = wp_remote_get($url);
if (!is_wp_error($result) && $result['response']['code'] == '200') {
    $charset = preg_match( '/Charset="*(.*)"*/', $result['headers']['content-type'] );
    $html = mb_convert_encoding($result['body'], get_bloginfo('charset'), $charset);
}

こんな感じでいいんだろうか?(未検証)

コメント

タイトルとURLをコピーしました