小鳥botには、HTMLであるようなURLを含む発言を見るとそのページのタイトルを取ってくるという機能があります。とあるURLで Error: Character Encoding Unknown と出てくるので、また処理が不完全なのかーと思って調べていました。
HTMLにはちゃんと
<meta http-equiv="Content-Type" content="text/html; charset=shift_jis">
と書いてあって問題なし。ということはHTTPレスポンスヘッダが問題となります。レスポンスヘッダをよく見ると、
Content-Type: text/html; charset=none
none?何それ?
なんでこんな応答になるのか不思議なのでググっていたら、RTFM というページで考察しているのを見つけました(「AddDefaultCharset none の謎」のところ。このページ自体に「怪しい」と自分で書いてあるのは検索で飛んできた人への嫌味?と言える)。で、実際そう設定するとそういう応答を返します。ええい腐れWebサーバめ。と書いていて自分も同じことになっていたら非常に恥ずかしいので確認してみましたが、ちゃんと
AddDefaultCharset UTF-8
と書いてありました。つまりインストール時のデフォルトから変更していません。忘れてるだけとも言いますが。
どうやらこのような腐れWebサーバは世の中には(というかほとんど日本語圏らしいのですが)多いらしく、仕方ないので「腐れWebサーバの尻拭いをする」というcommitメッセージとともに none を無視する処理を入れておきました。プンスカ
ところで、HTTPレスポンスヘッダとHTML内の記述とで charset があからさまに食い違っていることになるわけですが、この場合はどう処理するのが規格上正しいんでしょうかね。HTML 4.01 Transitional の仕様(の「メタデータ」の節)には書いていないようなのですが。規格には定義されていない、ということでいいのかな。
# なお、HTTPレスポンスヘッダで Content-Type の charset が省略されている場合は iso-8859-1 (latin-1) が指定されたのと同じにしなければならない、という点に関してはとりあえず考えないことにします。
何だか小難しくて良くわかりませんが、せっかくなので時報と今日の訓示機能の実装をゼヒ!
妄想のサポートもお願いしますw
[…] ■或るプログラマの一生 » Content-Type: text/html; charset=none…? たまにFireBugを見ると「An unsupported character encoding was declared on the transfer protocol level. The declaration was ignored.」って出てるのはこれだ […]