成瀬です。

(2010/04/30 13:23), masayoshi takahashi wrote:
> 高橋征義です。
> 
> 2010年4月30日11:32 Yukihiro Matsumoto<matz / ruby-lang.org>:
>> |2. 変換したいencodingがある項目はアプリ側で把握し、
>> |   UTF-8へのforce_encodingを試みる
>>
>> UTF-8なんですか。私はアプリエンコーディングを用いるべきだと思っ
>> ていたのですが。ISO-8859-1なページからPOSTされたリクエストで
>> もUTF-8で来るというのが最近のブラウザの挙動なんでしょうか。もっ
>> ともこの辺はバッドノウハウもたくさんありそうですが。
> 
> # 私見では、アプリ内での内部エンコーディングはUTF-8で統一しないと
> # 収拾つかないんじゃないかなあ、という気がします。
> 
>> 一般的にどのようにリクエストのエンコーディングを推測している
>> のでしょう。ヒューリスティック?
> 
> 一般的には、フォーム等からのPOSTの場合、そのフォームの
> 画面のエンコーディングが使われます。つまりShift_JISの
> HTML内のフォームに入力してPOSTした場合のエンコーディングは
> Shift_JISのはず。
> そのフォームのHTML自体もフレームワーク側で生成して
> いるはずなので、その文字コードはわかってるはず。なので、
> それに合わせておけば処理できる感じです。

form 要素の accept-charset 属性か、その文書のエンコーディングか、
ブラウザ依存の勝手なエンコーディングか、UTF-8 ですね。
この辺は HTML5 で明文化される予定です。
http://www.w3.org/TR/html5/forms.html#url-encoded-form-data

> 困るのはGETのクエリパラメータとして与えれる文字列の
> エンコーディングで、これはリンク等の場合、リンク元の
> HTMLのエンコーディングに依存するため、同一ページへの
> アクセスでも(リンク元が異なれば)Shift_JISだったり
> UTF-8だったりすることがしばしばあります。まあ
> アプリ内では使用するHTMLのエンコーディングは把握・
> 制御できるはずなので、それ以外(外部サイトからの
> リンクの場合とか)は推測 and/or 間違ったらごめん、かなあと。

URL 自体にエンコーディングを埋め込むのが正解でしょう。

また、先の文書に _charset_ パラメータの話があるので、それを流用してもよいかも。
これぞまさしくバッドノウハウって感じですが。
http://0xcc.net/pub/webdb/bk-04.html
http://suika.fam.cx/~wakaba/wiki/sw/n/_charset_

>> |3. 変換後、encodingのチェックをして、おかしいのは例外を投げる
>> |が理想的だと思います。
>> |一緒にaccept-encodingみたいな列挙項目をpostしてもらうとか。
>>
>> このアプローチはアプリ側での対応が必要なので望ましくありませ
>> んね。確実でしょうけど。
> 
> 例外はいろいろ厳しいかも…。validationのオブジェクトに
> エラーの情報が入っててほしい(制御フローは通常のまま)が
> 理想的かもです。って、その辺りはフレームワークとの兼ね合い
> ですが。

Rails は今でも不正な UTF-8 が送られてきたときは例外を上げていませんっけ。

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