先週に引き続き古い Web アプリを Ruby2.0 対応(一番最近のコミットが2010年の11月だった)。今回は Sinatra。
で、スクリプトのエンコードを UTF-8 にして、require 'jcode'
を消して、などと一通り修正して完了。無事動くようになったんだけど、日本語を含む URL のときにタイトルのエラーが発生した。しかも、どうもアプリじゃなくて Rack の中で起きているらしい。
こんなのどうすりゃいいんだよ、と思いながらググってみたらずばりそのもののページを見つけた。
cf. Sinatra が ”invalid byte sequence in Windows-31J” でエラーページを表示しない(@Windows) – Qiita
どうやら、Rack は外から来る文字列のエンコーディングを Encoding.default_external の値だとして変換するらしい。で、その Encoding.default_external の値が Windows-31J なわけだ。でも実際は UTF-8 の文字列だから変換中にエラーが発生する、と。
というわけで、app.rb の中に1行追加した。
Encoding.default_external = 'utf-8'
上記のページでは config.ru の中に追加してるけど、こっちのほうがいいような気がする。気のせいかもしれないけど。
さて、これでめでたく日本語が入ってても動くようになった。