nantekkotai's blog

おもに技術とお仕事に関連することを書いています。

Sinatra on Google App Engineで日本語文字化け問題を解決

今回解決したのは以下二点。
1)appengine-jrubyでdatastoreにputしたら文字化け!
2)POSTされた日本語文字列をsplitで一文字ずつ分割しようとしたら正しく分けてくれない!

datastoreへのputで日本語文字化け問題を解決

とりあえずどっかにあったサンプルのguestbook.rbにパッチを追加しました。これで無事解決です。

require 'rubygems'
require 'sinatra'
require 'haml'
require 'dm-core'

# 以下がパッチです
module AppEngine
  module Datastore
    def Datastore.ruby_to_java(value)
      if SPECIAL_RUBY_TYPES.include? value.class
        value.to_java
      else
        case value
        when Fixnum
          java.lang.Long.new(value)
        when Float
          java.lang.Double.new(value)
        when String
          java.lang.String.new(value)
        else
          value
        end
      end
    end
  end
end

#あとはサンプル通り
DataMapper.setup(:default, "appengine://auto")

class Shout
  include DataMapper::Resource
  
  property :id, Serial
  property :message, Text
end

set :haml, {:format => :html5, :escape_html => true}

get '/' do
  @shouts = Shout.all
  haml :index
end

post '/' do
  shout = Shout.create(:message => params[:message])
   redirect '/'
end

appengine上で日本語を正しくsplit

もうひとつやりたかったことは日本語の分割。普通はString.split(//)で分割するが、そのままやるとわけわからん文字になる。文字コードをちゃんと指定しないといけない。というわけで以下のコードを追加する。

require 'jcode'
$KCODE = 'UTF-8'
...
#例えばPOSTされた文字列を分割して表示
post '/split' do
  str = params[:messange]
  str.split(//).join(',')  # => もし文字列が「日本語」なら「日」「本」「語」と分割される
end

てかむっちゃ基本のキや・・・orz
こんなことに躓いていて @shin1ogawa さんに声をかけてもらったり。いやはやお恥ずかしい限りです。でもまあ、無事解決したので、試しに転置インデックスで全文検索が出来るかどうか、ちょっくらやってみたいと思います。