Hatena::Groupruby

usualomaの日記 このページをアンテナに追加 RSSフィード

2009-04-15

FireWatirでテキストフィールドへ日本語を挿入するパッチ

| 22:58 | FireWatirでテキストフィールドへ日本語を挿入するパッチ - usualomaの日記 を含むブックマーク はてなブックマーク - FireWatirでテキストフィールドへ日本語を挿入するパッチ - usualomaの日記 FireWatirでテキストフィールドへ日本語を挿入するパッチ - usualomaの日記 のブックマークコメント

FireWatirでの日本語挿入

依存しているJSShでマルチバイト文字を扱えないことが原因で、FireWatirではテキストフィールドへ日本語を挿入すると文字化けを起こしてしまします。

# パッチ前
ff.text_field(:name, "q").value = ""
ff.text_field(:name, "q").value == "" # => false
# パッチ前
ff.text_field(:name, "q").set("")
ff.text_field(:name, "q").value == "" # => false

※クリップボードを介するなどの工夫をすることで文字化けを起こさず挿入することができるようです。

d:id:transparency1979:20081221


このパッチの内容と解決された点

このパッチをあてると「value=」で値が挿入される際に、「rubyURIエンコードしたデータをJavaScriptでデコードする」とよう処理を挟むようになります。これによりJSSh上を日本語が直接流れることがなくなるため、文字化けを起こさずに日本語を挿入することができるようになります。

# パッチ後
ff.text_field(:name, "q").value = ""
ff.text_field(:name, "q").value == "".toutf8 # => true

またこの際、文字コードはFirefox側でドキュメントのものに合わせて自動で変換されるので、スクリプト側で文字コードを合わせる必要はありません。

※後述しますが、JavaScript的には一度UTF-8にする必要があるので、UTF-8以外の文字列が渡された場合は自動でUTF-8への変換を行います。


パッチとパッチを適用したgem

パッチ

gem

直接インストールすることもできます。

> gem install firewatir --source http://tec.toi-planning.net/ruby

※JSShのインストールなど、FireWatirが動作する基本的な環境は別途整える必要があります。


このパッチで解決されていない点

「value=」の場合はこのパッチで対応できたのですが「set」に関しては事情が異なり、一字ずつキーを押して入力していくような実装になっていて、日本語の入力をどのように対応させるべきかも難しいところなので、今回は対応をしていません。

# パッチ後
ff.text_field(:name, "q").set("")
ff.text_field(:name, "q").value == "" # => false

文字コードに関する仕様

このパッチではJavaScriptのdecodeURIComponentを利用しているのですが、decodeURIComponentはデコード対象となる文字列をUTF-8の文字列をURIエンコードされたものとして解釈します。また例えばShift_JISの文字列をURIエンコードして渡しても、文字化けではなく単に空文字列に変換されます。

ここから仕様として、「valueへはUTF-8を代入する必要があります」ということでもよいかもしれないのですが、

ff.text_field(:name, "q").value = str.toutf8 # 必ず UTF-8 の文字列を代入

Shift_JIS の文字列を入れて空白になるだけでは寂しいので、そのような場合は内部でUTF-8へと変換し、日本語として正しく解釈されるようにしています。

ff.text_field(:name, "q").value = str.tossjis # これでも動作して欲しい

任意の文字コードからUTF-8への変換方法(課題)

前述の仕様を実現するためには「任意の文字コードからUTF-8への変換」をする必要があるのですが、現状では以下のような順序で変換方法を決めています。

  • "".encode('UTF-8')が使えればこれを使い変換する。(1.9以降の場合)
  • "".toutf8が使えればこれを使い変換する。(KconvUTF-8に対応できる場合)
  • いずれも使えなければ変換しない。

当方の経験が浅いため、この流れが適切なのか確信のもてない部分があるのですが、このようなケースに関してはベストプラクティスのようなものはあったりするのでしょうか。もしよろしければコメントなどを頂けるとありがたいです。

※このパッチでは1.9以降の対応も視野に入れたいと考えているのですが、現状のFireWatirは1.9では動作しないようです


今後の展望

課題がクリアーでき、その他の動作にも問題がなければ開発元へも投げてみようと思っています。仕様についてなど、何かありましたらコメントなどを頂ければありがたいです。


参考にしたページ

JavaScriptのdecodeURIComponentに対応するrubyのencodeURIComponentを作成する際に参考にしました。

http://rubyist.g.hatena.ne.jp/edvakf/20090226

http://diaspar.jp/node/148

OscarOscar 2012/10/25 15:48 I really appreciate free, succinct, rleibale data like this.

imdkzaqduimdkzaqdu 2012/10/26 08:21 IIZBbv <a href="http://lpeusrakrows.com/">lpeusrakrows</a>

bbctamxeubbctamxeu 2012/10/27 04:07 XFSYZj , [url=http://wpllzkofhplt.com/]wpllzkofhplt[/url], [link=http://lteviicnqjtg.com/]lteviicnqjtg[/link], http://sroilzjayoor.com/

gxhemzuiavgxhemzuiav 2012/10/27 10:30 9BtY1I <a href="http://alyqesmhdlkm.com/">alyqesmhdlkm</a>

ゲスト