Hatena::Groupptech

ぷちてく RSSフィード

Archive
 
ProfileProfile

2012-10-22

はてなスターの挙動はサーバのContent-Typeに従う

01:49

どーもこんちわ。前のエントリで、はてなスターで引用できなかったり文字化けするよ、というレポート的なのを書いて救援を求めたところ、

コールしてた id:wakabatan さんが、挙動の解説を書いてTB飛ばしてくれた。わかばさん、どうもありがとうございます

はてなスターの文字判定

わかばさん曰く、

はてなスターで文字化けしたり引用できなかったりという話ですが、

HTTP ヘッダーの Content-Type に charset 引数が指定されていない場合、 RFC 2616 によれば charset=ISO-8859-1 とみなすことになっています。はてなスターは元々それに従っていて、文字化けしてしまったり、引用できなかったりすることがあります。はてな内のページは charset が正しく指定されているので文字化けしませんが、はてな外のページは指定されていないことが多いので、よく文字化けします。

ただしその RFC 2616 の規定は間違いであり、はてなスターも Web ブラウザと同じく <meta charset=""> を使って文字コードを判定するアルゴリズムに従うべきですが、まだ完全には実装されていません。

■ - 若葉もすなる☆日記というもの

とのこと。これはクローラbot(Hatena Star UserAgent)その他も含めた話なのか、単純にaddStarする場合の話なのかはわからないけど、どう対処すればいいかは何となくわかった

  • レスポンスヘッダで適切なcharsetを返すとよい
  • METAタグで適切なcharsetを返すとよい

どちらかというと仕様だと受け取ったのと、続編としては書く必要なくなったので、前のエントリは手を入れて直しておく

この2要素、コンテンツの文字化け基本要因なのに完全に見落としてた。とほ・・

試しに化けたページのレスポンスヘッダとMETAタグ見てみたら、両方設定されてなかった。ガクッ

ASCII以外引用不可になるしくみ

はじめ「なんで引用までだめになるの?」と思ったけど、

  1. 適切な文字コードで読めないので、クローラbotASCII的な部分しか読めない
  2. 引用時に投げたリクエストと照らし合わせたときに、クロール済みの文字列にマッチする文がない
  3. 「これは原文に無い文を引用している」と判断して、適切でない引用文だとみなす
  4. 結果、レスポンスのJSONではquoteが空になる
  5. 引用無しでただのスターが付くのがユーザに伝わる

こんな感じで弾かれてると考えた。大体あってるとおもう

「いやいやこれはバグだろ」と思うひとは

はてなスターのお問い合わせでやり取りするといいんじゃないかと

でも、はてなスターじゃなくて各コンテンツのサーバ側の問題だとおもうよ

解決するには

コンテンツの設置者側がサーバ等の設定を適切にしてあげる必要がある

レスポンスヘッダ

Content-Type でのcharset の指定は、エンコードに従って

Content-Type: text/html; charset=utf-8

UTF-8 ならたとえばこんな感じで返せばよいのでは。EUC-JPなら

Content-Type: text/html; charset=euc-jp

このように

METAタグ

「コンテンツのHEADの一番目に書いた方がいい。実際文字が出てくる前に書く必要あるから」と、よくいわれてる

UTF-8なら、

<meta http-equiv="Content-Type" content="text/html; charset=utf-8">

とか、

<meta charset="utf-8">

こんな感じ。EUC-JPなら、

<meta http-equiv="Content-Type" content="text/html; charset=euc-jp">

とか、

<meta charset="euc-jp">

こうなる。わかばさんが言われてるように、将来、実装がここを見てブラウザのように判定するレベルになったとき、はてなスターの役にたつ

スター抜きにしても、割と普通に付けてて欲しいとこなので、付け損ってことはない

まとめ

  • と、いうことがはてなのドキュメントに載るのが一番よい
  • ドキュメントできるまでは、影響力のある人がツイートはてブ・リブログなどで周知する
    • その際は1次ソースであるわかばさんのエントリを取り上げるといい

と、おもった。はてなのヘルプはボランティア参加で一部編集できる、と聞いたことあるけどたぶん流行らない

謝辞

ブログ検証に使わせてもらった id:mono0x さん、id:os0x さん thx

id:mono0x さんのところ直った

うっひょー

nginxの設定に以下の1行を加え、Content-Typeヘッダにcharset=utf-8を付けたら引用できるようになりました!

charset utf-8;
monoweb.info - 

よかったですね!これで将来はてなエクソダスが GitHub Pages(or 自分のドメイン) + Octopress(or jekyll) + はてなスター でぶろぎんぐすたーできるようになった!

ためになるのでおすすめチェキラ

id:os0x さんのとこも直るといいな

nginx が応答したけど、GitHub Pages でその辺いじれるかわからず。一応コメントしてきた

ためになるのでおすすめチェキラ

トラックバック - http://ptech.g.hatena.ne.jp/noromanba/20121022