Rails3.x でASCII 8bitで渡ってきたparamsハッシュパラメータのキーと値をUTF-8化するメソッド


def encodeToUtf8(params)

hash = {}

params.map do |key, val|

dupKey = key.dup unless key.instance_of? NilClass
dupVal = val.dup unless val.instance_of? NilClass

dupKey.force_encoding('UTF-8') if key.instance_of? String
dupVal.force_encoding('UTF-8') if val.instance_of? String

hash[dupKey] = dupVal

end

hash

end

RubyでJSONをパースする


RubyJSONをパースする場合、このサイトのJsonParserが使いやすい。
ダウンロードしたJavaScriptファイルをロードパスの通った場所に配置し、コードの中で


require 'SimpleJson_jp'
としてやると、使えるようになる。


このJsonParserは、JSON文字列がUTF-8であることが必須であるので
パースする前に、UTF-8に変換することが大事である。

クライアント側でのJSONの作成と解析


クライアント側でJSONの作成と解析を行う場合、JSONの作成者でもあるDouglas Croockford氏が作成した
JavaScriptライブラリを使用するのがよいだろう。以下のURLよりダウンロードできる。
http://www.JSON.org/js.html


JavaScriptオブジェクトをシリアライズする方法は以下の通り。


var jsonObj = JSON.stringify({name:'山田太郎', age: 29});

JSONオブジェクトをデシリアライズする方法は以下の通り。


var obj = JSON.parse(jsonObj);

このスクリプトはコードをサニタイズしてくれるので、これを使用するのがよいだろう。

jQueryオブジェクトから、素のDOMオブジェクトを取得する方法


jQuery(要素s)は、たとえ要素が一つの場合でも、配列として持っている。
jQuery().get(index)で、もとのDOMオブジェクトが取得できる。
jQuery('li').get(0)なら、要素

  • の一番目のDOMオブジェクトが取得できる。
    jQuery().get()にはショートカットがあり、通常はそちらを使用することになる。
    ショートカットは、jQuery(要素)[index]である。


    これの使いどころは、色々考えられるが、要素セットの比較などに使えるのではなかろうか。
    jQuery(要素)は、同じ種類の要素をパラメータにとっても、jQueryが呼ばれば時点で、新しいjQueryオブジェクトが作成されるので
    ==演算子で比較してもfalseが返ってきてしまう。
    そこで、DOMオブジェクトに変換したあとで、==演算子で比較すると、同じ種類の要素の場合、trueを返してくれることになる。
    以下はその例である。



    //テーブルの項目をクリックしたときのイベント
    var textbox;
    $('td').click(
    function(event){

    //textboxのjQueryオブジェクトが存在し、且つ「textboxのDOMオブジェクト」と「イベントが
    //発生したDOMオブジェクト」が異なれば、テキストボックスを普通のセルに戻す。
    //この設定は、テキストボックス内のカーソルの移動を、マウスクリックを使って
    //可能にする為である。
    if(textbox && textbox[0] != $(event.target)[0]) textbox.replaceWith(textbox.val());

    $(event.target).html('');

    textbox = $('#edit_item');
    textbox.focus();
    textbox.css({width:$(event.target).width() + 'px'});

  • jQueryでajaxのリクエストを投げた時の、FirefoxとSafari,IEの違い


    jQueryでは、AJAXを利用するときに、jQuery.ajax()関数を利用する。

    ajax関数のパラメータには、javascriptのオブジェクトを設定するが、そのプロパティには以下のものを指定する。

    • url:リクエスト先のURLを指定する
    • type:GET or POST
    • cache:ブラウザ、プロキシ、サーバーのキャッシュを返すかどうかの真偽値
    • data:サーバーへ送信するデータ
    • dataType:サーバーから受信するデータのタイプ
    • error:エラー時のコールバックメソッド
    • success:成功時のコールバックメソッド
    • complete:error時、又はsuccess時のコールバックメソッドが走った後に起動するコールバックメソッド


    これらのパラメータでFirefoxSafari,IE で異なる動作をするものがある。
    dataTypeである。
    例えば、dataTypeに'text'を指定するとしよう。
    これはサーバーからプレーンテキストが送られてくることを期待することになる。
    しかし、もしサーバーから何もデータが送られてこなかったら、どうだろう。


    ここでブラウザの違いが表面化する。
    Firefoxの場合は、サーバーから何も送られて来なかったとしても、エラーは起きない。
    しかし、SafariIEでは、エラーが発生し、エラー時のコールバックメソッドで補足されることになる。


    以下は、サーバー側をRuby On Railsで書いたときのエラー発生時のログである。


    ActionView::MissingTemplate (Missing template books/index with {:handlers=>[:erb, :rjs, :builder, :rhtml, :rxml], :formats=>[:text, :"*/*"], :locale=>[:en, :en]} in view paths "/Users/koichi/Documents/Rails/manage/app/views"):


    Rendered /opt/local/lib/ruby1.9/gems/1.9.1/gems/actionpack-3.0.1/lib/action_dispatch/middleware/templates/rescues/missing_template.erb within rescues/layout (1.5ms)


    :formats=>[:text, :"*/*"]のところで、textを送信していないと怒られているようだ。


    更新処理などで、特にクライアント側でデータを受け取る必要がないときには、dataTypeをパラメータとして指定しないのがよいだろう。

    Ruby1.92 正規表現で日本語にマッチ方法

    結論からいうと、これで解決しました。

    [ぁ-んァ-ヴ一-龠ーア-ン゚゙・ーャュョァ-ォッ]+

    ほんと、日本語の扱いは難しい。
    「ア」「ア」「ァ」「ァ」これらの"ア"は、全て異なるアです。
    さらに当然の事ながら、全角のハイフンと半角のハイフンは異なります。⇒「ー」「ー」
    さらに、パピプペポとかザジズゼゾの「゚」「゙」は、夫々独立した文字の扱いを受けます。
    また、「バッタ」と「バッタ」の「ツタヤ」と「ツタヤ」それぞれの「ツ」は全て異なる扱いを受けます。

    そして、Ruby1.92では、さらに正規表現の比較が厳密です。
    例えば、ある文字列がWindows-31Jエンコーディングを持つ場合、正規表現に/ホニャララ/sを指定して、
    正規表現Shift_JISとして、比較しようとしても、「Windows-31J」と「Shift_JIS」を異なる
    エンコーディングとして扱う為、エラーになります。

    じゃあ、どうするかというと、最終的には以下のようにしました。

    line.encode!('UTF-8')

    if line =~ /(\w+?)\.DBM\s+([\wぁ-んァ-ヴ一-龠ア-ンーーャュョァ-ォッ゙゚]+)/u

    end

    lineは「Windows-31J」として、ファイルから読み込まれたものですが
    String#encode!メソッドで、破壊的にUTF-8に変換しています。
    さらに正規表現では、/ホニャララ/u とすることによって、UTF-8として検査するようにしています。

    ただ、これでも恐らく抜けがあるんじゃないかなあ。

    日本語をモレなくマッチさせる正規表現として、もっと良い指定方法が
    教えて下さいな。