現状説明

はてなダイアリーEUC-jp(以下EUC)コードを採用しています。そのため英語と日本語でダイアリーに書き込む分については何の問題もありません。しかし、すでに積極的なユーザーの一部が英語、日本語以外の言語で書き込んでいらっしゃいます。一例を挙げます。

これら日本語、英語以外の言語を使う動機はさまざまです。ある方は自身の勉強のために、ある方は日本の外の事の紹介のために、ある方は自分の国の言葉で書きたいがためにこれらの言葉を使っています。
EUCはこれらの言語を取り扱えませんが、HTMLの数値文字参照を使用することでこれらの言語の文字を書き込み、表示することが出来ます。現在のところこれが唯一の方法です。しかしながら、これは非常に面倒な作業を強いられます。ブラウザによっては自動的にEUCが受け付けないコードを数値文字参照に変換するようですが、ブラウザに強く依存するためにあまりよい方法とは思えません。また、はてなダイアリーはこの方法をはじくという報告もあります。
さて、日記の書き込み、編集時のデータの流れを表記すると、通常の日本語ユーザーはこのようになります。

はてな(EUC)⇔ブラウザ・スクリーン(EUC)⇔ユーザー(タイプ)

しかし、中国語をはじめとする他の言語は次のようになります。

はてな(EUC)⇔ブラウザ・スクリーン(EUC)⇔ユーザー(タイプ/コピペ)⇔数値文字参照変換

日本語と英語以外の言語はカット&ペーストによって他のソフト/サイトによって数値文字参照への変換を行わなければなりません。この部分はお世辞にもつかいやすいとはいえず、はてなの優れたシステムの利用者としては残念なことです。

提案内容

上の問題を解消するために、はてなに「unicodeで編集」オプションを提案します。このオプションは編集ページと設定ページのみをunicodeで利用できるようにするオプションです。このオプションをオンにすると、上の編集モデルは次のようになります。

はてな(EUC)⇔unicode変換⇔ブラウザ・スクリーン(unicode)⇔ユーザー(タイプ)

はてなのシステムのうち、データベースや日記閲覧ページ生成部には一切変更を加えません。また、編集画面と設定画面もこれまでどおりEUCで生成します。異なるのは生成した編集画面と設定画面をフィルターによってunicodeのページに変換する点です。このとき、数値文字参照データはunicode文字に変換します。こうすることによってユーザーはテキストエリアの中国語を数値文字参照ではなく通常の文字として編集できます。
ユーザーが編集結果を送信すると、はてなは受け取ったデータをunicodeからEUCに変換します。このとき、EUCに変換できないデータは数値文字参照に変換します。
以上の変更には次のようなメリットがあります。

  • ユーザーは多国語を文字参照ではなく文字としてテキストエリアで編集できる。
  • はてなはデータベースとキーワードシステムを一切変更しなくてよい。
  • はてなは通常のページ生成システムを一切変更しなくてよい。
  • 一般ユーザーのページ閲覧は何の影響も受けない。
  • これまで数値文字参照として入力したデータと完全互換。

以上のように、この提案による方式はもっとも負荷の高い部分には変更を加える必要がなく、かつ、多国語を使うユーザーの使い勝手を大幅に改善します。

文字化け

unicodeの数値文字参照を使ってもIEで「說」の字などが化けることがid:QianChongさんから指摘されています。現在調査中ですが、これははてなダイアリーだけの問題とは言い切れないようです。HTMLからブラウザ画面に表示するまでにブラウザ内部とOS内部であれこれ弄り回すために何かの条件が満たされないときちんと表示されないのかもしれません。
別サイトで実験したところ表示されましたので、おそらくはCSSでのフォントファミリーの指定などで逃げられる話ではないかと思います。
現在問題が確認されているのは

です。一方、

では正しく表示されています。
この辺も含めて、unicodeにしたから全部解決するという話ではありません。使いこなしへの長い道の一歩を踏み出したという気分です。

数値文字参照双方向変換

はてなダイアリーunicodeを!」と提案しておいてなんですが、外部に双方向フィルターを持たせればはてなunicodeに対応してなくても限定的な解決は可能です。
例えば、私が常用しているブラウザはMozilla Firefox 0.8ですが拡張機能を使うことでブラウザのtextarea*1のデータを好きなテキスト・エディタに書き出すことが可能です。編集が終わったらテキスト・エディタを終了することでブラウザ上のtextareaの内容が更新されます。
この機能を使ってエディタではなく外部の双方向フィルターを呼び出すとどうでしょう。

  1. Firefoxからtextareaの文章をテキストに落として外部フィルタを呼ぶ。
  2. 呼び出されたフィルターはtextarea内部の数値文字参照unicode文字に置き換えたテキストを生成し、これを外部のエディタに渡す。
  3. ユーザーは外部エディタで普通に中国語(多国語)を編集
  4. ユーザーがエディタを閉じるとフィルタが編集済みテキストからEUCにない文字を探し出して数値文字参照に置き換える。
  5. 最終処理結果をFirefoxから渡されたテキストファイルに格納する
  6. Firefoxがテキストファイルをtextareaにコピーする。

どうでしょう。これだとはてなダイアリーEUC-jpであってもテキスト編集はunicodeです。しかもMozilla系のブラウザは内部文字コードunicodeですので先のフィルターに渡されるコードもunicodeです。つまり、このフィルターを作る人は数値文字参照の双方向変換だけやれば、文字コード変換をしなくていいのです!
ただし、これはMozilla Firefoxに限った話で、IE系の同様のフィルターの場合はshift-jis⇔unicode変換が必要になります。それにこのフィルターはMacUnix用に別に用意しなければなりません。そもそもブラウザだけで日記をかけるというはてなダイアリーのよさをかなりスポイルしています。そういうわけでやっぱりunicode化を希望します。

*1:編集領域

CJKユニフィケーション

自分の別サイトに中国語表示実験というページを作りました。ページ全体のエンコードはshift-jisですが、サンプル文字列にlang属性を指定しています。特に「為」の字に注意してください。unicodeは日本語、中国語、韓国語の漢字のうちよく似た同じ意味*1の漢字に同じコードを割り当てています(CJKユニフィケーション)。そのため、unicodeにしても正しい字が表示されるわけではなく、本来なら言語属性まで表記しなければなりません。
今日現在、はてなダイアリーはソースで指定したlang属性を剥ぎ取ります。この件に関してはid:yukattiさんも指摘されています。id:yukatti:20040421#1082523290
なお、lang属性の説明をWEBで調べると中国語は"zh"となっていますが、実際には中華人民共和国なのか中華民国なのかまで指定しなければ繁体中国語と簡体中国語と区別することは出来ません。上の例が両者の区別の例として適切かどうかは勉強不足でわかりません。
追記:偶然ながらunicodeの問題を語る上で適切な例だったようです。むぅ。

*1:「それは厳密な説明ではない」という抗議がきそうですが、漢字の国の住人である我々から見るとその程度の発想です

/* -----codeの行番号----- */