成瀬です。

(2010/04/30 18:09), Yugui wrote:
> 2010/4/30 Yukihiro Matsumoto<matz / ruby-lang.org>:
>> 一つの例としては、テンプレートのエンコーディングと埋め込む文 字列(たとえばデータベースからのもの)
>> のエンコーディングがズレ てて、
>> 
>> incompatible character encodings: ASCII-8BIT and UTF-8
>> (Encoding::CompatibilityError)
>> 
>> が出る、と私は聞きました。
> 
> それはアプリケーションのバグです。バグを書くとバグが出ますし、データベースがカラムに紐付いた
> エンコーディングの代わりにASCII-8BITを返すようにしても解決しません。

わたしの現在の理解では、テンプレートが UTF-8 になっているのは正しいです。
これは Encoding.default_external で UTF-8 な String とした上で、
ERB 内で eval しているので UTF-8 になっているのでしょう (たぶん)。
# つまり、テンプレートに magic comment は必ずしも必要ない (?)

というわけで、データベースからの文字列が ASCII-8BIT になっているのが絶対的に誤りです。

> 今時のデータベースシステムはコネクションやテーブルやカラムがエンコーディングを持ってるので、
> そのエンコーディングをドライバ側で紐づけてやるのが一番情報が落ちなくて良いと思います。
> それでPostgreSQLのアダプタにはそういうパッチを送ってacceptされました。

SQLite3 のドライバである、sqlite3-ruby も次のバージョンでエンコーディングを
設定するようになります。 (thanks Aaron)
Rails のデフォルトである SQLite3 が非対応だったので踏む人が多かったのだと思いますが、
これで今後は減っていくんじゃないでしょうか。

# MySQL とか Oracle とかはどうなんだっけ?

> M17Nが必要なアプリケーションならテンプレートにUS-ASCII外の文字を書くべきでないし、
> 逆に特定のエンコーディングを仮定できるならばデータもscript encodingもそのエンコーディングに
> 合わせるべきです。そして、そのいずれもが、DBMS側で認識しているエンコーディングの文字列が
> 返ってきた方が嬉しい筈です。ASCII-8BITにする益がどこにあるのか分かりません。

同意見です。

-- 
NARUSE, Yui  <naruse / airemix.jp>