NKFによる改行コードの正規化を ActiveRecordオブジェクトに仕込む
ある日ユーザーから入力された改行含みのテキストをデータベースへそのまま保存していたら、改行コードの統一が取れていないことに気付いた。Macの奴は \rだし ケータイの奴は \r\n だ。Windowsは試してないけど、とにかくおまえらいい加減にしやがれ。
仕方ないので正規化を試みるのだが、このデータが様々な内部処理を通ってバックエンドに伝達されていく(またはその逆の)ことを考えるとこういうものはなるべくUIに近い側で早めに正規化されるのが筋だ。
UIからの入力が x-www-form-urlencoded しかないのならばフレームワークの入力フィルタみたいなやつ(Railsでどうやるのか知らないけど、どうせあるんだろそういうの?)で全部のパラメータ値に改行コード正規化をかけるみたいなことも(乱暴だけど)出来るだろうが、今日びの入力ストリームは XMLかもしれないしJSONかもしれないので(私の場合はしばしばAMFだったりするのでなおさら事情が複雑だ)、そういう手段でいっぺんに解決することは出来ず悩ましいところだ。
で、しょうがないから ActiveRecordで水際正規化を行うようにした。改行コードの正規化は NKFで出来る。
仕方ないので正規化を試みるのだが、このデータが様々な内部処理を通ってバックエンドに伝達されていく(またはその逆の)ことを考えるとこういうものはなるべくUIに近い側で早めに正規化されるのが筋だ。
UIからの入力が x-www-form-urlencoded しかないのならばフレームワークの入力フィルタみたいなやつ(Railsでどうやるのか知らないけど、どうせあるんだろそういうの?)で全部のパラメータ値に改行コード正規化をかけるみたいなことも(乱暴だけど)出来るだろうが、今日びの入力ストリームは XMLかもしれないしJSONかもしれないので(私の場合はしばしばAMFだったりするのでなおさら事情が複雑だ)、そういう手段でいっぺんに解決することは出来ず悩ましいところだ。
で、しょうがないから ActiveRecordで水際正規化を行うようにした。改行コードの正規化は NKFで出来る。
NKFのオプションを変えれば改行コードのみならず日本語文字コードの正規化も行う事が出来るだろうが、本当にここでそれをやって良いのかよく考えてからそうするべきだろう。
require 'nkf'
# ありがちな例でブログのエントリだとおもいねえ
class BlogEntry < ActiveRecord::Base
# 例えば body(本文)の改行コードを常に正規化する
def body=(body)
self[:body] = body && NKF.nkf('-dm0xWw',body)
end
end

0 件のコメント:
コメントを投稿
<< ホーム