はてなダイアリー ― 画像のタイトルについて

バケラッタ

はてなダイアリーでは、1日に1枚だけ画像が登録できます。

画像を登録する

1日1枚、画像を登録する事ができます。画像は自動的にサイズ変更され、日記の中に表示されます。画像を登録するには、参照ボタンを押してお使いのパソコンの中にあるファイルをアップロードして頂くか、http://〜(ftp://〜)で始まるURLを入力して下さい。画像アップロード欄のとなりに文字を入力して、画像のタイトルを指定する事もできます。

長辺150ピクセル(つまり最大150*150)までの画像が登録でき、大きいサイズの画像を指定した場合、はてな側で縮小されます。
有料オプションを使うと、長辺300ピクセルまでの画像が登録できるそうです。
 
ま、それはいいとして、ヘルプにもあるように画像にはタイトルを付けることができます。
 
ここでちょっとIMGエレメントについて書きます。
IMGエレメントにはalt(=alternate text)アトリビュートを必ず付けなければならず、これによって画像が表示できない場合の代替テキストとして表示される文字列を指定しておけます。
これとは別にtitleアトリビュートというものも付けることができ、これは画像に対して補助的な情報を文字列で提供するものです。
で、はてなダイアリーでは画像を登録する際、画像のタイトルを指定することができます。
(参照:はてなダイアリーガイド「はてなダイアリー入力画面説明」の項目g)
そして、指定されたタイトルは、title属性とalt属性の双方に反映されます。
 
私の2003年12月29日のダイアリーを例に出します。
<img class="photo" src="/images/diary/asedaruma/2003-12-29.jpg" alt="コミケ65 2日目 ここで並んでた" title="コミケ65 2日目 ここで並んでた">
通常、このようになります。
 
さて、やっと本題ですが、はてなダイアリーでは画像登録に関する決まりがあります。

全角文字で18文字以内、半角文字で36文字以内でタイトルをつける。画像のタイトル(画像アップロード欄のとなりに文字を入力)が長すぎる場合、画像が登録されない。

半角で37文字以上のタイトルは利用できないということです。
しかし、それと知らずに私は、2004年1月24日のダイアリーに登録した画像に対して半角37文字分のタイトルをつけてしまいました。
そのタイトルは「二度と撮れない(?)万世10Fからの写真」です。
 
その結果どうなったかというと、
<img class="photo" src="/images/diary/asedaruma/2004-01-24.jpg" alt="二度と撮れない(?)万世10Fからの写青 title="二度と撮れない(?)万世10Fからの写青>
のようになりました。
はい、「写真」の「真」の字が化けて「青」になったうえに、ダブルクォーテーション(")が消えてしまいました。
これはどういうことかと考え、以下のような結論に達しました。
 
「真」のEUCコードは“bfbf”です。
もし、馬鹿正直に半角36文字分でタイトルをカットしたとすると、「真」の2バイト目“bf”が削られることになります。
そして、そこに続くはダブルクォーテーション。コードは“22”です。
その結果、文字コードは“bf22”というありえないものとなります。
なぜありえないかというと、EUCの2バイト文字において、2バイト目はa1〜feとなっているからです。
 
そして、私の環境ではシフトJISで表示されています。
 
ここでエンコードを考えます。
まず、EUCをJISコードに直します。
これは各バイトから80を引くことになります。
しかし、“bf22”の2バイト目は80より小さいです。
この結果、22-80=a2というビット計算ならではの値が出てしまうのです。
つまり、JISコードでは“3fa2”となってしまうわけです。
 
この後のシフトJISへの変換はややこしいんですが、1バイト目が奇数か偶数かで計算が分かれます。
今回は1バイト目が奇数なので、奇数方式だけ計算を行います。
 
1バイト目は1足した値を2で割り、さらに70を加えます。
つまり (3f+1)/2 + 70 = 90 となります。
 
2バイト目は単純に1fを足します。
つまり a2+1f = c1 となります。
 
あとは、1バイト目がa0以上なら1バイト目にさらに40を加え、2バイト目が7f以上なら2バイト目に1を加えます。
1バイト目は90なのでa0以下でそのまま、2バイト目はc1なので1を加えてc2に。
結果、シフトJISコードは“90c2”となります。
このコードこそが「青」なのです。
 
あー、長かった…
読んでる人はわけワカメでしょうね(^^;
というか読み飛ばしてるか…
 
さて、これはバグとして運営側に報告すべきでしょうか?
規定通り半角36文字以内に収めたら問題はないんですが…