ruby: 2008年11月アーカイブ

 メイドめーるでは日本語のメールを送信するために、 ヽ( ・∀・)ノくまくまー(07-31[長年日記])で書いていただいている、Iso2022jpMailerを使っています。
クラスを継承するだけでつかえるとてもいいアイデアだったのですが、たった一つ問題が。

IMGP8827.JPG

「~」が文字化けするのです。普通のアプリケーションだったら、まあ横棒でいいか、とか言えるし、実際メイドめーるも今日までそうやってごまかしてきたのですけど。萌え萌えなメイドさんがメールをくれるアプリケーションにおいて「~」がつかえないと言うことは、「おはようございます~」がつかえないことになってしまいます。
「おはようございますー」と「おはようございます~」は断じて違うのです!

とまあそんなわけで、技術的に追求した結果、一応「~」が出せるようになりましたのでご報告です。

IMGP8828.JPG

やり方としては、Iso2022jpMailer の

   @mail.body = NKF::nkf('-j', @mail.body)
の部分を
   @mail.body = NKF::nkf('-Wxm0 --oc=ISO-2022-JP-1', @mail.body)
に置き換えます。
ついでに、タイトルとかに「~」がはいることもあるだろうから、
      text = NKF.nkf('-j -m0', text)
も、
      text = NKF.nkf('-Wxm0 --oc=ISO-2022-JP-1', text)
にしちゃいました。

技術的な話

正直に言うと、なんでこれで化けないのか、最終的な理由は理解できていません。
ただ、あれこれやっているうちに、化ける時と化けない時があって、比較するとこうなっていることが分りました。

wave_on_jis.PNG

上がうまくいく場合で、下が駄目な場合です。日本語メールなのでJISコードでエンコードしてあります。
OKな時は1B 24 42で始まっていて、駄目な時は1B 24 48で始まる...、つまり、JIS X 0208-1983でエンコードしてあればOKで、JIS X 0212-1990だと駄目なことが分ります。
NKFのコマンド詳細を見ながら、irbでいろいろやってみると。

>> NKF::nkf('-jWxm0', "~").each_byte{|b| print b.to_s(16)+","};print "\n"
1b,24,28,44,22,37,1b,28,42,
=> nil
>>NKF::nkf('-Wxm0 --oc=ISO-2022-JP', "~").each_byte{|b| print b.to_s(16)+","};print "\n"
1b,24,28,44,22,37,1b,28,42,
=> nil
>> NKF::nkf('-Wxm0 --oc=ISO-2022-JP-1', "~").each_byte{|b| print b.to_s(16)+","};print "\n"
1b,24,42,21,41,1b,28,42,
=> nil
>> NKF::nkf('-Wxm0 --oc=ISO-2022-JP-3', "~").each_byte{|b| print b.to_s(16)+","};print "\n"
1b,24,28,50,28,37,1b,28,42,
=> nil
--oc=ISO-2022-JP-1の時だけ、ねらい通りの変換をしてくれるようです。ということで、Iso2022jpMailerにも、同じ引数を渡してあげると、「~」が出るようになった次第。
「ISO-2022-JP-1」って、JIS X 0212に対応させるための引数で。むしろ逆のような気がするし、なんでISO-2022-JP-3で駄目なのかも謎です。


Mextractrに関する注目が集まっているので、自分が使っているライブラリを公開します。

mextractr_webapi.rb

#RubyForgeのプロジェクトは今申請中なので、gemはちょっとお待ちくださいませ。

使い方としては、APIキーを取得して、
$ script/console
Loading development environment (Rails 2.0.2)
>> require "mextractr_webapi"	
>> mextractr = MextractrWebApi.new(MEXTRACTR_KEY)
>> res = mextractr.parse("11/27(木)、京都市中京区のはてな京都オフィスでShibuya Perl Mongersテクニカルトークのパブリックビューイングが開催されます。")
>> pp res
{"id"=>"20081127_0001",
 "updated"=>"2008-11-27T10:05:38+09:00"
 "response"=>
  "\n\n  Mextractr WebAPI results\n  2008-11-27T10:05:38+09:00\n  \n    Mextractr\n  \n  20081127_0001\n  \n    \n    20081127_0001\n    extracted event metadata\n    \n      Mextractr WebAPI\n    \n    2008-11-27T10:05:38+09:00\n    11/27(木)、京都市中京区のはてな京都オフィスでShibuya Perl Mongersテクニカルトークのパブリックビューイングが開催されます。\n    \n    \n    \n  \n\n",
 "content"=>
  "11/27(木)、京都市中京区のはてな京都オフィスでShibuya Perl Mongersテクニカルトークのパブリックビューイングが開催されます。",
 "where"=>
  [{"georss:point"=>nil, "valueString"=>"木)、京都市中京区"},
   {"georss:point"=>nil, "valueString"=>"京都"}],
 "when"=>[{"valueString"=>"11/27(木)", "startTime"=>"2008-11-27"}],
 }
という具合です。
res['when'][0]['startTime']とか、res['where'][0]['valueString']という具合で各値を取り出すことが出来ます。

あと、MextractrWebApi.new(MEXTRACTR_KEY)の二つ目の引数にloggerを渡すと、取得してきたatomの内容とかを見ることが出来るので、挙動がおかしい時に犯人を突き止める一助になります。


このアーカイブについて

このページには、 2008年11月 以降に書かれたブログ記事のうち ruby カテゴリに属しているものが含まれています。

前のアーカイブは ruby: 2008年9月 です。

次のアーカイブは ruby: 2008年12月 です。

最近のコンテンツは インデックスページ で見られます。過去に書かれたものは アーカイブのページ で見られます。

Powered by
Movable Type