[前][次][番号順一覧][スレッド一覧]

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...       ]