Sinatraで”invalid byte sequence in Windows-31J”

先週に引き続き古い 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 の中に追加してるけど、こっちのほうがいいような気がする。気のせいかもしれないけど。

さて、これでめでたく日本語が入ってても動くようになった。

コメントを残す

メールアドレスが公開されることはありません。 が付いている欄は必須項目です

このサイトはスパムを低減するために Akismet を使っています。コメントデータの処理方法の詳細はこちらをご覧ください