Ruby 1.8.x + twitter_oauth + SJIS で Incorrect signature が出る

Windows 上で Ruby 1.8.x で twitter_oauth を使って、SJISソースコードを書いて、-Ks オプションを付けて Client#update やら Client#update_profile あたりのメソッドを呼ぶコードを実行させると、文字列によっては Incorrect Signature というエラーが出て動かないことがある。例えば、

hoge = TwitterOAuth::Client.new( .... )

hoge.update('表1'.toutf8)

というコードの update の部分は、一見ちゃんと動きそうなのに、-Ks オプションを付けると Incorrect Signature が出て動かない。しかし、なぜか -Ks オプションを付けなければ動く。またソースコードUTF-8 で書いて -Ku オプションを付けて動かせば動く。

散々調べた挙句、ruby/lib/gems 以下のどこか(インストールの状態によって違う)にある oauth-0.4.1/oauth/lib/oauth/oauth.rb の中にある、

RESERVED_CHARACTERS = /[^a-zA-Z0-9\-\.\_\~]/

このコードを

RESERVED_CHARACTERS = /[^a-zA-Z0-9\-\.\_\~]/u

このように書き換えれば動くことが分かった。どうも正規表現の評価をするときに、-Ks オプションが何らかの悪さをしているらしい。結果的に espace に失敗して、oauth_signature を正しく生成できず、Incorrect Signature とか言われていたようだ。SJIS を使うのが悪いってのは同意だけど、それにしてもこりゃー分からんわ。

ちなみに update_profile のほうは twitter_oauth 側にバグがあって、これをやっても動かない。ちゃんと動くようにするには、twitter_oauth-0.4.0/lib/twitter_oauth/account.rb の中にある、

post('/account/update_profile', params)

このコードを

post('/account/update_profile.json', params)

このように修正すれば動く。すでにバグ報告はされてるみたいだけど、どうも最新リリースでも修正されなかったみたい。