rails:1321
From: SAITO Masaru <daisaito@l...>
Date: Sun, 09 Jul 2006 00:32:39 +0900
Subject: [rails:1321] Re: FORMから送られてくる日本語処理について
齋藤@横浜です。 >植田と申します。 > > > 確かに PHP だと自動で漢字コード判別・変換をする機能があり、それが >売りにもなっていますよね。 はい、そういうのをrailsでもきっとだれかが作っていると思ったんですけど。 >> つまり、「accept-charsetが指定されていない時は、ブラウザは、 >> フォームが含 まれている文書と同じエンコーディングでGET/POSTデータを >> 送るのが望ましいが、 必ずしも、そうでなくても良い」と言っていると >> 読みとれます。 > >ええ、そうだと思います。 form を含む HTML ファイルの漢字コードでデータが >送られてくるかどうかはブラウザの実装依存だったハズです。大抵のブラウザ >は HTML ファイルの漢字コードと同じ漢字コードでデータを送ってくれるケド、 >そうではないブラウザもあるんですよね。 その前提でPHPもそうなったんじゃないかなと思います。 >誰かプラグインを作っていらっしゃらないでしょうか〜 と完全に人任せで >ごめんなさい :)。 とりあえず、、 私の書いたのを晒してみます。 まだrubyになれていないので、汚いプログラムだと思いますが、 ヒントになれば幸いです。 # 私以外でもっとエレガントに書いてる人がきっといますよね? # いたらそちらの方を採用してください。 まず、これを全てのapplication.rbに書くべきじゃないと思うので プラグイン化は賛成です。 そして、プラグインを作る方法を知らないので知ってる方に ぜひともお願いしたいなと・・・私も人任せ :-) #if文とかを長いので複数行にしてみたんで、もしかしたら動かないかも・・・ app/controllers/application.rb ------------------------------------------------------------ class ApplicationController < ActionController::Base before_filter :params_encode_convert after_filter :after_encode_convert # config/environment.rb の$output_charsetに基づいて処理する # ただし、プログラム中で$output_charsetを変更したらそれを優先する # $output_charsetは'utf-8','shift_jis','euc-jp'のみ受け入れる def after_encode_convert() # content-typeヘッダにcharsetを追加する処理 content_type = @headers['Content-type'] || 'text/html' if /^text\//.match(content_type) && ( $output_charset == 'utf-8' || $output_charset == 'shift_jis' || $output_charset == 'euc-jp' ) @headers['Content-type'] = "#{content_type}; charset=# {$output_charset}" end # ドキュメントBODYのエンコードを変更する処理 case $output_charset when 'utf-8' @response.body = NKF.nkf('-wx',@response.body) when 'shift_jis' @response.body = NKF.nkf('-sx',@response.body) when 'euc-jp' @response.body = NKF.nkf('-ex',@response.body) end end def params_encode_convert() # 元の文字コードを調べて、nkfのsrc文字コードのヒントにする # 短い文字列のみを変換すると誤変換してしまうことがあるので # @params全体を文字列にキャストして評価する case NKF.guess(String(@params)) when NKF::JIS nkf_opt = 'J' when NKF::EUC nkf_opt = 'E' when NKF::SJIS nkf_opt = 'S' else # ascii,unknow,utf8,utf16,binaryだけのはず・・・ # asciiはそもそも変換する必要がない # それ以外は変換するとどうなるかわからないので変換しない # (utf16は検証環境がない) # utf8はそもそも変換する必要がない nkf_opt = '' end unless nkf_opt.empty? @params = _convert_go(@params,nkf_opt) end end def _convert_go(data,nkf_opt='') if data.is_a?(String) return NKF.nkf('-wx' + nkf_opt,data) elsif String(data.class) == "NilClass" return nil elsif data.is_a?(Hash) data.each do |key,val| # 再帰的に呼び出す data[key] = _convert_go(val,nkf_opt) end return data else return data end end end # end of class ------------------------------------------------------------ app/views/layouts/*.rhtml ----------------------------------------------------------------- <!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd"> <html lang="ja"> <head> <meta http-equiv="Content-Language" content="ja"> <meta http-equiv="Content-Type" content="text/html; charset=<%= $output_charset %>"> <title><%= get_title %></title> </head> <body> <%= @content_for_layout %> </body> </html> ----------------------------------------------------------------- $output_charsetを変更する場合はviewの前に行わないときっとおかしくなる。 -- ML: rails@r... 使い方: http://QuickML.com/
1315 2006-07-08 04:41 [daisaito@l... ] FORMから送られてくる日本語処理について 1316 2006-07-08 11:41 ┣[someeda@g... ] 1317 2006-07-08 13:25 ┃┗[daisaito@l... ] 1318 2006-07-08 14:49 ┃ ┗[fuj@r... ] 1319 2006-07-08 15:53 ┃ ┗[daisaito@l... ] 1320 2006-07-08 16:09 ┃ ┣[bsdmad@g... ] -> 1321 2006-07-08 17:32 ┃ ┃┗[daisaito@l... ] 1327 2006-07-09 16:54 ┃ ┗[fuj@r... ] 1322 2006-07-07 18:40 ┗[y-yamasaki@s... ] 1326 2006-07-09 12:21 ┗[daisaito@l... ]