Laravel:mb_convert_encoding が原因でエラー発生
Laravel:mb_convert_encoding が原因でエラー発生
旧システムでは動いていたスクリプトを移植(多少修正)した結果、エラー発生。
$check_title = mb_convert_encoding($sResponce,"UTF-8" ,"auto"); //実行結果 mb_convert_encoding(): Unable to detect character encoding
なるほど、エンコードが解らんぞと言う事ですね。
何をしたかったか
Amazonなどのサイトから商品画像を取得しようと試みたスクリプトです。
リンク切れや誤記載で404エラー専用ページとかに飛ばされた時の処理を書こうと上記コードを書いてました。
システムで読むので、文字コードを『UTF-8』に統一して所定の文字があるか判断させようというもの。
旧システムではしっかり動いていたのですが、なぜかエラー。
引数の "auto" が読めない事が原因の様です。
サイトの文字コードを先に取得して引数に流し込んで解決
こんな感じにしました。
if(($Responce = @file_get_contents($url)) == FALSE )
{
// HTTPステータスコードを取得する
$status_code = explode(' ',$Responce[0], 3);
// ステータスコードごとの処理
switch($status_code)
{
case 404: //echo "404: Not found.";
break;
default: //return "ERROR ${status_code}";
break;
}
}
else //正常にfile_get_contentsで取得できた場合の処理
{
//charsetの取得
$charset = mb_detect_encoding($url,'ASCII,JIS,UTF-8,EUC-JP,SJIS');
//該当なしページの除外
$stl = mb_convert_encoding($Responce,"UTF-8" ,$charset);
preg_match( "/<title>(.*?)<\/title>/i", $Responce, $matches);
if(isset($matches[1]))
{
switch ($matches[1])
{
case "該当ページがございません":
case "WADAXレンタルサーバー":
break;
}
$charset = mb_detect_encoding($url,'ASCII,JIS,UTF-8,EUC-JP,SJIS'); でエンコードを調べて
$check_title = mb_convert_encoding($sResponce,"UTF-8" ,$charset); の引数として格納
caseの場合分けは取得してくるサイトの出すエラーページのタイトルを記載します。
これで404エラーの時に『ページがございません』ページへ飛ばす仕組みがあっても無事飛ばせます。
まとめ
それにしても fail_get_contents が重い。
Amazon画像の取得はやっぱり自動化しないとダメかなと思う今日この頃です。
※でもね、自動化するとJAN間違えてる商品画像も持ってきちゃうんですよ(悩)

