人気ブログランキング |

PHPでFC2ブログからデータを取得するときに文字化けする問題

FC2ブログのHTMLデータを取得する処理を書いてたら、妙な文字化けを起こすことがあることに気付いた。
しかも再現したりしなかったりで、なんじゃい こりゃあ?
file_get_content でやっても、cURL でやっても発生する。

同じページをひたすら取得して先頭40bytesだけ表示するプログラムをループ実行させたら、ちゃんと読めるときと読めないときがある。わけがわからないよ…
PHPでFC2ブログからデータを取得するときに文字化けする問題_e0051410_18134350.png

livedoor blog では問題なくて、fc2ブログだけで発生。

で、結論としては、FC2ブログのサーバ側が gzip 形式でデータを圧縮して送りつけてたのが原因でした。

・・・え?(;゚Д゚)
PHPって、デフォルトでデコードしてくれないの??





▼対策:cURL の場合

curl_setopt( $ch, CURLOPT_ENCODING, "gzip" );
してから実行するとちゃんとデコードしてくれます。
ついでに livedoorブログからもgzipで取ってくれて転送量減って (゚д゚)ウマー です。

余談ですが、
curl_setopt( $ch, CURLOPT_ENCODING, "identity" ); // identity: 無圧縮指定
としたとき、サーバが無理矢理 gzip 等で送ってきても、きちんとデコードしてくれるようになります。
どうやら受付可能形式を指定すると同時に、自動デコードを行う、というフラグにもなってるようです。


▼対策:file_get_contents の場合

  結論、無理!

この関数を使うとお手軽なのですが自動デコードできないので、
無圧縮形式(identity)を指定したコードを書いてみた。
でも普通にgzip形式で送りつけてきやがる!
  無視かよ!!
いちおう検証したコードを掲載しておきます。

function get_contents( $url )
{
     $option = array(
       'http' => array(
         'method' => 'GET',
         'header' => 'Accept-Encoding: identity\r\n'
       )
     );
     $context = stream_context_create($option);
     return file_get_contents($url, false, $context);
}

べっ、べつに コードが悪いんじゃないんだからねっ!!(///)

※注1
 念のためcURLでもidentity指定でやりましたが、
 やっぱり無視してgzipで送られることがままありました。

※注2
  file_get_contentsで取得
  → $http_response_header を参照して形式判別
  → 自前でデコード
 という方法でいちおうできますが、めんどくさいのでお勧めしません。




以下詳細な調査データ。


cURLの場合の既定リクエストヘッダは下記のとおり。

1. 要求ヘッダ ( リクエストヘッダ )
GET /blog-entry-3423.html HTTP/1.1
Host: pinkimg.blog57.fc2.com
Accept: */*


2. 応答ヘッダ ( レスポンスヘッダ )
HTTP/1.1 200 OK
Server: nginx/1.0.4
Date: Tue, 22 Nov 2011 06:20:53 GMT
Content-Type: text/html;charset=euc-jp
Connection: keep-alive
Vary: Host,Accept-Encoding,User-Agent
X-Powered-By: PHP/5.2.17
X-UA-Compatible: IE=EmulateIE7
Set-Cookie: cookietest=test; expires=Fri, 02-Dec-2011 06:20:02 GMT; path=/
Content-Encoding: gzip
Content-Length: 16580
Content-Language: en


要求ヘッダに「gzipもOKだよ!」という記述がないのに、
FC2が勝手に gzip形式で送ってきてるわけですね。


▼Webサーバソフトウェアの違い

FC2ブログ:
  nginx 1.0.4
livedoorブログ:
  Apache 1.3.42(Unix)

(※2011/11/22現在)
ということでサーバソフトウェアが違うので、Accept-Encoding 未指定時の動作が違うっぽいですね。
最近このへんの動向はよくわかんないですが、nginxはパフォーマンス重視なので、キャッシュにヒットすると無視して他形式で送ってきちゃうのかもしれないです。
(単純にサーバ設定の問題の気もしますが)


▼余談:サーバのレスポンス

色々検証のため、ブログサーバに何度もアクセスしましたが、
FC2 よりlivedoorの方がだいぶレスポンスが軽かったです。
by golorih | 2011-11-22 18:10 | ソフトウェア開発 | Trackback | Comments(0)
トラックバックURL : https://golorih.exblog.jp/tb/16932765
トラックバックする(会員専用) [ヘルプ]
※このブログはトラックバック承認制を適用しています。 ブログの持ち主が承認するまでトラックバックは表示されません。


システム関連の個人的な備忘録。基本的にWindows関連です。

プロフィール

関連


Memoる

一生懸命だと知恵が出る
中途半端だと愚痴が出る
いい加減だと言い訳が出る

「やりたい」なんて言葉は使う必要が無い。「今やってる」「もうやった」「やらないことにした」なら使って良い。
まずは相手を好きになる、その次に相手のいい部分を探す、そして評価できる部分を見つける。それからです、誉めるのは。

カテゴリ

全体
ソフトウェア関連
ソフトウェア開発
Linuxサーバ
その他
Webサービス
MySQL
システム管理
test
バッチファイル
つぶやき
パソコンメーカー
jQuery
レビュー
実験と検証
セキュリティ対策
YahooPipes
vbs
ハードウェア関連
WordPress
JavaScript
HTML&CSS
Welcart
未分類

以前の記事

2019年 11月
2019年 04月
2019年 03月
2019年 02月
2018年 10月
2018年 09月
2018年 01月
2017年 12月
2017年 10月
2017年 09月
2017年 07月
2016年 12月
2016年 10月
2016年 08月
2016年 07月
2016年 04月
2016年 03月
2016年 01月
2015年 12月
2015年 11月
2015年 10月
2015年 09月
2015年 08月
2015年 07月
2015年 06月
2015年 05月
2015年 03月
2015年 01月
2014年 11月
2014年 10月
2014年 09月
2014年 08月
2014年 06月
2014年 05月
2014年 04月
2014年 03月
2014年 02月
2014年 01月
2013年 12月
2013年 11月
2013年 10月
2013年 09月
2013年 08月
2013年 07月
2013年 06月
2013年 05月
2013年 04月
2013年 03月
2013年 02月
2013年 01月
2012年 12月
2012年 11月
2012年 10月
2012年 09月
2012年 08月
2012年 07月
2012年 05月
2012年 04月
2012年 03月
2012年 02月
2011年 11月
2011年 10月
2011年 09月
2011年 06月
2011年 05月
2011年 04月
2011年 03月
2011年 02月
2010年 12月
2010年 11月
2010年 10月
2010年 09月
2010年 08月
2010年 07月
2010年 06月
2010年 02月
2009年 12月
2009年 10月
2008年 12月
2008年 06月
2008年 05月
2008年 04月
2008年 03月
2008年 01月
2007年 12月
2007年 11月
2007年 08月
2007年 07月
2005年 09月
2005年 08月

フォロー中のブログ

最新のコメント

アレが新しくなっていてH..
by 村長 at 18:18
msiファイルが見つから..
by 7of9 at 13:25
当方win10、むらびと..
by luna at 14:18
検索でこちらにたどり着き..
by ペカティエ at 16:04
2と3の間に「アレでNI..
by むらびとA at 23:03
たった今試してみたんです..
by むらびとA at 23:01
ワークグループ環境にws..
by ヒジキ at 16:27
こんにちは。 別件の検..
by luka3 at 17:00
win10ではアレが使え..
by A at 17:56
現在(2018/04/2..
by むらびとA at 10:27

その他のジャンル

ファン

記事ランキング

ブログジャンル

ネット・IT技術

画像一覧