Ruby
Rails
Mac

rails cで日本語が通らないときの直し方

More than 5 years have passed since last update.

Macで漫然とRubyをインストールすると、rails consoleやirbで日本語を使えないことがある。(どうなるかというと、日本語の変換を確定した途端に「\U+FFE3\U+FFAB」みたいにUnicodeのエスケープっぽいものが表示される。)そうなった時の直し方を説明する。


なぜ日本語を使えないのか

大雑把に言うと、Macに付属しているコマンドライン処理のライブラリ(libedit)が日本語に対応していないから。これを使わず、libreadlineを使うようにすれば直る。


誰がlibeditを使っているのか

Rubyをインストールしたディレクトリのどこかにあるreadline.bundleが使っている。findコマンドを使えば見つけられる。例えば、rbenvを使ってRubyをインストールしたなら、下のコマンドで見つかるだろう。

$ find ~/.rbenv/versions -name readline.bundle

例として、ここでは下のパスにreadline.bundleがあったものとする。

~/.rbenv/versions/1.9.3-p194/lib/ruby/1.9.1/x86_64-darwin11.3.0/readline.bundle


readlineをインストールする

homebrewやmacportでインストールすればいい。例えば、homebrewなら下のようにする。

$ brew install readline


どうやってreadlineを使わせるのか

install_name_toolというコマンドを使う。readline.bundleというのはライブラリのエイリアスみたいなもので、別の場所にある実体を参照しているだけである。よって、install_name_toolでreadline.bundleにreadlineを使わせればいい。同時に、libeditから切り離す必要もある。

install_name_toolを実行するには、readlineとlibeditの正確なパスを知る必要がある。readlineのライブラリファイルは下のようなパスにインストールされたはずだ。

/usr/local/Cellar/readline/(readlineのバージョン)/lib/libreadline.dylib

例えばreadline-6.2.4をインストールしたなら、下のようになる。

/usr/local/Cellar/readline/6.2.4/lib/libreadline.dylib


libeditはどこにあるのか

otoolというコマンドで知ることができる。otoolはLinuxにおけるlddの役割を果たす。つまり、readline.bundleが参照している実体を調べられる。今回の例なら、下のように実行すればいい。

$ otool -L ~/.rbenv/versions/1.9.3-p194/lib/ruby/1.9.1/x86_64-darwin11.3.0/readline.bundle

するとlibedit.dylibのパスが表示される。ここでは以下のように表示されたとする。

/usr/lib/libedit.3.dylib

このlibeditとreadline.bundle別れさせ、libreadlineとくっつければいい。


install_name_tool

いよいよ大詰め。install_name_toolではダイナミックライブラリに関する様々な操作が可能だが、今回は-changeというオプションで参照先の変更を行う。文法は下の通り。

$ install_name_tool -change 削除するパス 新しいパス bundleファイル

今回の例なら下のようになる。

$ install_name_tool -change /usr/lib/libedit.3.dylib /usr/local/Cellar/readline/6.2.4/lib/libreadline.dylib ~/.rbenv/versions/1.9.3-p194/lib/ruby/1.9.1/x86_64-darwin11.3.0/readline.bundle

これでrails cなりirbなり起動してみればいい。日本語を入力すればその通りに表示されるはずである。